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ươn
Trang 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
Trang 4Mô hình ba tầng
Phần 1
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 6Tầ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
Trang 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
Trang 8IIS, 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
Trang 9Tầ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
Trang 10Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.
Trang 11– 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
Trang 14Kế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
Trang 15Thự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
Trang 16Cậ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
Trang 17Xử lý kết quả truy vấn
$rs = mysql_query("select … from
…");
if (!$rs) { echo mysql_error(); exit();
} while ($row =
Trang 18S 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
Trang 19Kết nối CSDL
• $db = new mysqli($host, $user, $pwd, $database, [$port]);
Trang 23Câ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 (?, ?, ?, ?)");
Trang 24Thủ tục lưu trữ
● Stored Procedures được sử dụng để
tăng hiệu năng
– PROCEDURE p(IN id_val INT) BEGIN INSERT INTO test(id) VALUES(id_val); END;
– if (!$db->query("CALL p(1)"))
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 25– } while ($db->more_results() && $db->next_result());
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 26– } while ($stmt->more_results() && $stmt->next_result());
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 29PHP Data Objects
hóa, nhất quán để thao tác với CSDL
sử dụng PHP
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 30Nguyên lý hoạt động
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
database
dbms result PDO result
C n cài driver cho h QTCSDL đ ầ ệ ượ c s d ng ử ụ
Trang 31Kết nối CSDL
• $db = new PDO($dsn, $username, $password, [$options]);
với các hệ QTCSDL
Trang 36Truy 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=?");
Trang 38Truy 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
Trang 39Cá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ụ http://localhost/example.php?
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
Trang 40Nhậ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
Trang 41Nhậ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
Trang 42Xử 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
Trang 43Xử 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);
Trang 44Tạ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
Trang 45Xuất HTML theo dữ liệu truy
Trang 46Ví dụ xuất HTML theo dữ liệu truy
vấn
• PHP
echo "<tr><td>" "<a href=\"example.php?
Trang 47Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 48Ví dụ Phân trang hiển thị
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
Trang 49Nhận tham số và kiểm tra
Trang 50Ví dụ Phân trang hiển thị
• Hiển thị các bản ghi ứng với trang hiện tại
Trang 51Ví dụ Phân trang hiển thị
Trang 52Ví dụ Phân trang hiển thị
• Thêm liên kết Trang sau
Trang 53Ví dụ Phân trang hiển thị
• PHP
if ($currentPage == 0) echo “Trang đầu”; else {
echo “<a href = \”?currentPage=0\”>”;
echo “Trang đầu”;
echo “</a>”;
}
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 54Ví dụ Phân trang hiển thị
• Thêm liên kết Trang cuối
Trang 55Ví 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);
Trang 56Ghi vào CSDL
Phần 4
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 57Thêm, xóa, cập nhật bản ghi
Trang 58… Form method=“POS
T”
hanhdong,
ma, …
Cập nhật CSDL
Thêm Sửa Xóa
… db.inc util.in c
lib.inc
Trang cập nhật
-Đọc dữ liệu đối tượng cần sửa từ
mã
iframe hoặc AJAX
Trang 59Mẫ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
Trang 60Mẫ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
header("Location: list.php? note=“.$note);
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 61Trang hiển thị danh sách được chỉnh sửa để thông báo kết quả cập nhật
Trang 62Upload tệp và lưu vào CSDL
• Tạo form upload tệp
<form enctype="multipart/form-data" action=“page.php" method="post">
<input name="userfile" type="file">
<br><input type="submit">
</form>
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 63Upload tệp và lưu vào CSDL
$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
Trang 64Upload 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
Trang 65Đọc và hiển thị tệp ảnh đã lưu vào
echo “<img src=\”imgdisp.php?p=" $p "\">";
Lê Đình Thanh, Bài giảng Phát triển ứng dụng web
Trang 66– Đọ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
Trang 68Ví 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
Trang 69Lư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