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