PHP PDO 扩展
PDO 是 PHP Data Objects 的缩写。PHP 可以与大多数关系型数据库以及 NoSQL 数据库进行交互。默认的 PHP 安装已经包含了特定供应商的数据库扩展并已启用。除了针对特定类型数据库的数据库驱动(如用于 MySQL 的 mysqli 扩展)之外,PHP 还支持诸如 PDO 和 ODBC 等抽象层。
PDO 扩展为在 PHP 中访问数据库定义了一个轻量级、一致的接口。每个特定供应商扩展的功能都各不相同。因此,如果您打算更改某个 PHP 应用程序的后端数据库,例如从 PostgreSQL 更改为 MySQL,则需要对代码进行大量修改。另一方面,PDO API 除了指定要使用的新数据库的 URL 和凭据之外,不需要任何更改。
您当前的 PHP 安装必须具有相应的 PDO 驱动程序可用才能工作。目前支持以下数据库及其对应的 PDO 接口 −
| 驱动名称 | 支持的数据库 |
|---|---|
| PDO_CUBRID | Cubrid |
| PDO_DBLIB | FreeTDS / Microsoft SQL Server / Sybase |
| PDO_FIREBIRD | Firebird |
| PDO_IBM | IBM DB2 |
| PDO_INFORMIX | IBM Informix Dynamic Server |
| PDO_MYSQL | MySQL 3.x/4.x/5.x/8.x |
| PDO_OCI | Oracle Call Interface |
| PDO_ODBC | ODBC v3 (IBM DB2, unixODBC 和 win32 ODBC) |
| PDO_PGSQL | PostgreSQL |
| PDO_SQLITE | SQLite 3 和 SQLite 2 |
| PDO_SQLSRV | Microsoft SQL Server / SQL Azure |
默认情况下,PDO_SQLITE 驱动在 php.ini 的设置中已启用,因此如果您希望使用 PDO 与 MySQL 数据库交互,请确保通过删除前导分号来取消注释以下行。
extension=pdo_mysql
您可以通过调用 PDO 类中的静态函数 PDO::getAvailableDrivers() 来获取当前可用的 PDO 驱动列表。
PDO 连接
PDO 基类的实例代表一个数据库连接。其构造函数接受用于指定数据库源(称为 DSN)的参数,以及可选的用户名和密码(如果有)。
以下片段是与 MySQL 数据库建立连接的典型方式 −
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
如果发生任何连接错误,将抛出 PDOException 对象。
示例
查看以下示例 −
<?php
$dsn="localhost";
$dbName="myDB";
$username="root";
$password="";
try{
$dbConn= new PDO("mysql:host=$dsn;dbname=$dbName",$username,$password);
Echo "Successfully connected with $dbName database";
} catch(Exception $e){
echo "Connection failed" . $e->getMessage();
}
?>
它将产生以下输出 −
Successfully connected with myDB database
在发生错误的情况下 −
Connection failedSQLSTATE[HY000] [1049] Unknown database 'mydb'
PDO 类方法
PDO 类定义了以下静态方法 −
PDO::beginTransaction
获取连接对象后,您应该调用此方法来启动一个事务。
public PDO::beginTransaction(): bool
此方法会关闭 autocommit 模式。因此,您需要调用 commit() 方法来使对数据库的更改持久化。调用 rollBack() 将回滚对数据库的所有更改,并将连接恢复到 autocommit 模式。此方法成功时返回 true,失败时返回 false。
PDO::commit
commit() 方法提交一个事务。
public PDO::commit(): bool
由于 BeginTransaction 禁用了 autocommit 模式,您应该在事务后调用此方法。它提交事务,将数据库连接恢复到 autocommit 模式,直到下一次调用 PDO::beginTransaction() 开始新事务。此方法成功时返回 true,失败时返回 false。
PDO::exec
exec() 方法执行一个 SQL 语句并返回受影响的行数
public PDO::exec(string $statement): int|false
exec() 方法在单个函数调用中执行一个 SQL 语句,返回该语句影响的行数。
注意,它不会返回 SELECT 语句的结果。如果您的程序中只需执行一次 SELECT 语句,请考虑使用 PDO::query()。
另一方面,对于需要多次执行的语句,请使用 PDO::prepare() 准备一个 PDOStatement 对象,然后使用 PDOStatement::execute() 执行语句。
exec() 方法需要一个字符串参数,表示要准备和执行的 SQL 语句,并返回由您发出的 SQL 语句修改或删除的行数。如果没有行受影响,PDO::exec() 返回 0。
PDO::query
query() 方法准备并执行一个不带占位符的 SQL 语句
public PDO::query(string $query, ?int $fetchMode = null): PDOStatement|false
此方法在单个函数调用中准备并执行一个 SQL 语句,将语句作为 PDOStatement 对象返回。
PDO::rollBack
rollback() 方法回滚由 PDO::beginTransaction() 启动的事务。
public PDO::rollBack(): bool
如果数据库设置为 autocommit 模式,此函数在回滚事务后将恢复 autocommit 模式。
注意,某些数据库(包括 MySQL)在事务中发出 DDL 语句(如 DROP TABLE 或 CREATE TABLE)时,会自动发出隐式 COMMIT,因此会阻止您回滚事务边界内的其他更改。此方法成功时返回 true,失败时返回 false。
示例
以下代码在 MySQL 服务器上的 myDB 数据库中创建一个 student 表。
<?php
$dsn="localhost";
$dbName="myDB";
$username="root";
$password="";
try{
$conn= new PDO("mysql:host=$dsn;dbname=$dbName",$username,$password);
Echo "Successfully connected with $dbName database";
$qry = <<<STRING
CREATE TABLE IF NOT EXISTS STUDENT (
student_id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
marks INTEGER(3),
PRIMARY KEY (student_id)
);
STRING;
echo $qry . PHP_EOL;
$conn->exec($qry);
$conn->commit();
echo "Table created\n";
}
catch(Exception $e){
echo "Connection failed : " . $e->getMessage();
}
?>
示例
使用以下代码在上述示例中创建的 student 表中插入一条新记录 −
<?php
$dsn="localhost";
$dbName="myDB";
$username="root";
$password="";
try {
$conn= new PDO("mysql:host=$dsn;dbname=$dbName",$username,$password);
echo "Successfully connected with $dbName database";
$sql = "INSERT INTO STUDENT values(1, 'Raju', 60)";
$conn->exec($sql);
$conn->commit();
echo "A record inserted\n";
} catch(Exception $e){
echo "Connection failed : " . $e->getMessage();
}
?>
示例
以下 PHP 脚本获取 student 表中的所有记录 −
<?php
$dsn="localhost";
$dbName="myDB";
$username="root";
$password="";
try {
$conn= new PDO("mysql:host=$dsn;dbname=$dbName",$username,$password);
echo "Successfully connected with $dbName database";
$sql = "SELECT * from student";
$statement = $conn->query($sql);
$rows = $statement->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
var_dump($row);
}
} catch(Exception $e){
echo "Connection failed : " . $e->getMessage();
}
?>