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 - Lê Đình Thanh: 1Lê Đình Thanh
Bộ môn Mạng và Truyền thông Máy tính
Khoa Công nghệ Thông tin
Trường Đại học Công nghệ, ĐHQGHN
E-mail: thanhld@vnu.edu.vn, thanhld.vnuh@gmail.com
Mobile: 0987.257.504
Bài giảng
PHÁT TRIỂN ỨNG DỤNG WEB
Ứng dụng CSDL trên nền
web
Bài 5
2
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Nội dung
• Mô hình ba tầng
• Truy vấn dữ liệu
• Truy vấn theo dữ liệu người dùng
• Ghi dữ liệu
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mô hình ba tầng
Phần 1
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mô hình ba tầng
• Tầng khách: trình
diễn và tương tác
với người dùng
• Tầng giữa: thực hiện
các logic của ứng
dụng
• Tầng CSDL: bao
gồm hệ quản trị
CSDL, CSDL của ứng
dụng
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Tầng khách
• Thường là trình duyệt web,
nhưng có thể là web crawler,
web proxy
• Gửi HTTP Request lên Web
server và nhận HTTP
Response từ Web server
• Trình diễn nội dung web và
tương tác với người dùng
...
70 trang |
Chia sẻ: putihuynh11 | Lượt xem: 730 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu 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 - Lê Đình Thanh, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
1Lê Đình Thanh
Bộ môn Mạng và Truyền thông Máy tính
Khoa Công nghệ Thông tin
Trường Đại học Công nghệ, ĐHQGHN
E-mail: thanhld@vnu.edu.vn, thanhld.vnuh@gmail.com
Mobile: 0987.257.504
Bài giảng
PHÁT TRIỂN ỨNG DỤNG WEB
Ứng dụng CSDL trên nền
web
Bài 5
2
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Nội dung
• Mô hình ba tầng
• Truy vấn dữ liệu
• Truy vấn theo dữ liệu người dùng
• Ghi dữ liệu
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mô hình ba tầng
Phần 1
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Mô hình ba tầng
• Tầng khách: trình
diễn và tương tác
với người dùng
• Tầng giữa: thực hiện
các logic của ứng
dụng
• Tầng CSDL: bao
gồm hệ quản trị
CSDL, CSDL của ứng
dụng
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Tầng khách
• Thường là trình duyệt web,
nhưng có thể là web crawler,
web proxy
• Gửi HTTP Request lên Web
server và nhận HTTP
Response từ Web server
• Trình diễn nội dung web và
tương tác với người dùng
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
7Web client
Mã nguồn
trang web
được thể
hiện bằng
HTML, CSS
javascript Web Browser
Do Web Server
gửi tới.
Hiển thị trên
giao diện người dùng
•Gửi yêu cầu và nhận nội dung (mã
nguồn HTML, CSS, javascript) trang
web từ Web Server.
•Thông dịch mã nguồn trang web và
thể hiện kết quả trên màn hình.
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
8Web client/server
Web Client/Browser
Web Server
Microsoft Internet
Explorer, Netcapse
Navigator, Mozilla
FireFox, Google
Chrome
IIS, Apache,
Tomcat, Sambar,
Xitami
HTTP
Yêu cầu
Đáp ứng
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Tầng giữa
• Các trang web/kịch bản được viết bằng các ngôn ngữ
kịch bản khác nhau, và HTML
• Web server
– Nhận yêu cầu từ web client
– Yêu cầu các chương trình dịch chạy các kịch bản/trang
động để sinh ra nội dung web (HTML, 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.
Các file đính kèm theo tài liệu này:
- 05_ud_csdl_tren_web_5707_1995471.pdf