You are on page 1of 52

Chương 9

Thao tác CSDL MySQL với PHP


(Manipulating MySQL Databases with PHP)

Lập trình PHP với MySQL


(PHP Programming with MySQL)
Mục tiêu

• Nối kết đến MySQL từ PHP


• Tìm hiểu cách xử lý các lỗi MySQL .
• Thực thi phát biểu SQL với PHP.
• Dùng PHP để làm việc với CSDL và các bảng
MySQL .
• Dùng PHP để thao tác trên bản ghi CSDL .

PHP Programming with MySQL 2


Tổng quan PHP
• PHP có khả năng truy cập và thao tác trên bất
kỳ CSDL như là ODBC.
• PHP gồm chức năng cho phép làm việc trực tiếp
với các kiểu CSDL khác nhau, mà không thông
qua ODBC.
• PHP hỗ trợ SQLite, những hàm lớp CSDL trừu
tượng (database abstraction layer functions), và
PEAR DB.

PHP Programming with MySQL 3


Bật hỗ trợ MySQL trong PHP
• Trên Hệ thống UNIX/Linux :
– Cấu hình PHP để dùng mysqli mở rộng bằng
việc chi tiết thông số --with-mysqli khi chạy
lệnh configure trong khi cài đặt
• Trên Hệ thống Windows:
– Copy tập tin libmysql.dll và
php_mysqli.dll để cài vào thư mục cài đặt .
– Soạn thảo tập tin cấu hình php.ini và bật chức
năng chỉ dẫn extension=php_mysqli.dll
PHP Programming with MySQL 4
Mở và Đóng một kết nối MySQL
(Opening and Closing a MySQL Connection)

• Mở một kết nối tới một server CSDL MySQL


với hàm mysqli_connect()
• Hàm mysqli_connect() trả về một vị trí số
nguyên nếu có nối kết đến CSDL thành công
hay có lỗi nếu không thành công.
• Gán giá trị trả về từ hàm mysqli_connect()
vào một biến, có thể dùng để truy cập CSDL
trong tập lệnh .
PHP Programming with MySQL 5
Mở và Đóng một kết nối MySQL
(Opening and Closing a MySQL Connection)

•Cú pháp hàm mysqli_connect() là :


$connection = mysqli_connect("host"[, "user ",
"password","database"])

• Đối số host để chi tiết host name , nơi server


CSDL MySQL được cài đặt .
• Đối số user và password chỉ ra tên tài khoản và
password trong MySQL.
• Đối số database để chọn một CSDL để thao tác.

PHP Programming with MySQL 6


Mở và Đóng một kết nối MySQL
(Opening and Closing a MySQL Connection)

Bảng 9-1 Các hàm server thông tin MySQL

PHP Programming with MySQL 7


Mở và Đóng một kết nối MySQL
(Opening and Closing a MySQL Connection)

Hình 9-1 MySQLInfo.php trong một Web browser


PHP Programming with MySQL 8
Chọn một CSDL
(Selecting a Database)

• Chọn một CSDL với phát biểu use database


khi đăng nhập vào màn hình MySQL.
• Cú pháp hàm mysqli_select_db()là:
mysqli_select_db(connection, database)

• Hàm trả về một giá trị là true nếu chọn CSDL


thành công hay la False nếu không thành công .

PHP Programming with MySQL 9


Xử lý các lỗi MySQL

• Nhiều lý do không nối kết được đến một


server CSDL:
– CSDL trên Server không hoạt động.
– Thiếu đặc quyền truy cập đến nguồn dữ
liệu .
– Sai username , password.

PHP Programming with MySQL 10


Xử lý các lỗi MySQL
• Sử dụng username và password hợp lệ

Hình 9-2 Thông báo lỗi nối kết CSDL

PHP Programming with MySQL 11


Khử các lỗi với toán tử điều khiển lỗi
(Suppressing Errors with the Error Control Operator)

• Viết mã mà lường trước và xử lý các vấn đề


tiềm ẩn thường được gọi là bulletproofing

• Các kỹ thuật Bulletproofing gồm:

– Kiểm tra tính hợp lệ trên form dữ liệu.

– Dùng toán tử điều khiển lỗi @ (error control


operator) để khử các thông báo lỗi .
PHP Programming with MySQL 12
Thi hành Kịch bản đầu cuối
(Terminating Script Execution)

• Các hàm die() và exit() thực hiện các kịch


bản đầu cuối.
• Hàm die() thường sử dụng khi cố gắng truy
cập nguồn dữ liệu .
• Cả hai hàm truy cập một đối số là một chuỗi.
• Gọi các hàm die() và exit() như các câu
lệnh riêng lẻ hay thêm vào cả hàm đến một biểu
thức hoặc toán tử.
PHP Programming with MySQL 13
Thi hành Kịch bản đầu cuối
(Terminating Script Execution)
$DBConnect = @mysqli_connect("localhost", "root", "paris");
if (!$DBConnect)
die("<p>The database server is not available.</p>");
echo "<p>Successfully connected to the database server.</p>";
$DBSelect = @mysqli_select_db($DBConnect, "flightlog");
if (!$DBSelect)
die("<p>The database is not available.</p>");
echo "<p>Successfully opened the database.</p>";
// additional statements that access the database
mysqli_close($DBConnect);

PHP Programming with MySQL 14


Thi hành Kịch bản đầu cuối
(Terminating Script Execution)
$DBConnect = @mysqli_connect("localhost", "dongosselin",
"rosebud")
Or die("<p>The database server is not available.</p>");
echo "<p>Successfully connected to the database server.</p>";
@mysqli_select_db($DBConnect, "flightlog")
Or die("<p>The database is not available.</p>");
echo "<p>Successfully opened the database.</p>";
// additional statements that access the database server
mysqli_close($DBConnect);

PHP Programming with MySQL 15


Các báo cáo lỗi MySQL
Bảng 9-2 Các hàm báo cáo lỗi MySQL

PHP Programming with MySQL 16


Các báo cáo lỗi MySQL

$User = $_GET['username'];
$Password = $_GET['password'];
$DBConnect = @mysqli_connect("localhost", $User, $Password)
Or die("<p>Unable to connect to the database server.</p>"
. "<p>Error code " . mysqli_connect_errno()
. ": " . mysqli_connect_error()) . "</p>";
echo "<p>Successfully connected to the database server.</p>";
@mysqli_select_db($DBConnect, "flightlog")
Or die("<p>The database is not available.</p>");
echo "<p>Successfully opened the database.</p>";
// additional statements that access the database
mysqli_close($DBConnect);

PHP Programming with MySQL 17


Các báo cáo lỗi MySQL

Hình 9-4 Con số lỗi và thông báo lỗi username and password

PHP Programming with MySQL 18


Các báo cáo lỗi MySQL

$User = $_GET['username'];
$Password = $_GET['password'];
$DBConnect = @mysqli_connect("localhost", $User, $Password)
Or die("<p>Unable to connect to the database server.</p>"
. "<p>Error code " . mysqli_connect_errno()
. ": " . mysqli_connect_error()) . "</p>";
echo "<p>Successfully connected to the database server.</p>";
@mysqli_select_db($DBConnect, "flightplan")
Or die("<p>Unable to select the database.</p>"
. "<p>Error code " . mysqli_errno($DBConnect)
. ": " . mysqli_error($DBConnect)) . "</p>";
echo "<p>Successfully opened the database.</p>";
// additional statements that access the database
mysqli_close($DBConnect);

PHP Programming with MySQL 19


Các báo cáo lỗi MySQL

Hình 9-5 mã lỗi và thông báo khi cố gắng chọn CSDL không tồn tại

PHP Programming with MySQL 20


Thực hiện phát biểu SQL

• Dùng hàm mysqli_query() để gửi phát biểu


SQL đến MySQL
• Cú pháp mysqli_query() là :
mysqli_query(connection, query)
• Hàm mysqli_query() trả về một trong ba giá
trị :
– Với phát biểu SQL không trả về giá trị kết quả
(các phát biểu CREATE DATABASE và CREATE
TABLE ) , sẽ trả một giá trị là True nếu phát biểu
thực hiện thành công .
PHP Programming with MySQL 21
Thực hiện phát biểu SQL
– Với phát biểu SQL trả về các giá trị ( Phát biểu
SELECT và SHOW ) hàm mysqli_query() trả
về một con trỏ kết quả thể hiện kết quả truy vấn .
• Một con trỏ kết quả (result pointer) là một kiểu
biến đặc biệt chỉ đến dòng được chọn hiên hành
tron tập kết quả (resultset)
– Hàm mysqli_query() trả về một giá trị là
False cho bất kỳ phát biểu SQL bị lỗi, bất chấp
nơi kết quả trả về.

PHP Programming with MySQL 22


Làm việc với các kết qura Query
(Working with Query Results)
Bảng 9-3 Các hàm thông thường PHP cho việc truy xuất các kết
quả CSDL

PHP Programming with MySQL 23


Truy cập các Bản ghi Trong một mảng chỉ
mục
(Retrieving Records into an Indexed Array)

• Hàm mysqli_fetch_row() trả về các trường


trong một dòng hiện hành của tập kết quả đến
một mảng chỉ mục và dời con trỏ kết quả đến
hàng kế tiếp
echo "<table width='100%‘ border='1'>";
echo "<tr><th>Make</th><th>Model</th>
<th>Price</th><th>Quantity</th></tr>";
$Row = mysqli_fetch_row($QueryResult);
do {
echo "<tr><td>{$Row[0]}</td>";
echo "<td>{$Row[1]}</td>";
echo "<td align='right'>{$Row[2]}</td>";
echo "<td align='right'>{$Row[3]}</td></tr>";
$Row = mysqli_fetch_row($QueryResult);
} while ($Row);

PHP Programming with MySQL 24


Truy cập các Bản ghi trong một mảng chỉ
mục
(Retrieving Records into an Indexed Array)

HÌnh 9-6 Kết Xuất của bảng kê trong một Web browser
PHP Programming with MySQL 25
Truy cập các bản ghi đến mảng kết hợp
(Retrieving Records into an Associative Array)

• Hàm mysqli_fetch_assoc() trả về các


trường trên dòng hiện hành của tập kết quả
trong mảng kết hợp và di chuyển con trỏ kết quả
đến dòng kế tiếp .
• Sự khác biệt giữa :
mysqli_fetch_assoc() và
mysqli_fetch_row() , đó là thay vì việc trả về
các trường đến một mảng chỉ mục , hàm
mysqli_fetch_assoc() trả về các trường
đến một mảng kết hợp và dùng tên mỗi trường
như là khóa mảng.
PHP Programming with MySQL 26
Truy cập thông tin kết quả truy vấn
(Accessing Query Result Information)

• Hàm mysqli_num_rows() trả về số của dòng


trong một kết quả truy vấn .
• Hàm mysqli_num_fields() trả về con số
của các trường trong một kết quả truy vấn .
• Cả hai hàm nhận một biến nối kết CSDL như là
một đối số .

PHP Programming with MySQL 27


Truy cập thông tin kết quả truy vấn
(Accessing Query Result Information)

$SQLstring = "SELECT * FROM inventory";


$QueryResult = @mysqli_query($DBConnect, $SQLstring)
Or die("<p>Unable to execute the query.</p>"
. "<p>Error code “ . mysqli_errno($DBConnect)
. ": " . mysqli_error($DBConnect)) . "</p>";
echo "<p>Successfully executed the query.</p>";
$NumRows = mysqli_num_rows($QueryResult);
$NumFields = mysqli_num_fields($QueryResult);
if ($NumRows != 0 && $NumFields != 0)
echo "<p>Your query returned “ .
mysqli_num_rows($QueryResult) . “ rows and "
. mysqli_num_fields($QueryResult) . “ fields.</p>";
else
echo "<p>Your query returned no results.</p>";
mysqli_close($DBConnect);

PHP Programming with MySQL 28


Truy cập thông tin kết quả truy vấn
(Accessing Query Result Information)

Hình 9-8 Kết xuất con số của các dòng và các trường
trả về từ một truy vấn
PHP Programming with MySQL 29
Đóng kết qủa Truy vấn
(Closing Query Results)

• Khi hoàn thành làm việc với những kết quả truy vấn truy
cập với hàm mysqli_query(), dùng hàm
mysqli_free_result() để đóng tập kết quả .
• Để đóng tập kết quả, dùng hàm
mysqli_free_result() các biến chứa con trỏ kết
quả từ hàm mysqli_query()

PHP Programming with MySQL 30


Tạo và xóa CSDL
(Creating and Deleting Databases)

• Dùng phát biểu CREATE DATABASE với hàm


mysqli_query() để tạo một CSDL mới.

$SQLstring = "CREATE DATABASE real_estate";


$QueryResult = @mysqli_query($DBConnect, $SQLstring)
Or die("<p>Unable to execute the query.</p>"
. "<p>Error code " . mysqli_errno($DBConnect)
. ": " . mysqli_error($DBConnect)) . "</p>";
echo "<p>Successfully executed the query.</p>";
mysqli_close($DBConnect);

PHP Programming with MySQL 31


Tạo và xóa CSDL
(Creating and Deleting Databases)

Hình 9-9 Lỗi mã và thông báo in ra khi cố gắng tạo


một CSDL đã tồn tại
PHP Programming with MySQL 32
Tạo và xóa CSDL
(Creating and Deleting Databases)

• Dùng hàm mysqli_db_select() để kiểm tra


một CSDL có tồn tại trước khi tạo hay xóa
CSDL đó.
• Để dùng CSDL mới, phải chọn chọn chúng khi
thực hiện hàm mysqli_select_db() .
• Xóa một CSDL chính là để tạo một CSDL khác,
ngoại trừ dùng phát biểu DROP DATABASE thay
vì phát biểu CREATE DATABASE với hàm
mysqli_query()

PHP Programming with MySQL 33


Tạo và xóa CSDL
(Creating and Deleting Databases)

$DBName = "real_estate";
...
if (@!mysqli_select_db($DBConnect, $DBName))
echo "<p>The $DBName database does not exist!</p>";
else {
$SQLstring = "DROP DATABASE $DBName";
$QueryResult = @mysqli_query($DBConnect, $SQLstring)
Or die("<p>Unable to execute the query.</p>"
. "<p>Error code “ . mysqli_errno($DBConnect)
. ": “ . mysqli_error($DBConnect)) . "</p>";
echo "<p>Successfully deleted the database.</p>";
}
mysqli_close($DBConnect);

PHP Programming with MySQL 34


Tạo và xóa Bảng
(Creating and Deleting Tables)

• Để tạo bảng, dùng phát biểu CREATE TABLE


với hàm mysqli_query() .
• Thực hiện hàm mysqli_select_db() trước
khi thực thi phát biểu CREATE TABLE hay một
bảng mới có thể được tạo ra trong CSDL sai .
• Để tránh việc cố gắng tạo một bảng đã có, dùng
hàm mysqli_query() cố gắng chọn các bản
ghi từ bảng này .

PHP Programming with MySQL 35


Tạo và xóa Bảng
(Creating and Deleting Tables)

$DBName = "real_estate";
...
$SQLstring = "CREATE TABLE commercial (city VARCHAR(25), state
VARCHAR(25), sale_or_lease VARCHAR(25), type_of_use VARCHAR(40),
Price INT, size INT)";
$QueryResult = @mysqli_query($DBConnect, $SQLstring)
Or die("<p>Unable to execute the query.</p>"
. "<p>Error code " . mysqli_errno($DBConnect)
. ": " . mysqli_error($DBConnect)) . "</p>";
echo "<p>Successfully created the table.</p>";
mysqli_close($DBConnect);

PHP Programming with MySQL 36


Tạo và xóa Bảng
(Creating and Deleting Tables)

HÌnh 9-11 Lỗi mã và thông báo in ra khi cố gắng tạo bảng đã có

PHP Programming with MySQL 37


Thêm, xóa, sửa Bản ghi
(Adding, Deleting, and Updating Records)

• Để thêm bản ghi vào một bảng, dùng từ khóa INSERT


và VALUES với hàm mysqli_query().
• Giá trị được thêm vào trong danh sách VALUES phải
giống thứ tự đã định nghĩa các trường trong bảng .
• Phải chi tiết cụ thể giá trị NULL trong các trường không
có giá trị.

PHP Programming with MySQL 38


Thêm, xóa, sửa Bản ghi
(Adding, Deleting, and Updating Records)

• Để thêm nhiều bản ghi cho một CSDL,dùng


phát biểu LOAD DATA và hàm
mysqli_query() với file văn bản chứa các
bản ghi muốn thêm vào.
• Để cập nhật các bản ghi trong một bảng, dùng
các từ khóa UPDATE, SET, và WHERE với hàm
mysqli_query() .
PHP Programming with MySQL 39
Thêm, xóa, sửa Bản ghi
(Adding, Deleting, and Updating Records)

• Từ khóa UPDATE chỉ tên bảng để cập nhật.


• Từ khóa SET cụ thể giá trị nối kết tới các trường
trong các bản ghi sau khi so khớp với điều kiện
qua từ khóa WHERE .
• Để xóa các bản ghi trong bảng, dùng các từ
khóa DELETE và WHERE với hàm
mysqli_query() .
• Từ khóa WHERE quyết định các bản ghi để xóa
trong bảng.
PHP Programming with MySQL 40
Sử dụng hàm
mysqli_affected_rows()
• Với các truy vấn trả về các kết quả (các truy vấn
SELECT), dùng hàm mysqli_num_rows() tìm số
các bản ghi trả về từ việc truy vấn này.
• Với các truy vấn để hiệu chỉnh các bảng nhưng
không trả các kết quả (các truy vấn INSERT,
UPDATE, và DELETE), dùng hàm
mysqli_affected_rows() để quyết định các
dòng tạm lấy.
PHP Programming with MySQL 41
Sử dụng hàm
mysqli_affected_rows()
$SQLstring = "UPDATE inventory SET price=368.20

WHERE make='Fender' AND model='DG7'";

$QueryResult = @mysqli_query($DBConnect, $SQLstring)

Or die("<p>Unable to execute the query.</p>"

. "<p>Error code " . mysqli_errno($DBConnect)

. ": " . mysqli_error($DBConnect)) . "</p>";

echo "<p>Successfully updated "

. mysqli_affected_rows($DBConnect) . " record(s).</p>";

PHP Programming with MySQL 42


Sử dụng hàm
mysqli_affected_rows()

Hình 9-16 Kết xuất của hàm mysqli_affected_rows()


cho truy vấn UPDATE
PHP Programming with MySQL 43
Sử dụng hàm mysqli_info()
• Với các truy vấn thêm hay cập nhật các bản ghi,
hay thay đổi cấu trúc của bảng, dùng hàm
mysqli_info() trả về thông tin về truy vấn
này.
• Hàm mysqli_info() trả về số của toán tử cho
các kiểu khác nhau của các hành động, tùy
thuộc vào kiểu truy vấn.
• Hàm mysqli_info() trả về thông tin của truy
vấn sau cùng, được thực thi trên CSDL đã nối
kết.
PHP Programming with MySQL 44
Sử dụng hàm mysqli_info()
• Hàm mysqli_info() trả về thông tin về các
truy vấn được so khớp một trong các định dạng
sau:
– INSERT INTO...SELECT...
– INSERT INTO...VALUES (...),(...),(...)
– LOAD DATA INFILE ...
– ALTER TABLE ...
– UPDATE
• Với bất kỳ các truy vấn không khớp một trong
các định dạng này, hàm mysqli_info() trả
về một chuỗi rỗng .
PHP Programming with MySQL 45
Sử dụng hàm mysqli_info()
$SQLstring = "INSERT INTO inventory

VALUES('Ovation', '1777 LX Legend', 1049.00, 2),

('Ovation', '1861 Standard Balladeer', 699.00, 1),

('Ovation', 'Tangent Series T357', 569.00, 3)";

$QueryResult = @mysqli_query($DBConnect, $SQLstring)

Or die("<p>Unable to execute the query.</p>"

. "<p>Error code “ . mysqli_errno($DBConnect)

. ": " . mysqli_error($DBConnect)) . "</p>";

echo "<p>Successfully added the records.</p>";

echo "<p>" . mysqli_info($DBConnect) . "</p>";

PHP Programming with MySQL 46


Sử dụng hàm mysqli_info()

HÌnh 9-17 Kết xuất của hàm mysqli_info() cho truy vấn
INSERT để thêm nhiều bản ghi .
PHP Programming with MySQL 47
Sử dụng hàm mysqli_info()
• Hàm mysqli_info() cũng trả về thông tin cho
các truy vấn LOAD DATA
$SQLstring = "LOAD DATA LOCAL INFILE 'c:/temp/inventory.txt'
INTO TABLE inventory;";
$QueryResult = @mysqli_query($DBConnect, $SQLstring)
Or die("<p>Unable to execute the query.</p>"
. "<p>Error code “ . mysqli_errno($DBConnect)
. ": " . mysqli_error($DBConnect)) . "</p>";
echo "<p>Successfully added the records.</p>";
echo "<p>" . mysqli_info($DBConnect) . "</p>";

PHP Programming with MySQL 48


Sử dụng hàm mysqli_info()

Hình 9-18 Kết xuất của hàm mysqli_info() cho truy vấn LOAD DATA

PHP Programming with MySQL 49


Tóm tắt
• PHP gồm có các chức năng cho phép thao tác
trực tiếp với các kiểu CSDL khác nhau, không
qua ODBC
• Viết mã xử lý các vấn đề tiềm ẩn thường được
gọi là bulletproofing.
• Toán tử điều khiển lỗi (@) để loại các thông
báo lỗi .
• Con trỏ kết quả là kiểu đặc biêtcj của biến chỉ
đến dòng hiện hành trong tập kết quả .
PHP Programming with MySQL 50
Tóm tắt
• Dùng hàm mysqli_query() để gửi các phát
biểu SQL tới MySQL
• Để định danh các trường như là khóa chính
trong MySQL, gồm từ khóa PRIMARY KEY khi
định nghĩa đầu tiên một trường với phát biểu
CREATE TABLE .
• Từ khóa AUTO_INCREMENT thường được dùng
với khóa chính để tạo ra một ID duy nhất cho
mỗi dòng trng bảng .

PHP Programming with MySQL 51


Tóm tắt
• Dùng phát biểu LOAD DATA và hàm
mysqli_query() với tập tin văn bản để thêm
nhiều bản ghi vào CSDL.
• Với các truy vấn trả về các kết quả, như các truy
vấn SELECT, có thể dùng hàm mysqli_
num_rows() để tìm số bản ghi tữ câu truy vấn
này.
• Hàm mysqli_info() trả về số thao tác cho
các kiểu hành động khác nhau, tùy thuộc vào
kiểu của câu truy vấn .
PHP Programming with MySQL 52

You might also like