07/09/2018, 10:19

MySQLi hay PDO

Khi làm việc với cơ sở dữ liệu MySQL, PHP cung cấp cho bạn 3 gói thư viện là MySQLi , PDO và MySQL . Tuy nhiên, team phát triển PHP khuyến nghị người dùng không nên dùng MySQL trong các dự án tiếp theo vì thư viện này sẽ không còn được tiếp tục hỗ trợ phát triển từ phiên bản 5.5 và sẽ được gỡ ...

Khi làm việc với cơ sở dữ liệu MySQL, PHP cung cấp cho bạn 3 gói thư viện là MySQLi, PDOMySQL. Tuy nhiên, team phát triển PHP khuyến nghị người dùng không nên dùng MySQL trong các dự án tiếp theo vì thư viện này sẽ không còn được tiếp tục hỗ trợ phát triển từ phiên bản 5.5 và sẽ được gỡ hoàn toàn ra khỏi phiên bản PHP7. Thay vào đó, lập trình viên được khuyên nên sử dụng MySQLi hoặc PDO. Cả hai thư viện đều được hỗ trợ tich cực bởi nhóm phát triển ngôn ngữ lập trình này và các thành viên của cộng đồng. Trong bài viết này tôi sẽ đưa ra một số phân tích về điểm mạnh và yếu của việc sử dụng 2 gói thư viện này.

Kết Nối Với Database

Việc kết nối với MySQL database sử dụng cả 2 thư viện đều khá đơn giản.

Với PDO cú pháp dùng để kết nối với MySQL server sẽ như sau:

PDO kết nối với database

Ở trên khi tạo một object mới sử dụng từ khóa new, chúng ta truyền vào 3 đối số cho hàm constructor function. 3 đối số này được gọi là connection string. Đối số đầu tiên dùng để xác định loại database (là mysql), địa chỉ host của server và tên database. 2 đối số còn lại là tên user dùng để kết nối với database và mật khẩu của user này.

Lưu ý: Ngoài MySQL thì PDO còn hỗ trợ nhiều loại database khác nhau như Postgree, SQL server...

Giá trị trả về sau khi tạo object trên (được gán vào biến $DBH) được gọi là database handler và object này sẽ được dùng xuyên suốt trong quá trình kết nối với CSDL. Trong khi viết mã lệnh chúng ta cũng cần sử dụng try..catch để xử lý các trường hợp xảy ra khi kết nối với CSDL.

try {
    // PDO_MYSQL
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
} catch(PDOException $e) {
    echo $e->getMessage();
}

Với MySQLi có 2 cách viết khác nhau và bạn không cần phải chỉ ra loại database vì chúng ta chỉ có thể làm việc với MySQL khi sử dụng thư viện này:

// mysqli: procedural
$mysqli = mysqli_connect('localhost','username','password','database');

// mysqli: object oriented
$mysqli = new mysqli('localhost','username','password','database');

Ở trên đây bạn có thể thấy cả MySQLi và PDO đều cung cấp API để lập trình viên có thể viết theo cách hướng đối tượng. Ngoài ra MySQLi còn hỗ trợ cách viết theo thủ tục. Với cách viết thủ tục, những người mới học có thể dễ dàng tiếp cận với cách viết API này hơn. Tuy nhiên, với các ứng dụng lớn cách viết OOP sẽ giúp mã lệnh trở lên dễ dàng quản lý hơn.

Loại Cơ Sở Dữ Liệu Được Hỗ Trợ

Với MySQLi nó chỉ giới hạn trong việc hỗ trợ làm việc với MySQL. Còn với PDO nó hỗ trợ nhiều loại CSDL khác nhau. Dưới đây là danh sách các CSDL được hỗ trợ bởi PDO tính tới thời điểm này:

  • PDO_MYSQL ( MySQL 3.x/4.x/5.x )
  • PDO_SQLITE ( SQLite 3 and SQLite 2 )
  • PDO_PGSQL ( PostgreSQL )
  • PDO_OCI ( Oracle Call Interface )
  • PDO_IBM ( IBM DB2 )
  • PDO_FIREBIRD ( Firebird/Interbase 6 )
  • PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase )
  • PDO_INFORMIX ( IBM Informix Dynamic Server )
  • PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC and win32 ODBC) )
  • PDO_4D ( 4D )

PDO cung cấp API thống nhất cho việc kết nối với các loại cơ sở dữ liệu trên chính vì vậy việc chuyển đổi giữa các loại cơ sở dữ liệu không gây ra quá nhiều thay đổi trong mã lệnh của ứng dụng. Ngược lại với MySQLi nếu như chúng ta phải thay đổi loại CSDL thì chúng ta gần như sẽ phải viết lại toàn bộ dữ liệu cho lớp database layer.

Từ các phân tích trên, chúng ta có bảng tóm tắt so sánh các tính năng của MySQLiPDO (MySQL cũng được cho vào bảng so sánh này):

  ext/mysqli PDO_MySQL ext/mysql
Giới Thiệu Từ Phiên Bản PHP 5.0 5.1 2.0
Đóng gói trong PHP 5.x Yes Yes Yes
Trạng Thái Hỗ Trợ Active Active Maintenance only
Lifecycle Active Active Deprecated
Được Đề Xuất Sử Dụng Yes Yes No
OOP Yes Yes No
Procedural Yes No Yes
Hỗ Trợ Charsets Yes Yes Yes
Hỗ Trợ server-side Prepared Statements Yes Yes No
Hỗ Trợ client-side Prepared Statements No Yes No
Hỗ Trợ Stored Procedures Yes Yes No
Hỗ Trợ Multiple Statements Yes Most No
Hỗ Trợ Transactions Yes Yes No
Hỗ trợ tất cả các tính năng trong MySQL 5.1+ Yes Most No
0