Hướng dẫn php postgresql pdo - php postgresql pdo
Nếu bạn là một PHP Developer, chắc hẳn bạn đã rất quen thuộc với việc truy xuất Database (Cơ sở dữ liệu) bằng các extensions MySQL và MySQLi. Từ PHP 5.1 ta có một cách thức tối ưu hơn đó là sử dụng PHP Data Objects. PDO cung cấp các cơ chế Prepared Statements, Stored Procedures và giúp bạn thao tác với database thông qua các Object (đối tượng) làm cho công việc trở nên hiệu quả, dễ dàng hơn. So sánh PDO và MySQLi
Không Object Mapping Prepared Statements Hiệu năng
PDO_SQLITE SQLite 3 and SQLite 2
PDO_SQLSRV Microsoft SQL Server / SQL Azure
PDO_4D
4D 2. Kết nối cơ sở dữ liệu
Đây là lúc để bạn quên đi Connection String lỗi thời mysql_connect('localhost', 'username', 'password') or die('Could not connect: ' . mysql_error()); Hiện vẫn còn rất nhiều bài viết ở Việt Nam hướng dẫn người mới sử dụng cách kết nối CSDL dạng này vì họ cho rằng nó đơn giản. Thực ra họ chỉ đang dẫn bạn đi về quá khứ mà thôi. Đế 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; 3. Insert và Update
Thêm mới (insert) và cập nhật (update) dữ liệu là những hoạt động cơ bản khi thao tác với database. Với PDO, mỗi hoạt động insert hay update được thực hiện qua 3 quá trình sử dụng cơ chế Prepared Statement Prepare statement: Chuẩn bị một câu lệnh SQL làm khung/mẫu được gọi là Prepared Statement với các Placeholder (có thể hiểu placeholder đóng vai trò như tham số của các phương thức khi bạn khai báo hàm)
Bind params: Gắn giá trị thực vào các placeholder (tương tự như khi bạn truyền giá trị vào các tham số của phương thức)
Execute: Thực thi câu lệnh. Prepared Statement
Các bạn cũng có thể sử dụng mảng để rút gọn:
Ở dòng cuối cùng, tôi đã thực hiện "ép kiểu" (cast) Object $person thành array để truyền vào phương thức execute(); Việc sử dụng Prepared Statement sẽ giúp bạn tránh được SQL Injection, tôi sẽ đi sâu giải thích vấn đề này trong một bài viết khác. 4. Select Data - "Đọc" dữ liệu từ database 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:
Trong thực tế, chúng ta chỉ thường dùng 3 kiểu fetch đó là: FETCH_ASSOC, FETCH_CLASS và FETCH_OBJ. Để thiết lập cấu trúc dữ liệu (Fetch Style hay Fetch Mode) trước khi fetch ta dùng câu lệnh sau:
Hoặc nếu muốn bạn cũng có thể thiết lập kiểu fetch khi gọi hàm fetch():
FETCH_ASSOC Kiểu fetch này sẽ tạo ra một mảng kết hợp lập chỉ mục theo tên column (nghĩa là các key của mảng chính là tên của column), tương tự như khi ta dùng MySQL/MySQLi Extension. 0FETCH_OBJ Kiểu fetch này trả về một Object của stdClass cho mỗi row của kết quả. 1FETCH_CLASS Kiểu fetch này cho phép bạn đưa kết quả vào Object của một Class mà bạn chỉ định. Khi sử dụng FETCH_CLASS, thuộc tính của class sẽ được gán giá trị trước khi constructor của class đó được gọi (phải chú ý vì điều này rất quan trọng). Nếu không có thuộc tính khớp với tên của một column bất kỳ thì thuộc tính đó sẽ được tự động tạo ra (public). Giả sử table users có một ta đã có Class User được định nghĩa như sau: 2Khi query data từ database sử dụng đoạn code sau: 3Vì constructor được gọi sau khi thuộc tính $name được gán bằng Vu Hoang Lam nên isAdmin sẽ mang giá trị Yes. Nếu muốn constructor của class được gọi trước khi các thuộc tính được gán giá trị, bạn phải sử dụng thêm PDO::FETCH_PROPS_LATE. Cách sử dụng như sau: 4Nếu cần truyền các tham số cho constructor của class thông qua phương thức fetch(), các bạn có thể đặt chúng trong một array theo thứ tự tương ứng cụ thể như sau: 5Exceptions - Xử lý ngoại lệ PDO dùng các Exceptions để xử lý các lỗi phát sinh khi làm việc với database, vì thế tất cả những gì bạn làm với PDO nên được đặt trong một try/catch block. PDO cung cấp 3 chế độ xử lý lỗi (Error Mode) được thiết lập thông qua phương thức setAttribute(): 6PDO::ERRMODE_SILENT Đây là chế độ xử lý lỗi mặc định của PDO, khi gặp mỗt lỗi bất kỳ, PDO sẽ im lặng (silent) và chương trình vẫn tiếp tục chạy. Bạn có thể lấy mã lỗi và thông tin về các lỗi đã xảy ra qua PDO::errorCode() và PDO::errorInfo() PDO::ERRMODE_WARNING Ở chế độ này khi gặp phải lỗi PDO sẽ ném ra một PHP Warning, chương trình sẽ tiếp tục chạy. PDO::ERRMODE_EXCEPTION Đây là mode mà bạn nên sử dụng nhất, khi đặt trong một try/catch block sẽ giúp bạn kiểm soát các lỗi phát sinh một cách uyển chuyển và giấu các thông báo lỗi có thể khiến Attacker khai thác hệ thống của bạn. 7Đoạn code trên sẽ ghi thông báo lỗi vào một file text với tên PDOErrors.txt Một số phương thức hữu ích khác 8Phương thức trên trả về Auto Incremented ID của rows được thêm gần nhất. 9Đối với các lệnh SQL không có dữ liệu trả về, và không cần thiết phải truyền tham số thì có thể sử dụng phương thức exec(). Phương thức này sẽ trả về số lượng row bị tác động sau khi thực hiện câu lệnh. Như ví dụ trên sẽ trả về số lượng row bị xoá. 0Phương thức quote() sẽ giúp bạn thêm dấu nháy cho một string để string đó an toàn khi sử dụng để truy vấn, nếu bạn không muốn sử dụng Prepared Statement. 1Phương thức rowCount() trả về số lượng row bị tác động sau khi thực hiện các thao tác DELETE, INSERT và UPDATE. Dùng rowCount() cho thao tác SELECT có thể sẽ trả về kết quả không đúng với một số loại database. Tham khảo: http://www.izlearn.com/ |