Php 简明教程

PHP – PDO Extension

PDO 是 PHP 数据对象 (PHP Data Objects) 的缩写。PHP 可以与大多数关系型和 NOSQL 数据库进行交互。默认的 PHP 安装附带已安装和启用的特定供应商的数据库扩展。除了适用于特定类型数据库的此类数据库驱动程序(例如适用于 MySQL 的 mysqli 扩展)之外,PHP 还支持抽象层,例如 PDO 和 ODBC。

PDO 扩展定义了一个轻量级的、一致的接口,用于在 PHP 中访问数据库。每个特定供应商扩展的功能不同于其他扩展。因此,如果你打算更改某个 PHP 应用程序的后端数据库,例如从 PostGreSql 更改为 MySQL,你需要对代码进行许多更改。另一方面,PDO API 除了指定要使用的数据库的新 URL 和凭据之外,不需要任何更改。

你当前的 PHP 安装必须具有相应的 PDO 驱动程序才能正常工作。目前使用相应的 PDO 接口支持以下数据库 −

Driver Name

Supported Databases

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 Connection

PDO 基本类的实例表示一个数据库连接。构造函数接受用于指定数据库源(称为 DSN)的参数,还可以接受用于指定用户名和密码(如果有的)的参数。

以下代码段是与 MySQL 数据库建立连接的典型方式 −

<?php
   $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>

如果出现任何连接错误,将抛出 PDOException 对象。

Example

请看以下示例:

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

它将生成以下 output

Successfully connected with myDB database

在错误的情况下 −

Connection failedSQLSTATE[HY000] [1049] Unknown database 'mydb'

PDO Class Methods

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()。

另一方面,对于你需要多次发出的语句,请准备好一个 PDOStatement 对象 (使用 PDO::prepare()),然后使用 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。

Example

以下代码在 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();
   }
?>

Example

使用以下代码在上述示例中创建的 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();
   }
?>

Example

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