Bài giảng Lập trình web - Chương 5: PHP và MySQL - Trần Công Án
Tóm tắt Bài giảng Lập trình web - Chương 5: PHP và MySQL - Trần Công Án: ...--------------+-------+ 5 rows in set (0.05 sec) mysql> +---------------------+------------------------------+-------------+------+-------+ | author | title | type | year | price | +---------------------+------------------------------+-------------+------+-------+ | Mark Twain | The Advent...-------------+ 5 rows in set (0.02 sec) mysql> select distinct type from classics; +-------------+ | type | +-------------+ | Fiction | | Non-Fiction | | Play | +-------------+ 3 rows in set (0.00 sec) mysql> +-------------+ | type | +-------------+ | Fiction | | Non-Fiction |...-------------------+-------------+------+--------+ | author | title | type | year | price | +-----------------+------------------------------+-------------+------+--------+ | Mark Twain | The Adventures of Tom Sawyer | Fiction | 1876 | 100.00 | | Jane Austen | Pride and Prejudice | Fiction | 181...
CT] ) I Các hàm tổng hợp tính toán trên một tập các giá trị và trả về một giá trị đơn. I Các hàm thông dụng: AVG, COUNT, MAX, MIN, SUM TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 32 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Tổng hợp dữ liệu (Summarizing/Aggregating data) Tổng Hợp Dữ Liệu – Ví Dụ SELECT COUNT(*) NoOfStudent FROM student SELECT COUNT(*) FROM student WHERE birthday IS NULL SELECT MAX(price), MIN(price), AVG(price) FROM classics SELECT COUNT(type), COUNT(DISTINCT type) FROM classics; +-------------+ | NoOfStudent | +-------------+ | 10 | +-------------+ 1 row in set (0.00 sec) mysql> +----------+ | COUNT(*) | +----------+ | 1 | +----------+ 1 row in set (0.03 sec) mysql> +------------+------------+------------+ | MAX(price) | MIN(price) | AVG(price) | +------------+------------+------------+ | 100.00 | 54.90 | 79.040001 | +------------+------------+------------+ 1 row in set (0.00 sec) mysql> +-------------+----------------------+ | COUNT(type) | COUNT(DISTINCT type) | +-------------+----------------------+ | 5 | 3 | +-------------+----------------------+ 1 row in set (0.00 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 33 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Nhóm/Gộp dữ liệu (Data grouping) Nhóm Dữ Liệu – GROUP BY & HAVING I Có thể nhóm dữ liệu dựa vào giá trị 1 trường hay một biểu thức. I Cú pháp: GROUP BY | [HAVING ] I Mệnh đề HAVING dùng để lọc dữ liệu sau khi nhóm. I Thường kết hợp với các hàm tổng hợp dữ liệu để tổng hợp dữ liệu cho từng nhóm. I Chú ý: Nếu câu truy vấn có mệnh đề WHERE, việc nhóm gộp dữ liệu chỉ được thực hiện trên tập dữ liệu thỏa điều kiện mệnh đề WHERE. TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 34 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Nhóm/Gộp dữ liệu (Data grouping) Nhóm Dữ Liệu – GROUP BY & HAVING SELECT type, COUNT(title), max(price) FROM classics GROUP BY type SELECT type, COUNT(title) FROM classics GROUP BY type HAVING count(title)>2 SELECT type, COUNT(*) FROM classics WHERE year>1800 GROUP BY type +-------------+--------------+------------+ | type | COUNT(title) | max(price) | +-------------+--------------+------------+ | Fiction | 3 | 100.00 | | Non-Fiction | 1 | 60.50 | | Play | 1 | 79.90 | +-------------+--------------+------------+ 3 rows in set (0.06 sec) mysql> select * from classics; +---------------------+------------------------------+-------------+------+--------+ | author | title | type | year | price | +---------------------+------------------------------+-------------+------+--------+ | Mark Twain | The Adventures of Tom Sawyer | Fiction | 1876 | 100.00 | | Jane Austen | Pride and Prejudice | Fiction | 1811 | 99.90 | | Charles Darwin | The Origin of Species | Non-Fiction | 1856 | 60.50 | | Charles Dickens | The Old Curiosity Shop | Fiction | 1841 | 54.90 | | William Shakespeare | Romeo and Juliet | Play | 1594 | 79.90 | +---------------------+------------------------------+-------------+------+--------+ 5 rows in set (0.06 sec) mysql> select * from student; +---------+----------+------------+----------+---------------------+ | id | name | birthday | province | enroll | +---------+----------+------------+----------+---------------------+ | 0123400 | Nobisuke | NULL | 4 | 2000-09-01 00:00:00 | | 0123401 | Tamako | 1971-12-23 | 4 | 2000-09-01 00:00:00 | | 0123456 | Tom | 1996-01-15 | 1 | 2014-02-20 00:00:00 | | 0123457 | Jerry | 2000-01-15 | 1 | 2014-02-21 15:19:36 | | 0123458 | Doremon | 2112-02-20 | 2 | 2014-02-21 23:46:50 | | 0123459 | Nobita | 1992-01-02 | 2 | 2014-02-21 23:46:50 | | 0123460 | Xuka | 1992-01-03 | 3 | 2014-02-21 23:46:50 | | 0123461 | Chaien | 1980-05-30 | 3 | 2014-02-21 23:46:50 | | 0123462 | Dekhi | 1993-07-18 | 3 | 2014-02-21 23:46:50 | | 0123463 | Xeko | 1992-01-16 | 3 | 2014-02-21 23:46:50 | +---------+----------+------------+----------+---------------------+ 10 rows in set (0.10 sec) mysql> select * from classics where year>1950; Empty set (0.07 sec) mysql> select * from classics where year>'1950'; Empty set (0.05 sec) mysql> select * from classics where year>1800; +-----------------+------------------------------+-------------+------+--------+ | author | title | type | year | price | +-----------------+------------------------------+-------------+------+--------+ | Mark Twain | The Adventures of Tom Sawyer | Fiction | 1876 | 100.00 | | Jane Austen | Pride and Prejudice | Fiction | 1811 | 99.90 | | Charles Darwin | The Origin of Species | Non-Fiction | 1856 | 60.50 | | Charles Dickens | The Old Curiosity Shop | Fiction | 1841 | 54.90 | +-----------------+------------------------------+-------------+------+--------+ 4 rows in set (0.01 sec) mysql> SELECT type, COUNT(*) -> FROM classics -> WHERE year>1800 -> GROUP BY type -> ; +-------------+----------+ | type | COUNT(*) | +-------------+----------+ | Fiction | 3 | | Non-Fiction | 1 | +-------------+----------+ 2 rows in set (0.00 sec) mysql> +---------+--------------+ | type | COUNT(title) | +---------+--------------+ | Fiction | 3 | +---------+--------------+ 1 row in set (0.27 sec) mysql> SELECT type, COUNT(title), max(price) -> FROM cl ssics > GROUP BY type -> -> ; +-------------+--------------+------------+ | type | COUNT(title) | max(price) | +-------------+--------------+------------+ | Fiction | 3 | 100.00 | | Non-Fiction | 1 | 60.50 | | Play | 1 | 79.90 | +-------------+--------------+------------+ 3 rows in set (0.06 sec) mysql> select * from classics; +---------------------+-- -- ------------------- ----+-------------+------+--------+ author | title | type | year | price | +---------------------+-- -- ------------------- ----+-------------+------+--------+ | Mark Twain | The Adventures of Tom Sawyer | Fiction | 1876 | 100.00 | | Jane Austen | Pride and Prejudice | Fiction | 1811 | 99.90 | | Charles Darwin | The Origin of Species | Non-Fiction | 1856 | 60.50 | | Charles Dickens | The Old Curiosity Shop | Fiction | 1841 | 54.90 | | William Shakespeare | Romeo and Juliet | Play | 1594 | 79.90 | +---------------------+------------------------------+-------------+------+--------+ 5 rows in set (0.06 sec) mysql> select * from student; +---------+----------+------------+----------+---------------------+ | id | name | birthday | province | enroll | -----+ - -+--- +----- +- ----- - --+ 0123400 | Nobisuke | NULL | 4 | 2000-09-01 00:00:00 | 0123401 | Tamako | 1971-12-23 | 4 | 2000-09-01 00:00:00 | 0123456 | Tom | 1996-01-15 | 1 | 2014-02-20 00:00:00 | 0123457 | J rry | 2000-01-15 | 1 | 2014-02-21 15: 9:36 | | 0123458 | Doremon | 2112-02-20 | 2 | 2014-02-21 23:46:50 | | 0123459 | Nobita | 1992-01-02 | 2 | 2014-02-21 23:46:50 | | 0123460 | Xuka | 1992-01-03 | 3 | 2014-02-21 23:46:50 | | 0123461 | Chaien | 1980-05-30 | 3 | 2014-02-21 23:46:50 | | 0123462 | Dekhi | 1993-07-18 | 3 | 2014-02-21 23:46:50 | | 0123463 | Xeko | 1992-01-16 | 3 | 2014-02-21 23:46:50 | +---------+----------+------------+----------+---------------------+ 10 rows in set (0.10 sec) mysql> select * from classics where year>1950; Empty set (0.07 sec) mysql> select * from classics where year>'1950'; Empty set (0.05 sec) mysql> select * from classics where year>1800; +-----------------+------------------------------+-------------+------+--------+ | author | title | type | year | price | +-----------------+------------------------------+-------------+------+--------+ | Mark Twain | The Adventures of Tom Sawyer | Fiction | 1876 | 100.00 | | Jane Austen | Pride and Prejudice | Fiction | 1811 | 99.90 | | Charles Darwin | The Origin of Species | Non-Fiction | 1856 | 60.50 | | Charles Dickens | The Old Curiosity Shop | Fiction | 1841 | 54.90 | +-----------------+------------------------------+-------------+------+--------+ 4 rows in set (0.01 sec) mysql> SELECT type, COUNT(*) -> FROM classics -> WHERE year>1800 -> GROUP BY type -> ; +-------------+----------+ | type | COUNT(*) | +-------------+----------+ | Fiction | 3 | | Non-Fiction | 1 | +-------------+----------+ +-------------+----------+ | type | COUNT(*) | +-------------+----------+ | Fiction | 3 | | Non-Fiction | 1 | +-------------+----------+ 2 rows in set (0.00 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 35 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Kết nối dữ liệu giữa các bảng (Join) Nối Kết Dữ Liệu – JOIN | WHERE I Join dùng để truy vấn dữ liệu từ nhiều table, dựa vào mối quan hệ luận lý giữa chúng (giá trị của các trường). I Các cách kết nối: I NATURAL JOIN : tự động kết nối table trong mệnh đề FROM và NATURAL JOIN dựa trên các trường cùng tên. I JOIN ON : kết nối table ở mệnh đề FROM và JOIN dựa trên các trường chỉ định trong mệnh đề ON. I FROM WHERE : kết nối các table trong mệnh đề FROM sử dụng điều kiện trong mệnh đề WHERE. I Các loại nối kết: INNER JOIN, (LEFT|RIGHT)OUTER JOIN TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 36 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Kết nối dữ liệu giữa các bảng (Join) Dữ Liệu Minh Họa I Tạo thêm table province có cấu trúc và dữ liệu như sau: +----------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+------------------+------+-----+---------+-------+ | province | int(10) unsigned | NO | PRI | 0 | | | name | varchar(100) | YES | | NULL | | +----------+------------------+------+-----+---------+-------+ 2 rows in set (0.07 sec) mysql> +----------+----------+ | province | name | +----------+----------+ | 1 | Tokyo | | 2 | Kobe | | 3 | Kagawa | | 4 | Hirosima | | 5 | Osaka | +----------+----------+ 5 rows in set (0.00 sec) mysql> select * from student; +---------+----------+------------+----------+---------------------+ | id | name | birthday | province | enroll | +---------+----------+------------+----------+---------------------+ | 0123400 | Nobisuke | NULL | 4 | 2000-09-01 00:00:00 | | 0123401 | Tamako | 1971-12-23 | 4 | 2000-09-01 00:00:00 | | 0123456 | Tom | 1996-01-15 | 1 | 2014-02-20 00:00:00 | | 0123457 | Jerry | 2000-01-15 | 1 | 2014-02-21 15:19:36 | | 0123458 | Doremon | 2112-02-20 | 0 | 2014-02-21 23:46:50 | | 0123459 | Nobita | 1992-01-02 | 2 | 2014-02-21 23:46:50 | | 0123460 | Xuka | 1992-01-03 | 3 | 2014-02-21 23:46:50 | | 0123461 | Chaien | 1980-05-30 | 3 | 2014-02-21 23:46:50 | | 0123462 | Dekhi | 1993-07-18 | 3 | 2014-02-21 23:46:50 | | 0123463 | Xeko | 1992-01-16 | 3 | 2014-02-21 23:46:50 | +---------+----------+------------+----------+---------------------+ 10 rows in set (0.00 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 37 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Kết nối dữ liệu giữa các bảng (Join) Kết Nối Dữ Liệu – INNER JOIN SELECT id, student.name, province.name FROM student JOIN province ON student.province = province.province SELECT id, s.name, p.name FROM student AS s, province AS p WHERE s.province = p.province FTable JTable +---------+----------+----------+ | id | name | name | +---------+----------+----------+ | 0123456 | Tom | Tokyo | | 0123457 | Jerry | Tokyo | | 0123459 | Nobita | Kobe | | 0123460 | Xuka | Kagawa | | 0123461 | Chaien | Kagawa | | 0123462 | Dekhi | Kagawa | | 0123463 | Xeko | Kagawa | | 0123400 | Nobisuke | Hirosima | | 0123401 | Tamako | Hirosima | +---------+----------+----------+ 9 rows in set (0.01 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 38 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Kết nối dữ liệu giữa các bảng (Join) Kết Nối Dữ Liệu – LEFT OUTER JOIN SELECT id, s.name AS SName, p.name AS PName FROM student AS s LEFT OUTER JOIN province as p ON s.province = p.province FTable JTable +---------+----------+----------+ | id | SName | PName | +---------+----------+----------+ | 0123456 | Tom | Tokyo | | 0123457 | Jerry | Tokyo | | 0123459 | Nobita | Kobe | | 0123460 | Xuka | Kagawa | | 0123461 | Chaien | Kagawa | | 0123462 | Dekhi | Kagawa | | 0123463 | Xeko | Kagawa | | 0123400 | Nobisuke | Hirosima | | 0123401 | Tamako | Hirosima | | 0123458 | Doremon | NULL | +---------+----------+----------+ 10 rows in set (0.02 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 39 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Kết nối dữ liệu giữa các bảng (Join) Kết Nối Dữ Liệu – RIGHT OUTER JOIN SELECT id, s.name AS SName, p.name AS PName FROM student AS s RIGHT OUTER JOIN province as p ON s.province = p.province FTable JTable +---------+----------+----------+ | id | SName | PName | +---------+----------+----------+ | 0123400 | Nobisuke | Hirosima | | 0123401 | Tamako | Hirosima | | 0123456 | Tom | Tokyo | | 0123457 | Jerry | Tokyo | | 0123459 | Nobita | Kobe | | 0123460 | Xuka | Kagawa | | 0123461 | Chaien | Kagawa | | 0123462 | Dekhi | Kagawa | | 0123463 | Xeko | Kagawa | | NULL | NULL | Osaka | +---------+----------+----------+ 10 rows in set (0.00 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 40 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Kết nối dữ liệu giữa các bảng (Join) Kết Nối Dữ Liệu – Full OUTER JOIN (UNION) SELECT id, s.name AS SName, p.name AS PName FROM student AS s LEFT OUTER JOIN province as p ON s.province = p.province UNION SELECT id, s.name AS SName, p.name AS PName FROM student AS s RIGHT OUTER JOIN province as p ON s.province = p.province FTable JTable +---------+----------+----------+ | id | SName | PName | +---------+----------+----------+ | 0123456 | Tom | Tokyo | | 0123457 | Jerry | Tokyo | | 0123459 | Nobita | Kobe | | 0123460 | Xuka | Kagawa | | 0123461 | Chaien | Kagawa | | 0123462 | Dekhi | Kagawa | | 0123463 | Xeko | Kagawa | | 0123400 | Nobisuke | Hirosima | | 0123401 | Tamako | Hirosima | | 0123458 | Doremon | NULL | | NULL | NULL | Osaka | +---------+----------+----------+ 11 rows in set (0.24 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 41 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Các Câu Truy Vấn Lồng Nhau Các Câu Truy Vấn Lồng Nhau I Kết quả một câu truy vấn có thể được sử dụng trong mệnh đề điều kiện của một câu truy vấn khác. SELECT id, name, province FROM student WHERE province NOT IN (SELECT province FROM province) SELECT id, name, birthday FROM student WHERE birthday = (SELECT MAX(birthday) FROM student) +---------+---------+----------+ | id | name | province | +---------+---------+----------+ | 0123458 | Doremon | 0 | +---------+---------+----------+ 1 row in set (0.05 sec) mysql> SELECT id, s.name AS SName, s.province -> FROM student AS s -> LEFT OUTER JOIN province as p -> ON s.province = p.province -> WHERE p.province IS NULL -> ; +---------+---------+----------+ | id | SName | province | +---------+---------+----------+ | 0123458 | Doremon | 0 | +---------+---------+----------+ 1 row in set (0.09 sec) mysql> +---------+---------+------------+ | id | name | birthday | +---------+---------+------------+ | 0123458 | Doremon | 2112-02-20 | +---------+---------+------------+ 1 row in set (0.00 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 42 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Giới hạn số mẩu tin trả về Giới Hạn Số Mẩu Tin Trả Về – LIMIT I Cú pháp: LIMIT [offset,] (Chọn tối đa number of rows mẩu tin, tính từ offset) I Thường được dùng trong phân trang kết quả truy vấn. SELECT id, name, birthday FROM student LIMIT 2 SELECT id, name, birthday FROM student LIMIT 2, 2 +---------+----------+------------+ | id | name | birthday | +---------+----------+------------+ | 0123400 | Nobisuke | NULL | | 0123401 | Tamako | 1971-12-23 | +---------+----------+------------+ 2 rows in set (0.02 sec) mysql> select id, name, birthday from student LIMIT 2,2; +---------+-------+------------+ | id | name | birthday | +---------+-------+------------+ | 0123456 | Tom | 1996-01-15 | | 0123457 | Jerry | 2000-01-15 | +---------+-------+------------+ 2 rows in set (0.00 sec) mysql> +---------+-------+------------+ | id | name | birthday | +---------+-------+------------+ | 0123456 | Tom | 1996-01-15 | | 0123457 | Jerry | 2000-01-15 | +---------+-------+------------+ 2 rows in set (0.00 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 43 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Cập nhật dữ liệu của table – UPDATE Cập Nhật Dữ Liệu Của Table – UPDATE I Cú pháp: UPDATE SET = [, = ...]> [WHERE ] I Chú ý: Nếu không có điều kiện, tất cả các mẫu tin sẽ được c/nhật. UPDATE classics SET price = price*0.9 UPDATE classics SET price = price*0.9 WHERE type = 'Fiction' +------------------------------+-------+ | title | price | +------------------------------+-------+ | The Adventures of Tom Sawyer | 90.00 | | Pride and Prejudice | 89.91 | | The Origin of Species | 54.45 | | The Old Curiosity Shop | 49.41 | | Romeo and Juliet | 71.91 | +------------------------------+-------+ 5 rows in set (0.00 sec) mysql> +------------------------------+-------+ | title | price | +------------------------------+-------+ | The Adventures of Tom Sawyer | 81.00 | | Pride and Prejudice | 80.92 | | The Origin of Species | 54.45 | | The Old Curiosity Shop | 44.47 | | Romeo and Juliet | 71.91 | +------------------------------+-------+ 5 rows in set (0.00 sec) mysql> TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 44 [CT428] Chương 5.1 – MySQL Các lệnh thao tác trên dữ liệu (DML) Xóa dữ liệu của table – DELETE Xóa Dữ Liệu Của Table – DELETE I Cú pháp: DELETE FROM [WHERE ] I Ví dụ: DELETE FROM classics WHERE year < 1800 +-----------------+------------------------------+------+ | author | title | year | +-----------------+------------------------------+------+ | Mark Twain | The Adventures of Tom Sawyer | 1876 | | Jane Austen | Pride and Prejudice | 1811 | | Charles Darwin | The Origin of Species | 1856 | | Charles Dickens | The Old Curiosity Shop | 1841 | +-----------------+------------------------------+------+ 4 rows in set (0.00 sec) mysql> I Chú ý: Nếu không có điều kiện, tất cả các mẫu tin sẽ bị xóa. TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 45 [CT428] Chương 5.1 – MySQL Một số công cụ quản lý MySQL miễn phí Một Số Công Cụ Quản Lý MySQL MySQL Workbench, HeidiSQL, Toad, Eclipse (+plugin), myPHPQdmin, . . . TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 46 [CT428] Chương 5.1 – MySQL Một số công cụ quản lý MySQL miễn phí Một Số Công Cụ Quản Lý MySQL TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 47 [CT428] Chương 5.1 – MySQL Một số công cụ quản lý MySQL miễn phí Một Số Công Cụ Quản Lý MySQL TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 48 [CT428] Chương 5.1 – MySQL Các nội dung khác liên quan đến MySQL Một Số Nội Dung Khác Liên Quan Đến MySQL I Sử dụng ràng buộc (constraints): foreign key, cascade update/delete, . . . I Chỉ định bảng mã (character set), qui tắc sắp xếp (collation) cho dữ liệu của các table. I Tạo các thủ tục/hàm (stored procedure/function) và view. I Sử dụng bẫy sự kiện (trigger). I Quản lý quyền (prililege), bảo mật (security). I Sao lưu (backup) và phục hồi (recover) dữ liệu. TS. Trần Công Án (Khoa CNTT&TT) [CT428] Chương 5.1 – MySQL 49
File đính kèm:
- bai_giang_lap_trinh_web_chuong_5_php_va_mysql_tran_cong_an.pdf