phÁt triỂn Ứng dỤng web · hàm trả về false và nguyên nhân lỗi được mysql...

70
1 Lê Đì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: [email protected], [email protected] Mobile: 0987.257.504 Bài giảng PHÁT TRIỂN ỨNG DỤNG WEB

Upload: others

Post on 27-Oct-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PHÁT TRIỂN ỨNG DỤNG WEB · 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

1

Lê Đình ThanhBộ môn Mạng và Truyền thông Máy tính

Khoa Công nghệ Thông tinTrường Đại học Công nghệ, ĐHQGHN

E-mail: [email protected], [email protected]: 0987.257.504

Bài giảng

PHÁT TRIỂN ỨNG DỤNG WEB

Page 2: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Ứng dụng CSDL trên nền web

Bài 5

2Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 3: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 4: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Mô hình ba tầngPhần 1

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 5: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 6: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 7: PHÁT TRIỂN ỨNG DỤNG WEB · 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

7

Web client

Mã nguồn trang web được thểhiện bằngHTML, CSSjavascript Web Browser

Do Web Servergử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.

Page 8: PHÁT TRIỂN ỨNG DỤNG WEB · 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

8

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

Page 9: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 10: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 11: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 12: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 13: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 14: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 15: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 16: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 17: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 18: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 19: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 20: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 21: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 22: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 23: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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

Page 24: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 25: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 26: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 27: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 28: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 29: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 30: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Nguyên lý hoạt động

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

PDODatabase

DriverDBMS

database

PDO sql dbms sql

dbms resultPDO result

C n cài driver cho h QTCSDL đ c s d ngầ ệ ượ ử ụ

Page 31: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 32: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 33: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 34: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 35: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 36: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 37: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 38: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 39: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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

Page 40: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 41: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 42: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 43: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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

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

Page 44: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 45: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Xuất HTML theo dữ liệu truy vấn

• PHPwhile ($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.

Page 46: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Ví dụ xuất HTML theo dữ liệu truy vấn

• PHPecho "<tr><td>" . "<a

href=\"example.php?qty=1&amp;wineId=" . $row["wine_id"] . "\">Add a bottle to the shopping cart</a>" . "</td></tr>";

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 47: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Kết hợp mã hiển thị và thực hiện truy vấn trong một trang

• PHPif (!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.

Page 48: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 49: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 50: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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 “<tr><td>”;echo $row["thuoctinh“];echo “</td></tr>”;

}

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 51: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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 “</a>”;

}

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 52: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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 “</a>”;

}

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 53: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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 “<a href = \”?currentPage=0\”>”;echo “Trang đầu”;echo “</a>”;

}

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 54: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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 “</a>”;

}

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 55: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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 “</a> ”;

}

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 56: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Ghi vào CSDLPhần 4

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 57: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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”;

elseshowerror( );

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.

Page 58: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Kiến trúcTrang 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êmChọn SửaChọn Xóa

…Form

method=“POST”

hanhdong, ma, …

Cập nhật CSDL

------------------------

ThêmSửaXóa…

db.incutil.in

c

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ửamethod=“POS

T”hanhdong,

ma, …

Kiểm tra---------------------

---

Kiểm tra hợp thức phía

serverKiểm tra trùng

iframe hoặcAJAX

auth.inc

thongbao=…

CSDL

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 59: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 60: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 61: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 62: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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

Page 63: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 64: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 65: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Đọ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 MIMEheader("Content-Type: image/gif"); // Xuất dữ liệu ảnh echo $data["map"];

}

• Tệp sử dụngecho “<img src=\”imgdisp.php?p=" . $p. "\">";

Lê Đình Thanh, Bài giảng Phát triển ứng dụng web.

Page 66: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 67: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 68: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 69: PHÁT TRIỂN ỨNG DỤNG WEB · 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

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.

Page 70: PHÁT TRIỂN ỨNG DỤNG WEB · 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

Tiếp theoXử 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.