PHP – PDO 扩展



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 调用接口
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

此方法关闭自动提交模式。因此,您需要调用 commit() 方法才能对数据库进行持久性更改。调用 rollBack() 将回滚对数据库的所有更改并将连接返回到自动提交模式。此方法在成功时返回 true,失败时返回 false。

PDO::commit

commit() 方法提交事务。

public PDO::commit(): bool

由于 BeginTransaction 禁用了自动提交模式,因此您应该在事务后调用此方法。它提交事务,将数据库连接返回到自动提交模式,直到下次调用 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

如果数据库设置为自动提交模式,则此函数将在回滚事务后恢复自动提交模式。

请注意,包括 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脚本获取学生表中的所有记录:

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