PHP – PDO Extension

PDO là viết tắt của PHP Data Objects. PHP có thể tương tác với hầu hết các cơ sở dữ liệu quan hệ cũng như cơ sở dữ liệu NOSQL. Cài đặt PHP mặc định đã đi kèm với các tiện ích mở rộng cơ sở dữ liệu cụ thể của nhà cung cấp đã được cài đặt và kích hoạt. Ngoài các trình điều khiển cơ sở dữ liệu cụ thể cho một loại cơ sở dữ liệu nhất định, chẳng hạn như tiện ích mở rộng mysqli cho MySQL, PHP cũng hỗ trợ các lớp trừu tượng như PDO và ODBC.

Mở rộng PDO định nghĩa một giao diện nhẹ nhàng, nhất quán để truy cập cơ sở dữ liệu trong PHP. Chức năng của mỗi phần mở rộng cụ thể của nhà cung cấp khác nhau. Do đó, nếu bạn có ý định thay đổi cơ sở dữ liệu backend của một ứng dụng PHP nhất định, chẳng hạn như từ PostGreSql sang MySQL, bạn cần thực hiện rất nhiều thay đổi trong mã. Ngược lại, API PDO không yêu cầu bất kỳ thay đổi nào ngoài việc chỉ định URL và thông tin xác thực của cơ sở dữ liệu mới sẽ được sử dụng.

Cài đặt PHP hiện tại của bạn phải có trình điều khiển PDO tương ứng để có thể hoạt động. Hiện tại, các cơ sở dữ liệu sau đây được hỗ trợ với các giao diện PDO tương ứng −

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 and win32 ODBC)
PDO_PGSQL PostgreSQL
PDO_SQLITE SQLite 3 and SQLite 2
PDO_SQLSRV Microsoft SQL Server / SQL Azure

Theo mặc định, driver PDO_SQLITE được kích hoạt trong cài đặt của php.ini, vì vậy nếu bạn muốn tương tác với cơ sở dữ liệu MySQL bằng PDO, hãy đảm bảo rằng dòng sau đây không có dấu chấm phẩy ở đầu.

extension=pdo_mysql

Bạn có thể lấy danh sách các driver PDO hiện có bằng cách gọi hàm tĩnh PDO::getAvailableDrivers() trong lớp PDO.

PDO Connection

Một thể hiện của lớp cơ sở PDO đại diện cho một kết nối cơ sở dữ liệu. Bộ khởi tạo chấp nhận các tham số để chỉ định nguồn cơ sở dữ liệu (được gọi là DSN) và tùy chọn cho tên người dùng và mật khẩu (nếu có).

Đoạn mã sau đây là cách điển hình để thiết lập kết nối với cơ sở dữ liệu MySQL −

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

Nếu có bất kỳ lỗi kết nối nào, một đối tượng PDOException sẽ được ném ra.

Example

Hãy xem ví dụ sau đây −

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

Nó sẽ tạo ra output

Successfully connected with myDB database

Trong trường hợp có lỗi −

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

PDO Class Methods

Lớp PDO định nghĩa các phương thức tĩnh sau −

PDO::beginTransaction

Sau khi có được đối tượng kết nối, bạn nên gọi phương thức này để khởi động một giao dịch.

public PDO::beginTransaction(): bool

Phương thức này tắt chế độ tự động xác nhận (autocommit). Do đó, bạn cần gọi phương thức commit() để thực hiện các thay đổi bền vững đối với cơ sở dữ liệu. Gọi rollBack() sẽ hoàn tác tất cả các thay đổi đối với cơ sở dữ liệu và đưa kết nối trở lại chế độ tự động xác nhận. Phương thức này trả về true nếu thành công hoặc false nếu thất bại.

PDO::commit

Phương thức commit() thực hiện việc cam kết một giao dịch.

public PDO::commit(): bool

Vì BeginTransaction vô hiệu hóa chế độ tự động cam kết, bạn nên gọi phương thức này sau một giao dịch. Nó cam kết một giao dịch, trả lại kết nối cơ sở dữ liệu về chế độ tự động cam kết cho đến khi gọi PDO::beginTransaction() lần tiếp theo để bắt đầu một giao dịch mới. Phương thức này trả về true nếu thành công hoặc false nếu thất bại.

PDO::exec

Phương thức exec() thực thi một câu lệnh SQL và trả về số lượng hàng bị ảnh hưởng.

public PDO::exec(string $statement): int|false

Phương thức exec() thực thi một câu lệnh SQL trong một lần gọi hàm duy nhất, trả về số lượng hàng bị ảnh hưởng bởi câu lệnh đó.

Lưu ý rằng nó không trả về kết quả từ câu lệnh SELECT. Nếu bạn có một câu lệnh SELECT chỉ được thực thi một lần trong chương trình của bạn, hãy xem xét việc sử dụng PDO::query().

Mặt khác, đối với một câu lệnh mà bạn cần thực hiện nhiều lần, hãy chuẩn bị một đối tượng PDOStatement với PDO::prepare() và thực hiện câu lệnh với PDOStatement::execute().

Phương thức exec() cần một tham số kiểu chuỗi đại diện cho một câu lệnh SQL để chuẩn bị và thực thi, và trả về số lượng hàng đã được sửa đổi hoặc xóa bởi câu lệnh SQL mà bạn đã thực hiện. Nếu không có hàng nào bị ảnh hưởng, PDO::exec() sẽ trả về 0.

PDO::query

Phương thức query() chuẩn bị và thực thi một câu lệnh SQL mà không có dấu chấm hỏi.

public PDO::query(string $query, ?int $fetchMode = null): PDOStatement|false

Phương thức này chuẩn bị và thực thi một câu lệnh SQL trong một cuộc gọi hàm duy nhất, trả về câu lệnh dưới dạng đối tượng PDOStatement.

PDO::rollBack

Phương thức rollback() hoàn tác một giao dịch đã được khởi động bởi PDO::beginTransaction().

public PDO::rollBack(): bool

Nếu cơ sở dữ liệu được đặt ở chế độ tự động cam kết, chức năng này sẽ khôi phục chế độ tự động cam kết sau khi nó đã hoàn tác giao dịch.

Lưu ý rằng một số cơ sở dữ liệu, bao gồm MySQL, tự động phát hành một COMMIT ngầm định khi một câu lệnh DDL như DROP TABLE hoặc CREATE TABLE được thực hiện trong một giao dịch, và do đó, nó sẽ ngăn bạn hoàn tác bất kỳ thay đổi nào khác trong phạm vi giao dịch. Phương thức này trả về true khi thành công hoặc false khi thất bại.

Example

Đoạn mã sau tạo một bảng sinh viên trong cơ sở dữ liệu myDB trên máy chủ MySQL.

<?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

Sử dụng đoạn mã sau để chèn một bản ghi mới vào bảng sinh viên được tạo trong ví dụ trên −

<?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

Đoạn mã PHP sau đây lấy tất cả các bản ghi trong bảng sinh viên −

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