Các kiểu kết nối cơ sở dữ liệu MySQL bằng PHP

PHP 5 và các phiên bản về sau làm việc với cơ sở dữ liệu MySQL thông qua hai phương pháp:

  • MySQLi extension (chữ i viết tắt cho từ cải tiến / improved);
  • PDO (PHP Data Objects);

Các phiên bản trước đây của PHP sử dụng MySQL extension (không có i). Tuy nhiên, phần mở rộng này không được tán thành từ năm 2012.


Vậy tôi nên sử dụng MySQLi hay PDO

Nếu bạn cần câu trả lời nhanh gọn thì đó là: “Tùy vào bạn thích cái nào hơn!”

Cả MySQLi và PDO đều có những lợi thế riêng.

PDO làm việc với 12 hệ thống cơ sở dữ liệu khác nhau, trong khi MySQLi chỉ làm việc với duy nhất hệ cơ sở dữ liệu MySQL mà thôi.

Vì vậy nếu bạn cần chuyển đổi dự án để làm việc với các hệ cơ sỡ dữ liệu khác nhau thì PDO sẽ tốt cho bạn hơn. Bạn chỉ phải thay đổi mã kết nối và vài câu truy vấn. Với MySQLi bạn phải viết lại code hoàn toàn, bao gồm cả truy vấn.

Cả hai đều hướng đối tượng nhưng MySQLi cung cấp API cho bạn.

Cả hai đều hỗ trợ Prepared Statements. Prepared Statements giúp bạn được bảo vệ khỏi các cuộc tấn công sử dụng SQL injection và điều này rất quan trọng cho các ứng dụng web cần tính bảo mật.


Các ví dụ về MySQL, bao gồm cả cú pháp của MySQLi và PDO

Trong phần này và các phần sau, chúng tôi đưa ra ba cách để làm việc với PHP và MySQL:

  • MySQLi (hướng đối tượng);
  • MySQLi (thủ tục);
  • PDO;

Cài đặt MySQLi

Dùng cho Linux và Windows: Các extension của MySQLi được cài đặt mặc định trong hầu hết các trường hợp khi gói PHP5 mysql được cài đặt.

Hướng dẫn cài đặt chi tiết, xem tại đây: http://php.net/manual/en/mysqli.installation.php

Cài đặt PDO

Hướng dẫn chi tiết xem tại đây:http://php.net/manual/en/pdo.installation.php


Mở và kết nối với MySQL

Trước khi chúng ta có quyền truy cập vào cơ sở dữ liệu MySQL, chúng ta cần kết nối với server:

Ví dụ (MySQLi hướng đối tượng):

<?php

$servername = "localhost";

$username = "username";

$password = "password";

// Tạo kết nối

$conn = new mysqli($servername, $username, $password);

// Kiểm tra kết nối

if ($conn->connect_error) {

die("Connection failed: " . $conn->connect_error);

}

echo "Connected successfully";

?>

Chú ý: trong ví dụ theo kiểu hướng đối tượng ở trên: $connect_error sẽ có vấn đề với các phiên bản trước PHP 5.2.9 và 5.3.0. Nếu bạn cần đảm bảo khả năng tương thích với các phiên bản trước đó, sử dụng đoạn code thay thế dưới đây:

// Kiểm tra kết nối

if (mysqli_connect_error()) {

die("Database connection failed: " . mysqli_connect_error());

}

Ví dụ (MySQLi thủ tục):

<?php

$servername = "localhost";

$username = "username";

$password = "password";

// Tạo kết nối

$conn = mysqli_connect($servername, $username, $password);

// Kiểm tra kết nối

if (!$conn) {

die("Connection failed: " . mysqli_connect_error());

}

echo "Connected successfully";

?>

Ví dụ (PDO):

<?php

$servername = "localhost";

$username = "username";

$password = "password";

try {

$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);

// set the PDO error mode to exception

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

echo "Connected successfully";

}

catch(PDOException $e)

{

echo "Connection failed: " . $e->getMessage();

}

?>

Chú ý rằng trong ví dụ về PDO ở trên, chúng ta cũng đã xác định được một cơ sở dữ liệu (myDB ) . PDO đòi hỏi một cơ sở dữ liệu hợp lệ để kết nối. Nếu không có cơ sở dữ liệu được chỉ định, một ngoại lệ (exception) được ném ra.

Mẹo: Lợi ích lớn của PDO là nó có một lớp ngoại lệ để xử lý bất kỳ vấn đề có thể xảy ra trong các truy vấn cơ sở dữ liệu của chúng ta. Nếu một ngoại lệ được ném trong khu vực try { }, kịch bản ngừng thực thi và đổ trực tiếp vào khu vực catch( ) { }.


Đóng kết nối

Kết nối sẽ được đóng tự động khi mã kết thúc, để đóng kết nói trước đó, sử dụng đoạn code sau:

Ví dụ (MySQLi hướng đối tượng):

$conn->close();

Ví dụ (MySQLi Thủ tục):

mysqli_close($conn);

Ví dụ (PDO):

$conn = null;