Traffic Count

Làm việc với PDO trong PHP

I. PDO (PHP Data Object)

Ưu điểm:

  • Được tích hợp trong PHP phiên bản 5.1 trở lên và dùng được cho phiên bản 5.0.
  • Cung cấp giao tiếp hướng đối tượng.
  • Cung cấp một giao tiếp nhất quán cho phép lưu chuyển dữ liệu giữa các hệ cơ sở dữ liệu khác nhau như Oracle, DB2, Microsoft SQL Server, PostgreSQL.
  • Tận dụng hầu hết ưu điểm các tính năng mới của MySQL phiên bản 4.1.3 trở lên.

Nhược điểm:

  • Không làm việc trên PHP phiên bản 4.x, 3.x hay các phiên bản trước đó.
  • Không tận dụng ưu điểm của các tính năng tiên tiến mới của MySQL phiên bản 4.1.3 trở lên, như tính năng lồng câu lệnh SQL.

II. mysqli (mở rộng MySQL cải tiến)

Ưu điểm:

  • Được tích hợp trong PHP phiên bản 5 trở lên.
  • Hỗ trợ cả giao tiếp hướng đối tượng và giao tiếp kiểu cấu trúc.
  • Tận dụng tất cả các tính năng mới của MySQL phiên bản 4.1.3 trở lên.

Nhược điểm:

  • Không làm việc với các hệ cơ sở dữ liệu khác ngoài MySQL.

III. Một số phương thức của lớp PDO

  • prepare($sql_statement)
  • Query($sql_statement)
  • Exec($sql_statement)
  • lastInsertId()

IV. Một số phương thức của lớp PDOStatement

  • bindValue($param, $value)
  • execute()
  • fetchAll()
  • fetch()
  • rowCount()
  • closeCursor()

Ví dụ:

- Sử dụng phương thức fetchAll để trả về tập kết quả

$query = 'SELECT * FROM products';

$statement = $db->prepare($query);

$statement->execute();

$products = $statement->fetchAll();

$statement->closeCursor();

foreach ($products as $product) {

            echo $product['productName'] . '<br />';

}

- Sử dụng phương thức fetch để duyệt qua một tập kết quả:

$query = 'SELECT * FROM products';

$statement = $db->prepare($query);

$statement->execute();

$product = $statement->fetch();          // lấy bản ghi đầu tiên

while ($product ! = null) {

      echo $product['productName'] . '<br />';

      $product = $statement->fetch();      // lấy bản ghi tiếp theo

}

$statement->closeCursor();

V. Sử dụng tham số danh định

$category_id = 1;

$price = 400;

$query = 'SELECT * FROM products

                  WHERE categoryID = :categoryid

      AND listPrice > :price';

$statement = $db->prepare($query);

$statement->bindValue(':categoryid', $category_id);

$statement->bindValue(':price', $price);

$statement->execute();

$products = $statement->fetchAll();

$statement->closeCursor();

VI. Sử dụng tham số dấu hỏi

$query = 'SELECT * FROM products

      WHERE categoryID = ?

      AND listPrice > ?';

$statement = $db->prepare($query);

$statement->bindValue(1, $category_id);

$statement->bindValue(2, $price);

$statement->execute();

$products = $statement->fetchAll();

$statement->closeCursor();

VII. Thay đổi dữ liệu

$row_count = $statement->rowCount();

$statement->closeCursor();

// Lấy ID sản phẩm cuối cùng

$product_id = $db->lastlnsertId();

// Hiển thị thông báo cho người sử dụng

if ($success) {

echo "<p>$row_count row(s) was inserted with this ID: $product_id</p>"; } else {

echo "<p>No rows were inserted.</p>";

}

VIII. Ba chế độ xử lý lỗi của PDO

ERRMODE_SILENT

ERRMODE_WARNING

ERRMODE_EXCEPTION

Ví dụ:

Sử dụng hàm khởi tạo của lớp PDO để thiết lập chế độ xử lý lỗi:

$dsn = 'mysql:host=localhost;dbname=my_guitar_shopl';

$username = 'mgs_user';

$password = 'pa55word';

$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODEEXCEPTION);

try {

$db = new PDO($dsn, $username, $password, $options);

} catch (PDOException $e) {

$error_message = $e->getMessage();

echo "<p>Error connecting to database: $error_message </p>";

exit();

}

Sử dụng phương thức setAttribute để thiết lập chế độ xử lý lỗi:

$db->setAttribute(PDO::ATTRERRMODE, PDO::ERRMODE_EXCEPTION);

Sử dụng cặp lệnh try/catch để bắt các đối tượng PDOException:

try {

$query = 'SELECT * FROM product';

$statement = $db->prepare($query);

$statement->execute();

$products = $statement->fetchAll();

$statement->closeCursor();

} catch (PDOException $e) {

$error_message = $e->getMessage();

echo "<p>Database error: $error_message </p>";

exit();

Thầy Dương Quang Huy - Giảng viên Khoa CNTT-ĐT