PHP PDO 驱动接口
最后修改于 2025 年 4 月 19 日
PHP 中的 PDO Driver 接口为数据库驱动程序提供了一个一致的 API。它定义了数据库特定 PDO 驱动程序必须实现的各种方法。
基本定义
PDO_Driver 接口是所有 PDO 驱动程序实现的基础。它规定了数据库连接和操作所需的方法。
实现此接口的驱动程序必须提供连接处理、查询执行和事务支持。它们将 PDO 调用转换为数据库特定的操作。
PDO 驱动程序连接示例
这演示了如何使用 PDO 驱动程序连接到 MySQL。
<?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 驱动程序接口执行查询。
<?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 驱动程序接口中使用预处理语句。
<?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 驱动程序接口进行事务处理。
<?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 驱动程序提供的各种获取模式。
<?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 驱动程序的错误处理技术。
<?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 驱动程序检索数据库元数据。
<?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 接口。
最佳实践
- 特定于驱动程序的选项:请查阅每个驱动程序的文档。
- 连接池:一些驱动程序通过属性支持连接池。
- 字符集:在 DSN 中设置或连接后立即设置。
- 错误处理:为保持一致性,请始终使用异常。
- 可移植性:尽可能坚持使用标准 SQL。
来源
本教程介绍了 PDO Driver 接口,并通过示例展示了不同的数据库驱动程序如何实现相同的一致 API。
作者
列出 所有 PHP PDO 函数。