Phân biệt khi nào sử dụng PDO và mở rộngmysqli Cách sử dụng câu lệnh dựng sẵn khi làm việc với PDO Cách sử dụng chế độ hiển thị lỗi Cách sử dụng mysqli trong cả hai hướng lập trình hướng
Trang 1Bài 2
Các kỹ thuật lập trình MySQL
với PHP nâng cao
Trang 2Phân biệt khi nào sử dụng PDO và mở rộng
mysqli
Cách sử dụng câu lệnh dựng sẵn khi làm việc với PDO
Cách sử dụng chế độ hiển thị lỗi
Cách sử dụng mysqli trong cả hai hướng lập
trình hướng đối tượng và hướng cấu trúc
Mục tiêu
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 2
Trang 4Làm việc với truy vấn dựng sẵn
Ưu nhược điểm của PDO
Thiết lập chế độ hiển thị lỗi cho PDO
Làm việc với PDO
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 4
Trang 5Ư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.
PDO (PHP Data Object)
Trang 6PDO (PHP Data Object)
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 6
Trang 7Ư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.
Trang 8lastInsertId()
Một số phương thức của lớp PDO
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 8
Trang 10Sử dụng phương thức fetchAll để trả về tập kết quả:
Ví dụ
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 10
$query = 'SELECT * FROM products' ;
$statement = $db -> prepare ( $query );
$statement -> execute ();
$products = $statement -> fetchAll ();
$statement -> closeCursor ();
foreach ($products as $product) {
echo $product[ 'productName' ] '<br />' ;
}
Trang 11Sử dụng phương thức fetch để duyệt qua một
tập kết quả:
Ví dụ
$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 ();
Trang 12$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 ();
Trang 13Sử dụng tham số dấu hỏi (question mark parameter)
$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 ();
Trang 14Thay đổi dữ liệu
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 14
// Thiết lập và thực thi câu lệnh
$query = 'INSERT INTO products
(categoryID, productCode, productName, listPrice)
VALUES
(:category_id, :code, :name, :price)' ;
$statement = $db -> prspare ( $query );
$statement -> bindValue ( ':categoryid' , $category_id );
$statement -> bindValue ( ':code' , $code );
$statement -> bindValue ( ':name' , $name );
$statement -> bindValue ( ':price' , $price );
$success = $statement -> execute ();
Trang 15Thay đổi dữ liệu
$row_count = $statement -> rowCount ();
Trang 16ERRMODE_WARNING
ERRMODE_EXCEPTION
Ba chế độ xử lý lỗi của PDO
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 16
Trang 17Sử dụng hàm khởi tạo của lớp PDO để thiết lập chế độ xử lý lỗi:
$db = new PDO($dsn, $username, $password, $options);
} catch (PDOException $e) {
$error_message = $e -> getMessage ();
echo "<p>Error connecting to database: $error_message
</p>" ;
Trang 18Sử dụng phương thức setAttribute để thiết lập
chế độ xử lý lỗi:
Sử dụng cặp lệnh try/catch để bắt các đối tượng PDOException:
Ví dụ
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 18
$db -> setAttribute ( PDO :: ATTRERRMODE , PDO :: ERRMODE_EXCEPTION );
try {
$query = 'SELECT * FROM product' ;
$statement = $db -> prepare ( $query );
Trang 19Kết nối với CSDL
Truy vấn và cập nhật dữ liệu
Làm việc với truy vấn dựng sẵn
So sánh giao diện hướng đối tượng và hướng
cấu trúc
Làm việc với mysqli
Trang 20Kết nối đến cơ sở dữ liệu MySQL (kiểu hướng
Trang 21Connect_error
Hai thuộc tính của đối tượng mysqli
dùng để kiểm tra lỗi kết nối
Trang 22Kiểm tra lỗi kết nối (kiểu hướng đối tượng):
Hướng dẫn kiểm tra lỗi kết nối (kiểu cấu trúc):
Trang 23Phương thức của lớp mysqli trả về tập kết quả:
Thuộc tính và phương thức của lớp
mysqli_resultset:
Lớp mysqli
query($select_statement) Thực thi câu lệnh SQL trong ngoặc và trả về đối
tượng mysqli cho tập kết quả Nếu không có kết quả nào được tìm thấy, hàm sẽ trả về giá trị FALSE
Thuộc tính/Phương thức Giải thích
num_rows Số bản ghi của tập kết quả.
Fetch_assoc() Trả về tập kết quả là một mảng liên kết
Trang 24Hướng dẫn thực thi câu lệnh SELECT:
Ví dụ
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 24
// Thực thi câu lệnh
$category_id = 2 ;
$query = "SELECT * FROM products
WHERE categoryID = $category_id";
$result = $db -> query ( $query );
// Kiểm tra tập kết quả trả về
if ($result == false) {
$error_message = $db -> error ;
echo "<p>An error occurred: $error_message</p>" ; exit{);
}
// Lấy ra số dòng có trong tập kết quả
$row_count = $result -> num_rows ;
Trang 25Hướng dẫn hiển thị kết quả:
Ví dụ
<?php for ($i = 0 ; $i < $row_count; $i++) :
$product = $result -> fetch_assoc ();
?>
< tr >
< tdx ? php echo $product [ 'productID1 ] ; ?></td>
<tdx?php echo $product ['categoryID1 ] ; ?></ td >
< tdx ? php echo $product [ 'productCode' ] ; ?></td>
< tdx ? php echo $product [ 'productName' ] ; ?x/td>
< tdx ? php echo $product [ 'listPrice' ] ; ?x/td>
</ tr >
<?php endfor; ?>
Trang 26Giải phóng tài nguyên được dùng bởi tập kết
quả và kết nối cơ sở dữ liệu:
Ví dụ
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 26
$result -> free (); // Giải phóng tập kết quả
$db -> close (); // Giải phóng kết nối tới cơ sở dữ liệu
Trang 27Thuộc tính Giải thích
affectedrows Trả về số hàng bị ảnh hưởng Nếu không có hàng bị ảnh hưởng,
thuộc tính này trả về số không
insert_id Trả về ID được tự động tạo ra trong truy vấn trước đó Nếu
không có ID được tạo ra, thuộc tính này trả về số không
error Trả về thông báo lỗi nếu có lỗi xảy ra Nếu không, nó sẽ trả về
một chuỗi rỗng
errno Trả về số nguyên ký hiệu mã lỗi nếu có lỗi Nếu không có lỗi, trả
về 0
Các thuộc tính của lớp mysqli
dùng để kiểm tra kết quả
Trang 28$query = "INSERT INTO products
(categoryID, productCode, productName, listPrice) VALUES
($category_id, '$code', '$name', $price)"; $success =
$db->query($query);
Trang 30Phương thức của lớp mysqli:
Làm việc với câu lệnh SQL dựng sẵn
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 30
Trang 31Thực thi một câu lệnh dựng sẵn trả về một tập kết quả:
Ví dụ
$category_id = 2 ;
$query = "SELECT productCode, productName, listPrice
FROM products WHERE categoryID = ?" ;
$statement = $db -> prspare ( $query );
$statement -> bind_param ( "i" , $category_id );
$statement -> bind_result ( $code , $name , $listPrice );
$statement -> execute ();
Trang 33Thực thi câu lệnh SQL dựng sẵn để thay đổi dữ liệu:
$query = "INSERT INTO products
(categoryID, productCode, productName, listPrice)
VALUES
(?, ?, ?, ?)" ;
$statement = $db -> prspars ( $query );
$statement -> bind_param ( "issd" , $category_id , $code , $name ,
$price );
Trang 35Câu lệnh kiểu hướng đối tượng
và hướng cấu trúc
$result = $db -> query ( $query );
$result = mysqli_query ( $db , $query );
$error_message = $db -> srror ;
$error_message = mysqlierror ( $db );
$row = $result -> fetch_assoc ();
$row = mysqli_fetch_assoc ( $result );
$row_count = $result -> num_rows ;
$row_count = mysqlinumrows ( $result );
$count = $db -> affected_rows ;
$count = mysqliaffectsdrows ( $db );
Trang 36Câu lệnh kiểu hướng đối tượng
và hướng cấu trúc
Bài 2 - Các kỹ thuật lập trình MySQL với PHP nâng cao 36
$result -> frees ();
mysqli_free_result ( $result );
$statement = $db -> prepare ( $query );
$statement = mysqli_prepare ( $db , $query );
$statement -> bind param ( "i" , $category_id );
mysqli_bind_param ( $statement , "i" , $category_id );
$success = $statement -> execute ();
$success = mysqlisxscute ( $statement );
$db -> close ();
mysqliclose ( $db );
Trang 37MySQL cung cấp giao diện lập trình ứng dụng
(API) cho biết loại ứng dụng nào có thể làm việc với MySQL
PHP cung cấp ba mở rộng để làm việc với thư
viện API của MySQL: mysql, mysqli, PDO
Khi sử dụng PDO để thực thi các câu lệnh SQL, bạn có thể lựa chọn ba chế độ bắt và xử lý lỗi.
So với câu lệnh SQL động, câu lệnh SQL dựng
sẵn giúp tăng hiệu năng và độ bảo mật
Tổng kết bài học