PDO 是 PHP 数据对象的首字母缩写词。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 and win32 ODBC) |
PDO_PGSQL | PostgreSQL |
PDO_SQLITE | SQLite 3 and SQLite 2 |
PDO_SQLSRV | Microsoft SQL Server / SQL Azure |
默认情况下,PDO_SQLITE 驱动程序在 php.ini 的设置中启用,因此如果您希望使用 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 "已成功连接到 $dbName 数据库";
} catch(Exception $e){
echo "连接失败" . $e->getMessage();
}
?>
它将产生以下输出 -
如果出现错误 -
PDO 类方法
PDO 类定义以下静态方法 -
PDO::beginTransaction
获取 connection 对象后,您应该调用此方法以启动事务。
public PDO::beginTransaction(): bool
此方法将关闭 autocommit 模式。因此,您需要调用 commit() 方法来对数据库进行持久更改调用 rollBack() 将回滚对数据库的所有更改,并将连接返回到 autocommit 模式。此方法在成功时返回 true,在失败时返回 false。
PDO::commit
commit() 方法提交事务。
public PDO::commit(): bool由于 BeginTransaction 禁用了自动提交模式,因此您应该在事务之后调用此方法。它提交一个事务,将数据库连接返回到 autocommit 模式,直到下一次调用 PDO::beginTransaction() 开始新事务。此方法在成功时返回 true,在失败时返回 false。
PDO::exec
exec() 方法执行 SQL 语句并返回受影响的行数
public PDO::exec(string $statement): int|false
exec() 方法在单个函数调用中执行 SQL 语句,返回受该语句影响的行数。
请注意,它不会返回 SELECT 语句的结果。如果你有一个 SELECT 语句,在你的程序中只执行一次,请考虑发出 PDO::query()。
另一方面,对于需要多次发出的语句,使用 PDO::p repare() 准备一个 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 模式。
请注意,当在事务中发出 DDL 语句(如 DROP TABLE 或 CREATE TABLE)时,某些数据库(包括 MySQL)会自动发出隐式 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 "已成功连接到$dbName数据库";
$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 "表已创建\n";
}
catch(Exception $e){
echo "连接失败 : " . $e->getMessage();
}
?>
例子
使用以下代码在上例中创建的 student 表中插入新记录 -
<?php
$dsn="localhost";
$dbName="myDB";
$username="root";
$password="";
try {
$conn= new PDO("mysql:host=$dsn;dbname=$dbName",$username,$password);
echo "已成功连接到 $dbName 数据库";
$sql = "INSERT INTO STUDENT values(1, 'Raju', 60)";
$conn->exec($sql);
$conn->commit();
echo "插入的记录\n";
} catch(Exception $e){
echo "连接失败 : " . $e->getMessage();
}
?>
例子
以下 PHP 脚本获取 student 表中的所有记录 -
<?php
$dsn="localhost";
$dbName="myDB";
$username="root";
$password="";
try {
$conn= new PDO("mysql:host=$dsn;dbname=$dbName",$username,$password);
echo "已成功连接到$dbName数据库";
$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 "连接失败: " . $e->getMessage();
}
?>