ZetCode

PHP PDO 驱动接口

最后修改于 2025 年 4 月 19 日

PHP 中的 PDO Driver 接口为数据库驱动程序提供了一个一致的 API。它定义了数据库特定 PDO 驱动程序必须实现的各种方法。

基本定义

PDO_Driver 接口是所有 PDO 驱动程序实现的基础。它规定了数据库连接和操作所需的方法。

实现此接口的驱动程序必须提供连接处理、查询执行和事务支持。它们将 PDO 调用转换为数据库特定的操作。

PDO 驱动程序连接示例

这演示了如何使用 PDO 驱动程序连接到 MySQL。

pdo_driver_connect.php
<?php

declare(strict_types=1);

try {
    $dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
    $options = [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ];
    
    $pdo = new PDO($dsn, 'username', 'password', $options);
    echo "Connected using PDO driver";
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

这使用 MySQL PDO 驱动程序建立连接。DSN 指定了驱动程序(mysql)、主机、数据库和字符集。选项配置了错误处理和获取模式。

PDO 驱动程序查询执行

演示了通过 PDO 驱动程序接口执行查询。

pdo_driver_query.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $result = $pdo->query("SELECT COUNT(*) FROM users");
    $count = $result->fetchColumn();
    
    echo "Total users: " . $count;
} catch (PDOException $e) {
    echo "Query failed: " . $e->getMessage();
}

这通过 PDO 驱动程序执行了一个简单的 count 查询。query 方法返回一个 statement 对象。fetchColumn 从第一列检索单个值。

PDO 驱动程序预处理语句

展示了如何在 PDO 驱动程序接口中使用预处理语句。

pdo_driver_prepared.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('sqlite:/path/to/database.db');
    $stmt = $pdo->prepare("INSERT INTO products (name, price) VALUES (?, ?)");
    
    $products = [
        ['Laptop', 999.99],
        ['Phone', 699.99],
        ['Tablet', 399.99]
    ];
    
    foreach ($products as $product) {
        $stmt->execute($product);
    }
    
    echo "Products inserted successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这使用 SQLite PDO 驱动程序和预处理语句。prepare 方法创建了一个语句模板。execute 使用不同的参数集运行它。

PDO 驱动程序事务

演示了通过 PDO 驱动程序接口进行事务处理。

pdo_driver_transaction.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('pgsql:host=localhost;dbname=testdb', 'user', 'pass');
    $pdo->beginTransaction();
    
    $pdo->exec("UPDATE accounts SET balance = balance - 50 WHERE id = 1");
    $pdo->exec("UPDATE accounts SET balance = balance + 50 WHERE id = 2");
    
    if (/* some condition */) {
        $pdo->commit();
        echo "Transaction completed";
    } else {
        $pdo->rollBack();
        echo "Transaction rolled back";
    }
} catch (PDOException $e) {
    $pdo->rollBack();
    echo "Transaction failed: " . $e->getMessage();
}

这展示了 PostgreSQL PDO 驱动程序的事务处理。beginTransaction 启动事务。commit/rollBack 完成或取消事务。所有操作都变得原子化。

PDO 驱动程序获取模式

说明了 PDO 驱动程序提供的各种获取模式。

pdo_driver_fetch.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('oci:dbname=//:1521/mydb', 'user', 'pass');
    
    // Fetch as object
    $stmt = $pdo->query("SELECT * FROM employees");
    $stmt->setFetchMode(PDO::FETCH_OBJ);
    
    while ($employee = $stmt->fetch()) {
        echo $employee->name . "\n";
    }
    
    // Fetch into custom class
    class Employee {
        public $id;
        public $name;
        public $department;
    }
    
    $stmt = $pdo->query("SELECT * FROM employees");
    $employees = $stmt->fetchAll(PDO::FETCH_CLASS, 'Employee');
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这演示了 Oracle PDO 驱动程序的获取模式。FETCH_OBJ 返回 stdClass 对象。FETCH_CLASS 将结果映射到自定义类的实例。不同的驱动程序支持相同的、一致的接口。

PDO 驱动程序错误处理

展示了使用 PDO 驱动程序的错误处理技术。

pdo_driver_error.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    // This will throw an exception
    $pdo->query("SELECT * FROM non_existent_table");
} catch (PDOException $e) {
    echo "Error Code: " . $e->getCode() . "\n";
    echo "Error Message: " . $e->getMessage() . "\n";
    echo "Driver-specific Error Code: " . $e->errorInfo[1] . "\n";
    echo "Driver-specific Error Message: " . $e->errorInfo[2] . "\n";
}

这演示了使用 MySQL PDO 驱动程序的全面错误处理。异常同时提供了 PDO 和特定于驱动程序的错误信息。errorInfo 数组包含来自驱动程序的详细错误数据。

PDO 驱动程序元数据

展示了如何通过 PDO 驱动程序检索数据库元数据。

pdo_driver_metadata.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
    
    // Get driver name
    echo "Driver: " . $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) . "\n";
    
    // Get server version
    echo "Server version: " . $pdo->getAttribute(PDO::ATTR_SERVER_VERSION) . "\n";
    
    // List tables
    $tables = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
    echo "Tables:\n";
    print_r($tables);
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这使用 MySQL PDO 驱动程序检索元数据。getAttribute 访问特定于驱动程序的属性。查询显示了特定于数据库的元数据命令,同时使用了标准的 PDO 接口。

最佳实践

来源

PHP PDO 文档

本教程介绍了 PDO Driver 接口,并通过示例展示了不同的数据库驱动程序如何实现相同的一致 API。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP PDO 函数