Bài 10: Cơ sở dữ liệu MySQL

PHP Nâng cao | Lập Trình PHP | 23/01/2016 | 1507 |

I.Tổng quan

Rất nhiều lập trình viên đã quen với việc cài đặt và sử dụng MySQL hoặc MySQLi extension trong PHP để kết nối với MySQL. Kể từ phiên bản PHP 5.0 đã có thêm tính năng PHP Data Object viết tắt là PDO tạo ra một phương thức kết nối CSDL mới.

PHP Data Objects (PDO) là một lớp truy xuất cơ sở dữ liệu cung cấp phương pháp để làm việc với nhiều loại cơ sở dữ liệu khác nhau. Khi làm việc với PDO bạn sẽ không cần phải viết các câu lệnh SQL cụ thể mà chỉ sử dụng các phương thức mà PDO cung cấp, giúp tiết kiệm thời gian và làm cho việc chuyển đổi Hệ quản trị CSDL trở nên dễ dàng hơn, chỉ đơn giản là thay đổi Connection String (chuỗi kết nối CSDL). Đầu tiên, chúng ta cần phải biết rằng PDO thuần tuý là một lớp (class) được dùng để thao tác với CSDL. Vì vậy, nó cũng có các phương thức và thuộc tính như bất kỳ một lớp nào được xây dựng trên PHP.

PDO có sẵn trong PHP 5.1 và nằm trong gói mở rộng PECL của PHP 5.0. Tuy nhiên PDO không làm việc với các phiên bản cũ hơn của PHP.

php data object

Các Hệ quản trị cơ sở dữ liệu (Database Management System) mà PDO hỗ trợ gồm có:

TT

Tên driver

HỆ QUẢN TRỊ CSDL 

1

PDO_CUBRID

Cubrid

2

PDO_DBLIB

FreeTDS / Microsoft SQL Server / Sybase

3

PDO_FIREBIRD

Firebird

4

PDO_IBM

IBM DB2

5

PDO_INFORMIX

IBM Informix Dynamic Server

6

PDO_MYSQL

MySQL 3.x/4.x/5.x

7

PDO_OCI

Oracle Call Interface

8

PDO_ODBC

ODBC v3 (IBM DB2, unixODBC and win32 ODBC)

9

PDO_PGSQL

PostgreSQL

10

PDO_SQLITE

SQLite 3 and SQLite 2

11

PDO_SQLSRV

Microsoft SQL Server / SQL Azure

12

PDO_4D

4D

Trong phần này tôi giới thiệu các bạn tiếp cận CSDL MySQL với PDO.

Để kiểm tra server của bạn có hỗ trọ PDO hay không? Chúng ta làm như sau:

Tạo tập tin php test_driver.php có nội dung như sau:

<?php
var_dump(PDO::getAvailableDrivers());
?>

Chúng ta có thể hình dung rằng mỗi một Hệ quản trị CSDL có một cách quản lý dữ liệu khác nhau, chẳng ai giống ai. Vì vậy, để truy xuất vào một loại CSDL nào đó, chúng ta cần phải khai báo trình điều khiển CSDL tương ứng với loại CSDL đó. Sau khi đã khai báo trình điều khiển, chúng ta có thể kết nối tới CSDL đó, tiến hành các truy vấn (có thể dựa trên ngôn ngữ truy vấn SQL, qua các Stored Procedure... mà CSDL đó hỗ trợ), lấy kết quả về rồi dùng các lệnh khác của PHP xử lý kết quả và hiển thị cho NSD.

 

II. Kết nối CSDL

Mỗi Hệ quản trị CSDL  sẽ có các phương thức kết nối khác nhau (có loại cần Username, Password, đường dẫn đới Database, Port, có loại không). Connection String của các hệ quản trị CSDL  phổ biến hầu hết đều có dạng như sau:

$conn = new PDO('mysql:host=ip_may_chu;dbname=ten_csdl', ‘ten_dang_nhap’, ‘mat_khau’);

Trong đó:

  • mysql: là tên của hệ quản trị CSDL
  • ip_may_chu: ip máy chủ cài đặt hệ quản trị CSDL. Nếu nằm trên cùng server thì có thể ghi localhost, 
  • ten_csdl: là tên của database.
  • ten_dang_nhapmat_khau là tài khoản để truy cập CSDL.

Đế ngắt kết nối khi không cần thao tác với database nữa, các bạn chỉ cần sét biến $conn về null;

$conn = null;

Ví dụ:

<?php
   $servername = "localhost";
   $username = "username";
   $password = "password";
   try{
      $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      echo "Connected successfully";
   }catch(PDOException $e){
      echo "Connection failed: " . $e->getMessage();
   }
?>

Có 3 chế độ báo lỗi mà PDO hỗ trợ:

  • $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT) Đây là chế độ báo lỗi mặc định, nếu để ở chế độ này, bạn sẽ phải tự kiểm tra các lỗi giống như khi làm việc với MySQLi.
  • $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING) Chế độ này cho phép hiển thị các lỗi cảnh báo cơ bản, chương trình sẽ tiếp tục được thực thi.
  • $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) Đây là chế độ báo lỗi bạn nên dùng. PDO sẽ tự động throw một exception khi có bất kỳ lỗi nào xảy ra. Cho phép bạn xử lý chúng và dừng các đoạn mã quan trọng lại.

​III. Thực thi câu lệnh sql

3.1. Truy xuất dữ liệu:

Khi đọc dữ liệu từ database, PDO sẽ trả về dữ liệu theo cấu trúc mảng (array) hoặc đối tượng (object) thông qua phương thức fetch(). Bạn nên thiết lập trước cấu trúc dữ liệu trước khi gọi phương thức này, PDO hỗ trợ các tuỳ chọn sau:

  • PDO::FETCH_ASSOC: Trả về dữ liệu dạng mảng với key là tên của column (column của các table trong database)
  • PDO::FETCH_BOTH (default): Trả về dữ liệu dạng mảng với key là tên của column và cả số thứ tự của column
  • PDO::FETCH_BOUND: Gán giá trị của từng column cho từng biến đã khởi tạo trước đó qua phương thức bindColumn()
  • PDO::FETCH_CLASS: Gán giá trị của từng column cho từng thuộc tính (property/attribute) của một lớp Class theo tên column và tên thuộc tính.
  • PDO::FETCH_INTO: Gán giá trị của từng column cho từng thuộc tính của một Class Instance (thể hiện của một lớp)
  • PDO::FETCH_LAZY: Gộp chung PDO::FETCH_BOTH/PDO::FETCH_OBJ
  • PDO::FETCH_NUM: Trả về dữ liệu dạng mảng với key là số thứ tự của column
  • PDO::FETCH_OBJ: Trả về một Object của stdClass(link is external) với tên thuộc tính của Object là tên của column.

Để thực thi chúng ta sử dụng lệnh query

Ví dụ:

<?php
   echo "<table style='border: solid 1px black;'>";
   echo "<tr><th>Id</th><th>Firstname</th><th>Lastname</th></tr>";
   class TableRows extends RecursiveIteratorIterator {
      function __construct($it) {
         parent::__construct($it, self::LEAVES_ONLY);
      }
      function current() {
         return "<td style='width:150px;border:1px solid black;'>" . parent::current(). "</td>";
      }
      function beginChildren() {
         echo "<tr>";
      }
      function endChildren() {
         echo "</tr>" . "\n";
      }
   }
   $servername = "localhost";
   $username = "username";
   $password = "password";
   $dbname = "myDBPDO";
   try {
      $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests");
      $stmt->execute();
      $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
      foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
         echo $v;
      }
   }catch(PDOException $e) {
      echo "Error: " . $e->getMessage();
   }
   $conn = null;
   echo "</table>";
?>

3.2. Thêm dữ liệu

 

Ví dụ:

<?php
   $servername = "localhost";
   $username = "username";
   $password = "password";
   $dbname = "myDBPDO";
   try {
      $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $sql = "INSERT INTO MyGuests (firstname, lastname, email)
            VALUES ('John', 'Doe', 'john@example.com')";
      $conn->exec($sql);
      echo "New record created successfully";
   }catch(PDOException $e){
      echo $sql . "<br>" . $e->getMessage();
   }
   $conn = null;
?>

3.3. Cập nhật dữ liệu

 

4.3. Xóa dữ liệu

 

Tự học Lập trình PHP