PHP PDO扩展怎么用?

文章导读
上一个 测验 下一个 PDO 是 PHP Data Objects 的缩写。PHP 可以与大多数关系型数据库以及 NoSQL 数据库进行交互。默认的 PHP 安装已经包含了特定供应商的数据库扩展并已启用。除了针对特定类型数据库的数据库驱动(如用于 MySQL 的 mysql
📋 目录
  1. PDO 连接
  2. PDO 类方法
A A

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