PDO và những điều cần biết

Mon, 21 May 2012

PDO (PHP Data Objects), đây hoàn toàn không phải là một khái niệm mới nó được giới thiệu lần đầu tiên ở phiên bản PHP 5 mà hiện nay thì PHP 5 đang được sử dụng rất phổ biến. Vậy thì PDO là gì và nó hoạt động như thế nào?

Dịch ra một cách trần trụi thì PDO (PHP Data Objects) là các đối tượng dữ liệu trong PHP, nói theo một cách khác là nó sẽ chuyển tất cả dữ liệu thành đối tượng. Đồng thời nó cũng cung cấp các phương thức để thao tác với cơ sở dữ liệu. Trong các hệ cơ sở dữ liệu được PDO hỗ trợ mình sẽ liệt kê một vài cái chúng ta thường hay gặp, nếu các bạn muốn tìm hiểu thêm thì có thể vào trực tiếp trang php manual để xem tại đây. Còn mình sẽ liệt kê một số cái như sau:

  • PDO_MySQL (MySQL 3.x/4.x/5.x)
  • PDO_DBLIB (FreeTDS / Microsoft SQL Server / Sybase)
  • PDO_OCI (Oracle Call Interface)
  • PDO_ODBC (ODBC v3)

PDO sẽ thao tác với cơ sở dữ liệu của chúng ta theo mô hình sau:

pdo-va-nhung-dieu-can-biet-02

Tùy theo từng hệ cơ sở dữ liệu mà bạn có thể chọn driver riêng để kết nối phù hợp. Còn trong bài viết này mình sẽ hướng dẫn các bạn thực hiện trên MySQL, đương nhiên rồi vì đa số chúng ta đều làm việc với cái này mà. Bắt đầu nào.

Kết nối với DB

  • Trước tiên bạn phải chắc chắn rằng extension phppdoMySQL.dll đã được bật. extension=php_pdo_MySQL.dll

  • Cú pháp để kết nối với DB sử dụng PDO hơi khác một chút so với cách thông thường, cụ thể như sau:

try { 
  $host = 'localhost'; 
  $dbname = 'pdo'; 
  $user = 'root'; 
  $pass = 'root'; 
  $db = new PDO('MySQL:host='.$host.';dbname='.$dbname, $user, $pass); 
} catch(Exception $exc) { 
  echo $exc->getMessage(); 
}

Exceptions và PDO

  • PDO vẫn có thể sử dụng Exception để xử lý các lỗi và lời khuyên là những thao tác nào liên quan đến PDO thì tốt nhất chúng ta nên đặt trong try/catch, giống đoạn kết nối DB phía trên của mình. Khi sử dụng Exception cần lưu ý những điều sau: Có 3 chế độ:
  • PDO::ERRMODE_SILENT: Khi gặp lỗi thì nó sẽ bỏ qua và tiếp tục chạy. Cái này tiện cho production.
  • PDO::ERRMODE_WARNING: Khi gặp lỗi nó sẽ xuất ra thông báo và tiếp tục chạy. Cái này tiện cho việc debug.
  • PDO::ERRMODE_EXCEPTION: Khi gặp lỗi nó sẽ đưa ra Exception và cho chúng ta xử lý. Chúng ta sẽ sử dụng cái này. Và đoạn kết nối Database hoàn chỉnh sẽ như sau:
try{ 
  $host = 'localhost'; 
  $dbname = 'pdo'; 
  $user = 'root'; 
  $pass = 'root'; 

  // Kết nối với DB 
  $db = new PDO('MySQL:host='.$host.';dbname='.$dbname, $user, $pass); 

  // Thiết lập chế độ báo lỗi 
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
}catch{ 
  // Xử lý Exception 
  echo "Bị lỗi rồi T_T."; 
  file_put_contents('log.txt', $exc->getMessage() . 'rn', FILE_APPEND); 
}

Insert và Update

  • Đây là 2 thao tác rất quen thuộc khi thao tác với DB. Nhưng sử dụng PDO chúng ta phải tuân thủ theo nguyên tắc sau đây:

pdo-va-nhung-dieu-can-biet-03

  • Chỉ có 3 bước đơn giản vậy thôi. Việc tuân thủ theo quy trình này sẽ giúp chúng ta tránh được các lỗi liên quan đến SQL-Injection, đây là một lỗi cũng khá phổ biến ah nha.
  • Có 2 cách để prepare một câu query:
// Tham số không định danh 
$st = $db->prepare('INSERT INTO user(username,password,email) VALUES (?,?,?)'); 

// Tham số định danh 
$st = $db->prepare('INSERT INTO user(username,password,email) VALUES :)user,:pass,:email)');

Tham số không định danh

$st = $db->prepare('INSERT INTO user(username,password,email) VALUES (?,?,?)'); 
$data = array('kevin','123456','[email protected]'); 
$st->execute($data); 

Tham số định danh

$st = $db->prepare('INSERT INTO user(username,password,email) VALUES :)user,:pass,:email)'); 
$data = array( 
  'username'=>'kevin', 
  'password'=>'123456', 
  'email'=>'[email protected]' 
); 
$st->execute($data);

Selecting Data

pdo-va-nhung-dieu-can-biet-04

Cũng như cách thông thường, dữ liệu khi được lấy lên phải được fetch vào một array, object hoặc class thì chúng ta mới có thể sử dụng được. PDO cũng cung cấp cho chúng ta một số chế độ fetch cơ bản như sau:

  • PDO::FETCH_BOTH (default): Trả về một mảng bao gồm cả thứ tự
  • PDO::FETCH_ASSOC: Trả về một mảng
  • PDO::FETCH_OBJ: Trả về một object
// FETCH_BOTH 
$statement = $db->query('SELECT username,email FROM user'); 
$statement->execute(); 
$statement->setFetchMode(PDO::FETCH_BOTH); 
      
while($row = $statement->fetch()){ 
     echo $row['username']; 
     echo $row['email']; 
}

// Cấu trúc trả về
Array 
( 
    [username] => kevin 
    [0] => kevin 
    [email] => contact@minhtringuyen.info 
    [1] => contact@minhtringuyen.info 
)
// FETCH_ASSOC 
$statement = $db->query('SELECT username,email FROM user'); 
$statement->execute(); 
$statement->setFetchMode(PDO::FETCH_ASSOC); 
      
while($row = $statement->fetch()){ 
     echo $row['username']; 
     echo $row['email']; 
} 

// Cấu trúc trả về 
Array 
( 
    [username] => kevin 
    [email] => contact@minhtringuyen.info 
)
// FETCH_OBJ 
$statement = $db->query('SELECT username,email FROM user'); 
$statement->execute(); 
$statement->setFetchMode(PDO::FETCH_OBJ); 
      
while($row = $statement->fetch()){ 
     echo $row->username; 
     echo $row->email; 
} 

// Cấu trúc trả về 
stdClass Object 
( 
    [username] => kevin 
    [email] => contact@minhtringuyen.info 
)

Các hàm tiện ích

  • Lấy id vừa mới insert vào DB

    $db->lastInsertId();
  • Thực thi câu query không cần giá trị trả về

    $db->exec('DELETE FROM folks WHERE 1'); 
  • Trả về số dòng thực thi thành công

    $affected = $st->rowCount();

Trên đây là toàn bộ các bước cơ bản nhất để thao tác với PDO, hy vọng bài viết bài có ích cho những bạn mới tiếp cận với cái này ^^

Loading...