PHP – PDO 扩展


PDO 是 PHP 数据对象的首字母缩写词。PHP 可以与大多数关系数据库和 NOSQL 数据库进行交互。默认 PHP 安装附带已安装并启用特定于供应商的数据库扩展。除了特定于某种类型数据库的数据库驱动程序(例如 MySQLmysqli 扩展)之外,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 数据库交互,请确保通过删除前导分号来取消注释以下行。

 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 "已成功连接到 $dbName 数据库";  
   } catch(Exception $e){  
      echo "连接失败" . $e->getMessage();  
   }
?>

它将产生以下输出 -

已成功连接myDB数据库

如果出现错误 -

连接失败QLSTATE[HY000][1049]未知数据库“mydb”

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 TABLECREATE 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();  
   }  
?>