Bài giảng Phát triển ứng dụng web - Bài 5: Ứng dụng CSDL trên nền web

Tóm tắt Bài giảng Phát triển ứng dụng web - Bài 5: Ứng dụng CSDL trên nền web: ...Ki u tham sể ố i – s nguyênố d – s th cố ự s – xâu ký tự b - blob Thủ tục lưu trữ ● Stored Procedures được sử dụng để tăng hiệu năng ● Cập nhật – PROCEDURE p(IN id_val INT) BEGIN INSERT INTO test(id) VALUES(id_val); END; – if (!$db->query("CALL p(1)")) – echo "CALL failed: “. $db-&g...iảng Phát triển ứng dụng web. Giao tác • try { • $db->beginTransaction(); • • $db->exec("SOME QUERY"); • • $stmt = $db->prepare("SOME OTHER QUERY?"); • $stmt->execute(array($value)); • • $stmt = $db->prepare("YET ANOTHER QUERY??"); • $stmt->execute(array($value2, $val...sult)/$rowsPerPage); if (mysql_num_rows($result) % $rowsPerPage != 0) $numPage+ +; if ($currentPage == $numPage-1) echo “Trang sau”; else { echo “<a href = \”?currentPage=“; echo ($currentPage+1); echo ”\”>”; echo “Trang sau”; echo “”; } Lê Đình Thanh, Bài giảng Phát triển ứng dụng ...

pdf70 trang | Chia sẻ: havih72 | Lượt xem: 285 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Phát triển ứng dụng web - Bài 5: Ứng dụng CSDL trên nền web, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
L, javascript, css)
– Gửi nội dung web cho web client
• Chương trình dịch 
– Chạy các kịch bản được viết từ các ngôn ngữ khác nhau 
(PHP, ASP, ASP.NET, C#, Java, ) để sinh ra nội dung web
– Gửi truy vấn đến Hệ quản trị CSDL (tầng dưới) và nhận dữ 
liệu nếu cần
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Tầng CSDL
• CSDL cho ứng dụng
• Hệ quản trị CSDL quản lý CSDL của 
ứng dụng
– Nhận truy vấn từ các chương trình dịch 
tầng giữa, thao tác CSDL và trả kết quả 
cho chương trình yêu cầu
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ mẫu
• Quản lý sinh viên với các chức năng 
sau:
– Hiển thị danh sách sinh viên. Thực hiện 
phân trang danh sách. Cho người dùng 
tùy chỉnh số dòng/trang
– Thêm, cập nhật, xóa sinh viên.
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Truy vấn và cập nhật CSDL
mysql, mysqli, pdo
Phần 2
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
S d ng mysql extensionử ụ
- h ng th t cướ ủ ụ
- không ti p t c đ c nâng c pế ụ ượ ấ
- không nên dùng n u vi t mã m iế ế ớ
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Kết nối CSDL MySQL
• mysql_connect(address, username, 
password);
• mysql_select_db(database_name) or 
die(mysql_error());
• Ví dụ
$ret = mysql_connect("localhost", "root", “rt");
if ($ret) { //Ket noi thanh cong
mysql_select_db("thuchanh"); //Chon CSDL
} else {
echo "Không kết nối được CSDL"; exit();
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thực thi sql
• $ret = mysql_query($sql);
– Nếu thực thi thành công, hàm trả về true, ngược lại 
hàm trả về false và nguyên nhân lỗi được MySQL quản 
lý. Đọc nguyên nhân lỗi bằng hàm mysql_error()
– Với các lệnh update, delete, insert, MySQL quản lý số 
bản ghi chịu tác động. Lấy số bản ghi chịu tác động 
bằng hàm mysql_affected_rows()
– Với lệnh select, hàm trả về recordset lưu kết quả truy 
vấn. Hàm mysql_num_rows($recordset) trả về số bản 
ghi nhận được.
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Cập nhật CSDL
• $count = mysql_query($sql);
• $sql: Lệnh insert, update, delete
• $count: Số bản ghi được cập nhật
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Xử lý kết quả truy vấn
$rs = mysql_query("select  from 
"); 
if (!$rs) {
echo mysql_error(); exit();
} 
while ($row = 
mysql_fetch_array($rs)) {
$field_value = 
$row[“field_name”];
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
S d ng mysqli extensionử ụ
- t PHP 5 tr đi, MySQL 4.1.3 tr điừ ở ở
- h ng đ i t ng + h ng th t cướ ố ượ ướ ủ ụ
- h tr câu l nh đ c chu n b s nỗ ợ ệ ượ ẩ ị ẵ
- h tr th t c l u trỗ ợ ủ ụ ư ữ
- h tr giao tácỗ ợ
- nên dùng n u vi t mã m i dung MySQLế ế ớ
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Kết nối CSDL
• $db = new mysqli($host, $user, $pwd, $database, [$port]);
– $host: Địa chỉ máy chạy mysql server
– $user: Tên người dùng CSDL
– $pwd: Mật khẩu người dùng CSDL
– $database: Tên CSDL
– $port: Cổng chạy mysql server (mặc định 3306)
• Ví dụ:
$db = new mysqli("localhost", "root", "1234", "qldt");
if ($db->connect_errno) {
 echo "Failed to connect to MySQL: " . $db->connect_error;
}
•
•
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Cập nhật CSDL
● //Thực hiện cập nhật
● $res = $db->query("update ...");
● //Kết quả cập nhật
● If (!$res) {
● echo " Không thành công";
● }
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Truy vấn CSDL, sử dụng đệm
● //Thực hiện truy vấn
● $res = $db->query("SELECT ...");
● //Duyệt các bản ghi
● while ($row = $res->fetch_assoc()) {
● echo " id = " . $row['id'] . "\n";
● }
● //Số bản ghi
● $res->num_rows
● //Chuyển đến bản ghi thứ i;
● $res->data_seek($i);
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Truy vấn CSDL, không sử 
dụng đệm
● //Thực hiện truy vấn
● $db->real_query("SELECT ...");
● $res = $db->use_result();
● //Duyệt các bản ghi
● while ($row = $res->fetch_assoc()) {
● echo " id = " . $row['id'] . "\n";
● }
●
●
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Câu lệnh được chuẩn bị 
trước
● Prepared Statement được sử dụng khi cần thực hiện câu lệnh lặp 
lại nhiều lần để tăng hiệu năng
● Chuẩn bị: Tạo mẫu câu lệnh, sử dụng dấu ? làm tham số.
– $stmt = $db->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
● Buộc các tham số 
– $stmt->bind_param('sssd', $code, $language, $official, $percent);
● Đặt giá trị các tham số
– $code = 'DEU'; $language = 'Bavarian'; $official = "F"; $percent = 11.2;
● Thực thi
– $stmt->execute();
● Lấy kết qủa truy vấn
– $res = $stmt->get_result();
● Đóng
– $stmt->close();
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ki u tham sể ố
i – s nguyênố
d – s th cố ự
s – xâu ký tự
b - blob
Thủ tục lưu trữ
● Stored Procedures được sử dụng để 
tăng hiệu năng
● Cập nhật
– PROCEDURE p(IN id_val INT) BEGIN INSERT 
INTO test(id) VALUES(id_val); END;
– if (!$db->query("CALL p(1)"))
– echo "CALL failed: “. $db->error;
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thủ tục lưu trữ
● Truy vấn
– PROCEDURE p() BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;
– if (!$db->multi_query("CALL p()")) {
– echo "CALL failed: (" . $db->errno . ") " . $mysqli->error;
– }
–
– do {
– if ($res = $db->store_result()) {
– ...
– } else {
– if ($db->errno) {
– echo "Store failed: (" . $db->errno . ") " . $db->error;
– }
– }
– } while ($db->more_results() && $db->next_result());
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thủ tục lưu trữ
● Sử dụng lệnh chuẩn bị sẵn
– PROCEDURE p() READS SQL DATA BEGIN SELECT id FROM test; SELECT id + 1 FROM test; END;
– if (!$db->multi_query("CALL p()")) {
– echo "CALL failed: (" . $db->errno . ") " . $mysqli->error;
– }
–
– if (!($stmt = $db->prepare("CALL p()"))) {
– echo "Prepare failed: (" . $db->errno . ") " . $db->error;
– }
–
– if (!$stmt->execute()) {
– echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
– }
–
– do {
– if ($res = $stmt->get_result()) {
– ...
– } else {
– if ($stmt->errno) {
– echo "Store failed: (" . $stmt->errno . ") " . $stmt->error;
– }
– }
– } while ($stmt->more_results() && $stmt->next_result());
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Giao tác
● // tắt tự động ủy thác
● $db->autocommit(FALSE);
●
● //thực hiện nhiều lệnh trong giao tác
● $db->query(...);
● $db->query(...);
● $db->query(...);
●
● //thực hiện ủy thác
● $db->commit();
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
S d ng PDO extensionử ụ
- t PHP 5 tr điừ ở
- h ng đ i t ngướ ố ượ
- s d ng v i m i h QTCSDLử ụ ớ ọ ệ
- nên dùng n u vi t mã m iế ế ớ
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
PHP Data Objects
• PDO cung cấp một giao diện chuẩn 
hóa, nhất quán để thao tác với CSDL 
sử dụng PHP
– Dễ chuyển đổi CSDL
– Viết mã hiệu quả và an toàn
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Nguyên lý hoạt động
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
PDO
Database
Driver
DBMS
database
PDO sql dbms sql
dbms resultPDO result
C n cài driver cho h QTCSDL đ c s d ngầ ệ ượ ử ụ
Kết nối CSDL
• $db = new PDO($dsn, $username, $password, [$options]);
• Tên nguồn dữ liệu (dsn - database source name) khác nhau 
với các hệ QTCSDL
– MySQL: “mysql:host=...; dbname=...;”
– PostgressSQL: “pgsql:host=...; dbname=...;”
– MS SQL: “sqlsrv:Server=...;Database=...”
– 
• Đóng kết nối
– $db = null;
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Xử lý ngoại lệ
• try {
• //Sử dụng PDO 
• } catch(PDOException $ex) {
• echo "Error”.$ex->getMessage();
• }
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Cập nhật CSDL
• Thực thi insert, update, delete 
– $rows = $db->exec("UPDATE ...");
• Lấy id (tự tăng) của bản ghi vừa được 
thêm
– $db->lastInsertId();
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Cập nhật CSDL (tiếp)
• Thực thi insert, update, delete với lệnh chuẩn bị 
trước
– $stmt = $db->prepare("DELETE FROM table 
WHERE id=:id and name LIKE ?");
– $stmt->bindValue(':id', $id);
– $stmt->bindValue(2, "%$search%");
– $stmt->execute();
– $affected_rows = $stmt->rowCount();
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Truy vấn CSDL
• Thực hiện truy vấn
– $stmt = $db->query('SELECT * FROM ...');
● Duyệt các bản ghi
– while($row = $stmt-
>fetch(PDO::FETCH_ASSOC)) {
– echo $row['field1'].' '.$row['field2']; 
– }
● Đếm số bản ghi
– $row_count = $stmt->rowCount();
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Truy vấn CSDL (tiếp)
• Thực hiện truy vấn với lệnh chuẩn bị trước
– $stmt = $db->prepare("SELECT * FROM table WHERE id=? 
AND name=?");
– $stmt->bindValue(1, $id);
– $stmt->bindValue(2, $name);
– $stmt->execute();
● Duyệt các bản ghi
– while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
– echo $row['field1'].' '.$row['field2']; 
– }
● Đếm số bản ghi
– $row_count = $stmt->rowCount();
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Giao tác
• try {
• $db->beginTransaction();
• 
• $db->exec("SOME QUERY");
• 
• $stmt = $db->prepare("SOME OTHER QUERY?");
• $stmt->execute(array($value));
• 
• $stmt = $db->prepare("YET ANOTHER QUERY??");
• $stmt->execute(array($value2, $value3));
• 
• $db->commit();
• } catch(PDOException $ex) {
• $db->rollBack();
• echo $ex->getMessage();
• }
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Truy vấn với dữ liệu người 
dùng
Phần 3
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Các phương pháp nhập liệu
• Nhập tham số và giá trị ngay sau URL
• Bấm vào liên kết đến URL có các tham số kèm theo
• Đệ trình form theo phương thức GET
– Dữ liệu được đưa vào URL trong chuỗi truy vấn
– Ví dụ 
regionName=Riverland&countryName=Jamaica
• Đệ trình form theo phương thức POST
– Dữ liệu được đưa vào thân của gói HTTP Request
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Nhận dữ liệu được gửi theo phương 
thức GET
• PHP
$bien = $_GET[' tenThamso '];
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Nhận dữ liệu được gửi theo phương 
thức POST
• PHP
$bien = $_POST[' tenThamso '];
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Xử lý an ninh dữ liệu nhập
• Dữ liệu do người dùng nhập có thể 
không đúng định dạng và chứa các 
ký tự đặc biệt làm cho chương trình 
không làm việc hoặc làm việc không 
đúng
– Cần làm sạch dữ liệu trước khi sử dụng
• 
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Xử lý an ninh cho dữ liệu 
nhập
• Giới hạn độ dài của giá trị
• Thay các ký tự đặc biệt như ; . > < \ “ ‘  bằng cách thêm \ trước ký tự
• Ví dụ
– Dữ liệu được nhập: 2001;cat /etc/passwd
– Cắt bớt và thay thế dấu đặc biệt: 2001\;cat
• PHP
function clean($input, $maxlength) { 
if ($maxlength > 0) $input = substr($input, 0, $maxlength); 
if (function_exists('mysql_real_escape_string')) {
 if (get_magic_quotes_gpc()) {
 // Undo magic quote effects
 $input = stripslashes($input);
 }
 // Redo escape using mysql_real_escape_string
 $input = mysql_real_escape_string($input);
 } else {
 if (!$this->get_magic_quotes_gpc()) {
 // Add slashed manually
 $value = addslashes($input);
 }
 }
 return $input;
 }
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Tạo truy vấn theo dữ liệu 
nhập
• PHP
$sql = “select  from  where 1=1”;
$sql .= “ and thuoctinh=\’” + thamso + 
“\’”;
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Xuất HTML theo dữ liệu truy 
vấn
• PHP
while ($row = mysql_fetch_array($result)) 
{
echo “Thẻ HTML mở”;
echo $row["thuoctinh“];
echo “Thẻ HTML đóng”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ xuất HTML theo dữ liệu truy 
vấn
• PHP
echo "" . "<a 
href=\"example.php?
qty=1&wineId=" . $row["wine_id"] . 
"\">Add a bottle to the shopping 
cart" . "";
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Kết hợp mã hiển thị và thực hiện 
truy vấn trong một trang
• PHP
if (!isset($thamso)) {
//Tạo form nhập
} else {
//Xử lý an ninh dữ liệu nhập
//Thực hiện truy vấn và xuất HTML theo dữ 
liệu truy vấn
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Phân trang hiển thị
• Trang đầu Trang trước 1 2 3 4 5 Trang 
sau Trang cuối
• Các tham số
– Số dòng trên một trang: rowsPerPage
– Trang hiện tại: currentPage
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Nhận tham số và kiểm tra
• PHP
$currentPage = 0;
if (!empty($_GET[“currentPage ”]) {
$s = clean($_GET[“currentPage ”], 4);
if (is_numeric($s)) 
$currentPage = intval($s);
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Phân trang hiển thị
• Hiển thị các bản ghi ứng với trang hiện tại
• PHP
$firstRow = $currentPage*$rowsPerPage;
if (!mysql_data_seek($result, $ firstRow)) showerror( );
for ( $i= 0; (($i< $rowsPerPage) && 
($row = mysql_fetch_array($result)) ); $i++) {
echo “”;
echo $row["thuoctinh“];
echo “”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Phân trang hiển thị
• Thêm liên kết Trang trước
• PHP
if ($currentPage == 0) echo “Trang trước”;
else {
echo “<a href = \”?currentPage=“;
echo (currentPage-1);
echo ”\”>”;
echo “Trang trước”;
echo “”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Phân trang hiển thị
• Thêm liên kết Trang sau
• PHP
$numPage = floor(mysql_num_rows($result)/$rowsPerPage);
if (mysql_num_rows($result) % $rowsPerPage != 0) $numPage+
+;
if ($currentPage == $numPage-1) echo “Trang sau”;
else {
echo “<a href = \”?currentPage=“;
echo ($currentPage+1);
echo ”\”>”;
echo “Trang sau”;
echo “”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Phân trang hiển thị
• Thêm liên kết Trang đầu
• PHP
if ($currentPage == 0) echo “Trang đầu”;
else {
echo “”;
echo “Trang đầu”;
echo “”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Phân trang hiển thị
• Thêm liên kết Trang cuối
• PHP
$numPage = floor(mysql_num_rows($result)/$rowsPerPage);
if (mysql_num_rows($result) % $rowsPerPage != 0) $numPage+
+;
if ($currentPage == $numPage-1) echo “Trang cuối”;
else {
echo “<a href = \”?currentPage=“;
echo ($numPage-1);
echo ”\”>”;
echo “Trang cuối”;
echo “”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Phân trang hiển thị
• Thêm liên kết số trang
• PHP
$numPage = floor(mysql_num_rows($result)/$rowsPerPage);
if (mysql_num_rows($result) % $rowsPerPage != 0) $numPage+
+;
for ($i = 0; $i < $numPage; $i++) 
if ($i == $currentPage) echo ($i+1);
else {
echo “<a href = \”?currentPage=“;
echo $i;
echo ”\”>”;
echo (i+1);
echo “ ”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ghi vào CSDL
Phần 4
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Thêm, xóa, cập nhật bản ghi
if ((mysql_query ($sql)) && (($c = 
mysql_affected_rows( )) > 0)) 
echo $c.“ bản ghi đã được cập nhật”; 
else
showerror( );
Lưu ý: Hàm int mysql_insert_id([resource connection]) dùng để lấy 
định danh tự tăng của bản ghi vừa được thêm
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Kiến trúc
Trang danh sách
-----------------------
Hiển thị thông báo 
(nếu có)
Hiển thị danh sách 
phân trang
Chọn Thêm
Chọn Sửa
Chọn Xóa
Form 
method=“POS
T”
hanhdong, 
ma, 
Cập nhật 
CSDL
--------------------
----
Thêm
Sửa
Xóa
db.inc util.inc
lib.inc
Trang cập nhật
------------------------
Đọc dữ liệu đối 
tượng cần sửa từ 
CSDL
Kiểm tra hợp thức 
phía client
Form tạo giao 
diện nhập, sửa
method=“POS
T”
hanhdong, 
ma, 
Kiểm tra
---------------------
---
Kiểm tra hợp 
thức phía 
server
Kiểm tra trùng 
mã
iframe hoặc
AJAX
auth.inc
thongbao=
CSDL
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mẫu trang tạo form cập 
nhật
//Nếu là cập nhật thì load giá trị bản 
ghi từ CSDL để đưa vào form
 //Tạo form nhập
//Kiểm tra hợp thức phía client
//Yêu cầu server kiểm tra hợp thức phía 
server và kiểm tra trùng mã (nếu 
cần)
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mẫu trang cập nhật CSDL
 $note = “”;
$input = clean($input);
$insertQuery = “lệnh sql được xây dựng theo $input”;
if ((mysql_query ($insertQuery, $connection)) && (($c 
= mysql_affected_rows( )) > 0)) {
$note = “Thông báo đã thêm/cập nhật/xóa được bao 
nhiêu bản ghi”;
} else {
 $note = “Thông báo không thêm/cập nhật/xóa 
được”;
}
header("Location: list.php? note=“.$note);
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Trang hiển thị danh sách được chỉnh 
sửa để thông báo kết quả cập nhật
if (!empty($_GET[“note”]) {
echo $_GET[“note”];
}
//mã xử lý còn lại để hiển thị danh sách 
theo trang
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Upload tệp và lưu vào CSDL
• Tạo form upload tệp
<form enctype="multipart/form-data" 
action=“page.php" method="post"> 
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Upload tệp và lưu vào CSDL
• Nhận tệp
// Tệp đã được upload?
 if (is_uploaded_file($userfile)) { 
// Mở tệp
$file = fopen($userfile, "r"); 
// Đọc nội dung 
$fileContents = fread($file, filesize($userfile)); 
// Xử lý các ký tự đặc biệt bằng cách thêm \ trước 
chúng 
$fileContents = AddSlashes($fileContents); 
} else $fileContents = NULL;
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Upload tệp và lưu vào CSDL
• Lưu nội dung tệp vào CSDL
$insertQuery = "INSERT INTO TableName 
VALUES (..., \”“.$fileContents . "\")";
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Đọc và hiển thị tệp ảnh đã lưu vào 
CSDL
• Tệp imgdisp.php hiển thị ảnh
$data = @ mysql_fetch_array($result); 
if (!empty($data["map"])) { 
// Xuất dữ liệu ra GIF MIME
header("Content-Type: image/gif"); 
// Xuất dữ liệu ảnh 
echo $data["map"]; 
}
• Tệp sử dụng
echo “";
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Vấn đề truy cập đồng thời
• Nhiều người truy cập CSDL đồng thời có thể dẫn 
đến các tình huống sau:
– Mất cập nhật: Người dùng A đọc giá trị từ CSDL. Người 
dùng B cũng đọc giá trị từ CSDL và cập nhật ngay lập 
tức. Người dùng A cập nhật, ghi đè giá trị của người B
– Đọc sai: Người dùng A cập nhật giá trị. Người dùng B 
đọc giá trị đã cập nhật. Người dùng A undo lại thao tác 
=> Giá trị B đọc được không còn đúng
– Tính tổng sai: Người dùng A đang tính tổng thì người 
dùng B thay đổi giá trị một số mục
– Đọc giá trị không thể lặp: A đọc giá trị, B thay đổi giá 
trị, A đọc lại thấy giá trị khác
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Xử lý truy cập đồng thời
• Khóa bảng cần thao tác
– Kiểu khóa READ: cho người dùng khác 
được đọc nhưng không được ghi
– Kiểu khóa WRITE: không cho người 
dùng khác đọc hay ghi
• Thực hiện truy vấn
• Thực hiện cập nhật
• Mở khóa bảng
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Ví dụ Xử lý cập nhật đồng 
thời
//Khóa các bảng cần thao tác
$query = "LOCK TABLES items READ, orders WRITE, customer READ"; 
if (!mysql_query($query, $connection)) showerror(); 
// Thực hiện truy vấn
$query = "SELECT SUM(price*qty) from FROM items, orders, customer 
WHERE customer.cust_id = orders.cust_id AND orders.order_id = 
items.order_id AND items.cust_id = orders.cust_id AND orders.order_id = 
$orderId AND customer.cust_id = $custId";
if (!($result = mysql_query($query, $connection))) showerror( ); 
$row = mysql_fetch_array($result); 
//rồi cập nhật 
if ($row["SUM(price*qty)"] > $minimum) {
$query = "UPDATE orders SET discount = $discount WHERE cust_id = 
$custId AND order_id = $orderId"; 
if (!mysql_query($query, $connection)) showerror(); 
}
// Mở khóa các bảng
$query = "UNLOCK TABLES";
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Lưu ý khi khóa các bảng
• Sau khi khóa xong phải mở khóa các 
bảng
• Không cần khóa các bảng nếu chỉ 
thực hiện một truy vấn.
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Tiếp theo
Xử lý hợp thức, phiên và cookie, xác thực và an 
ninh
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

File đính kèm:

  • pdfbai_giang_phat_trien_ung_dung_web_bai_5_ung_dung_csdl_tren_n.pdf