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 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 ...

pdf70 trang | Chia sẻ: putihuynh11 | Lượt xem: 601 | Lượt tải: 0download
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:

  • pdf05_ud_csdl_tren_web_5707_1995471.pdf
Tài liệu liên quan