Tài liệu hướng dẫn về Lập trình PHP và MYSQL
Tóm tắt Tài liệu hướng dẫn về Lập trình PHP và MYSQL: ...s in Canada."); } } Cỏc cõu lệnh trờn cũng tương tự như sau: if ($country == "ca" && $position == "h") { echo ("Human resources positions in Canada."); } elseif ($country == "ca" && $position == "a") { echo ("Accounting positions in Canada."); } PHP cũng cung cấp một cỳ phỏp...My SQL - 14 1. Class: là một tập hợp cỏc biến và cỏc hàm cựng làm việc với cỏc biến này. Một class ủược ủịnh nghĩa theo cỳ phỏp sau: <?php class Cart { var $items; // Items in our shopping cart function add_item ($artnr, $num) { $this->items[$artnr] += $num; } functi...dụng ủến một bảng cũng như ủến toàn bộ hay ủến cỏc nhúm dữ liệu trong một bảng là: Tờn Mụ tả AVG(column) Giỏ trị trung bỡnh của cỏc giỏ trị trong cỏc cột cụ thể. COUNT(items) Nếu bạn chỉ ra một cột thỡ nú trả về số cỏc giỏ trị của cột ủú.Nếu thờm vào từ khoỏ DISTINCT phớa trước tờn cột,t...
mệnh đề LIMIT. Nĩ được dùng để chỉ định các dịng nào từ nhập vào nên được trả lại. Nĩ gồm cĩ hai tham số: số hàng để bắt đầu và số lượng các hàng sẽ được trả lại.Ví dụ minh hoạ: select name from customers limit 2,3; Câu truy vấn này cĩ thể được hiểu như sau: chọn tên từ bảng customers và sau đĩ trả lại 3 hàng bắt đầu từ hàng thứ hai của nhập vào. Cập nhật các bản ghi trong cơ sở dữ liệu: Sử dụng câu lệnh UPDATE. Cấu trúc thơng dụng của nĩ như sau: - Tài liệu hướng dẫn học lập trình web, lập trình ứng dụng với PHP & My SQL - 21 UPDATE tablename SET column1=expression1,column2=expression2,... [WHERE condition] [LIMIT number] Ví dụ, chúng ta muốn tăng giá tất cả các quyển sách lên 10%, chúng ta sẽ sử dụng câu lệnh UPDATE như sau: update books set price=price*1.1; Thay đổi các bảng sau khi tạo: Chúng ta cĩ thể thay đổi cấu trúc của các bảng trong cơ sở dữ liệu bằng cách sử dụng câu lệnh ALTER TABLE. Cấu trúc căn bản của nĩ như sau: ALTER TABLE tablename alteration [,alteration...] Ví dụ: trong bảng Customers, chúng ta cho phép tên dài 30 kí tự, sau khi chúng ta bắt đầu tạo một số dữ liệu, chúng ta cĩ thể phát hiện rằng một số tên là quá dài và đang bị cắt, chúng ta cĩ thể sửa điều này bằng cách thay đổi loại dữ liệu của cột để nĩ cĩ thể dài đến 45 kí tự. alter table customers modify name char(45) not null; Huỷ bỏ các records khỏi cơ sở dữ liệu: Sử dụng câu lệnh DELETE, cấu trúc như sau: DELETE FROM table [WHERE condition] Ví dụ: delete from customers where customerid=5; Chú ý:nếu bạn viết DELETE FROM table; thì tất cả các hàng trong bảng sẽ bị huỷ bỏ. Huỷ các bảng: Bạn cĩ thể huỷ tồn bộ một bảng bằng cách sử dụng câu lệnh DROP TABLE. Cấu trúc này rất đơn giản, nĩ như sau: DROP TABLE table; Huỷ tồn bộ cơ sở dữ liệu: Bạn cĩ thể thực hiện điều này bằng cách sử dụng câu lệnh DROP DATABASE, cấu trúc như sau: DROP DATABASE database; Tạo và huỷ Index: Index là những phương tiện quan trọng để tăng tốc độ truy cập các nội dung của các bảng, thơng thường là dùng cho các câu truy vấn mà liên quan đến kết nối nhiều bảng với nhau. MySQL cho phép bạn tạo ra index một cách khá linh hoạt. Bạn cĩ thể index các cột riêng rẽ hay kết nối các cột lại với nhau. Bạn cũng cĩ thể cĩ nhiều hơn một index trong một bảng nếu bạn muốn cĩ thể tra cứu giá trị một cách nhanh chĩng từ các cột khác nhau của một bảng. Tạo Index: Bạn cĩ thể tạo index cho một bảng mới khi bạn dùng CREAT TABLE, hoặc cĩ thể thêm index cho các bảng đang tồn tại với CREAT INDEX hay ALTER TABLE. Bạn phải chỉ định rằng index cĩ thể hay khơng thể chứa giá trị lặp lại. Nếu nĩ khơng thể, index nên được tạo như là một khố chính (PRIMARY KEY) hay là một index duy nhất (UNIQUE INDEX). ðể thêm một index cho một bảng đang tồn tại, bạn cĩ thể sử dụng - Tài liệu hướng dẫn học lập trình web, lập trình ứng dụng với PHP & My SQL - 22 ALTER TABLE hay CREAT INDEX. Trong đĩ lệnh ALTER TABLE linh hoạt hơn bởi bạn cĩ thể sử dụng nĩ để tạo ra một index thơng thường, một index duy nhất, hay một khố chính. Cú pháp như sau: alter table tablename add index indexname(column_list) alter table tablename add unique indexname(column_list) alter table tablename add primary key(column_list) CREAT INDEX cĩ thể thêm một index thơng thường hay một index duy nhất cho một bảng: creat unique index index_name on tablename(column_list) creat index index_name on tablename(column_list) ðể tạo một index cho một bảng mới khi bạn sử dụng câu lệnh CREAT TABLE, bạn cĩ thể sử dụng cú pháp tương tự như đã làm với ALTER TABLE, nhưng bạn phải chỉ định các mệnh đề tạo index trong phần câu lệnh CREAT TABLE. Cụ thể như sau: creat table tablename( ...... index index_name(column_list), unique index_name(column_list), primary key (column_list), ... ) Hủy bỏ Index: Bạn cĩ thể huỷ bỏ index bằng cách sử dụng một trong hai câu lệnh DROP INDEX hay ALTER TABLE. Cú pháp như sau: DROP INDEX index_name on table_name ALTER TABLE table_name DROP INDEX index_name ALTER TABLE table_name DROP PRIMARY KEY Chú ý:Index cĩ thể bị tác động nếu bạn huỷ các cột trong một bảng. III. Các hàm PHP sử dụng để truy cập cơ sở dữ liệu MySQL • int mysql_affected_rows( [resource link_identifier]): trả về số lượng các hàng bị tác động bởi các câu truy vấn cuối cùng INSERT, UPDATE hay DELETE kết hợp với định danh liên kết (link_identifier). Nếu nhận dạng liên kết khơng cụ thể thì liên kết cuối cùng được mở ra bởi mysql_connect( ). Chú ý khi bạn đang sử dụng các giao dịch, bạn phải gọi mysql_affected_rows( ) sau truy vấn INSERT, UPDATE hay DELETE. • int mysql_character_set_name ( [resource link_identifier]):trả về ký tự mặc định gán tên cho kết nối hiện hành. • bool mysql_close ( [resource link_identifier]): trả về TRUE nếu thành cơng, FALSE nếu thất bại. Hàm này đĩng kết nối đến MySQL server mà kết hợp với nhận dạng liên kết định rõ, nếu link_identifier khơng định rõ thì liên kết mở cuối cùng sẽ được sử dụng. Việc sử dụng hàm này khơng phải lúc nào cũng cần thiết, như đối với các liên kết mở khơng liên tục thì nĩ sẽ tự động đĩng khi kết thúc sự thực thi của script. Chú ý hàm này khơng đĩng kết nối liên tục được tạo bởi hàm mysql_pconnect( ). • resource mysql_connect ( [string server [, string username [, string password [, bool new_link]]]]): trả về một định danh liên kết MySQL khi thành cơng, cịn khơng trả về giá trị FALSE. Hàm này thiết lập một kết nối đến MySQL server. Những giá trị mặc định sau được dùng cho các tham số tùy chọn khơng khai báo: server='localhost:3306', username=tên của người sử dụng là chủ của server và password= bỏ trống. Nếu lời gọi lần thứ hai được tạo bởi mysql_connect( ) với cùng các tham số mà khơng cĩ liên kết mới nào được thiết lập,nhưng thay vào đĩ một liên kết định danh của cổng đang được mở sẽ được trả về. Tham số new_link mơ tả - Tài liệu hướng dẫn học lập trình web, lập trình ứng dụng với PHP & My SQL - 23 hành vi này và làm cho hàm mysql_connect( ) luơn mở một liên kết mới, ngay cả khi nếu hàm mysql_connect( ) bị gọi trước với cùng các tham số. Liên kết đến server sẽ bị đĩng ngay khi việc thực thi của script kết thúc,trừ khi nĩ bị đĩng sớm hơn bởi hàm gọi mysql_close( ). • bool mysql_create_db ( string database name [, resource link_identifier]): tạo một cơ sở dữ liệu mới trên server kết hợp với liên kết định danh được chỉ định. Trả về giá trị TRUE nếu thành cơng, ngược lại trả về FALSE. • bool mysql_data_seek ( resource result_identifier, int row_number): di chuyển con trỏ hàng bên trong của kết quả MySQL kết hợp với kết quả định danh cụ thể để chỉ đến số hàng được chỉ định. Nĩ sẽ trả về TRUE nếu thành cơng, ngược lại trả về FALSE.Row_number bắt đầu tại 0, và nên cĩ giá trị trong khoảng từ 0 đến mysql_num_rows - 1. • string mysql_db_name ( resource result, int row [, mixed field]): lấy tham số đầu tiên là con trỏ kết quả từ việc gọi hàm mysql_list_dbs( ). Tham số hàng là chỉ mục đến kết quả gán. Nếu xảy ra lỗi, thì trả về FALSE.Sử dụng hàm mysql_errono( ) và mysql_error( ) để xem bản chất lỗi. • resource mysql_db_query ( string database, string query [, resource link_identifier]): chọn một cơ sở dữ liệu và thực thi một truy vấn trên nĩ. Nếu liên kết định danh tùy chọn khơng được chỉ định hàm sẽ cố tìm ra một liên kết mở đến MySQL server và nếu khơng cĩ liên kết nào được tìm thấy thì nĩ sẽ tạo ra một liên kết như nếu hàm mysql_connect( ) đã được gọi khơng cĩ tham số nào. Hàm sẽ trả về một kết quả MySQL dương, hay là FALSE nếu bị lỗi. • bool mysql_drop_db ( string database_name [, resource link_identifier]): huỷ bỏ tồn bộ cơ sở dữ liệu từ server kết hợp với liên kết định danh chỉ định. Trả về TRUE nếu thành cơng, FALSE nếu gặp lỗi. • int mysql_errno ( [resource link_identifier]): trả về số lỗi từ hàm MySQL cuối cùng, hay là 0 nếu khơng cĩ lỗi nào. • string mysql_error ( [resource link_identifier]): trả về văn bản lỗi từ hàm MySQL cuối cùng hay ' ' nếu khơng cĩ lỗi nào. • string mysql_escape_string ( string unescaped_string): tránh unescaped_string để nĩ cĩ thể ở nơi an tồn trong mysql_querry( ). • array mysql_fetch_array ( resource result [, int result_type]): trả về một mảng tương đương với hàng tìm nạp, hay là FALSE nếu khơng cĩ hàng nào. • array mysql_fetch_assoc ( resource result): trả về một mảng kết hợp tương đương với hàng tìm nạp, hay là FALSE nếu khơng cĩ hàng nào. • object mysql_fetch_field ( resource result [, int field_offset]): trả về một đối tương chứa thơng tin các trường. Nĩ thường được dùng để lấy thơng tin về các trường trong một kết quả truy vấn. • array mysql_fetch_lengths ( resource result): trả về một mảng tương đương với chiều dài của mỗi trường trong hàng cuối cùng được tìm nạp bởi mysql_fetch_row() hay trả về FALSE nếu lỗi. • object mysql_fetch_object ( resource result): trả về một đối tượng với các thuộc tính tương đương với hàng tìm nạp hay FALSE nếu khơng cĩ hàng nào. • array mysql_fetch_row ( resource result): trả về một mảng tương đương với hàng tìm nạp, nếu khơng cĩ hàng nào thì trả về FALSE. • string mysql_field_flags ( resource result, int field_offset): trả về trường các cờ của trường được chỉ định. • int mysql_field_len ( resource result, int field_offset): trả về chiều dài của trường được chỉ định. • string mysql_field_name ( resource result, int field_index): trả về tên của trường chỉ mục được chỉ định. • int mysql_field_seek ( resource result, int field_offset): tìm kiếm offset của trường được chỉ định. • string mysql_field_table ( resource result, int field_offset): trả về tên của bảng mà trường được chỉ định ở trong đĩ. • string mysql_field_type ( resource result, int field_offset): trả về loại của trường được chỉ định . • bool mysql_free_result ( resource result): giải phĩng tất cả bộ nhớ kết hợp với định danh kết quả result. Hàm này chỉ được gọi khi bạn quan tâm đến bao nhiêu bộ nhớ đang được sử dụng cho các câu truy vấn mà trả về các tập hợp lớn các kết quả. Tất cả kết quả bộ nhớ kết hợp sẽ tự động được giải phĩng khi script kết thúc thực hiện. Trả về TRUE nếu thành cơng, FALSE nếu thất bại. • string mysql_get_client_info ( void): trả về chuỗi biểu thị phiên bản thư viện của client. - Tài liệu hướng dẫn học lập trình web, lập trình ứng dụng với PHP & My SQL - 24 • string mysql_get_host_info ( [resource link_identifier]): trả về chuỗi mơ tả loại kết nối được dùng cho kết nối link_indentifier,bao gồm cả tên của server host. Nếu link_indentifier bị bỏ qua, thì kết nối được mở cuối cùng sẽ được sử dụng. • int mysql_get_proto_info ( [resource link_identifier]): trả về phiên bản giao thức được dùng bởi kết nối link_identifier. Nếu link_identifier bị bỏ qua, kết nối mở cuối cùng sẽ được dùng. • string mysql_get_server_info ( [resource link_identifier]): trả về phiên bản của server được dùng bởi kết nối link_identifier, nếu link_identifier bị bỏ qua, kết nối được mở cuối cùng sẽ được sử dụng. • string mysql_info ( [resource link_identifier]): trả về thơng tin chi tiết về truy vấn cuối cùng sử dụng link_identifier.Nếu link_identifier khơng được chỉ định, liên kết cuối cùng được mở sẽ được thừa nhận. • int mysql_insert_id ( [resource link_identifier]): trả về ID được tạo cho bởi cột AUTO_INCREMENT bởi câu lệnh truy vấn INSERT trước đĩ sử dụng link_identifier được cho. Nếu link_identifier khơng được chỉ định, liên kết mở cuối cùng sẽ được thừa nhận. • resource mysql_list_dbs ( [resource link_identifier]): trả về con trỏ kết quả chứa các cơ sở dữ liệu cĩ sẵn từ daemon mysql hiện hành. • resource mysql_list_fields ( string database_name, string table_name [, resource link_identifier]): truy xuất thơng tin về tên các bảng cho trước. Các tham số là tên các cơ sở dữ liệu hay tên các bảng. • resource mysql_list_processes ( [resource link_identifier]): trả về con trỏ kết quả mơ tả các luồng hiện hành của server. • resource mysql_list_tables ( string database [, resource link_identifier]): lấy tên cơ sở dữ liệu và trả về con trỏ kết quả. • int mysql_num_fields ( resource result): trả về số lượng các trường trong tập hợp kết quả. • int mysql_num_rows ( resource result): trả về số lượng các hàng trong tập hợp kết quả. Hàm này chỉ đúng cho các câu lệnh SELECT. • resource mysql_pconnect ( [string server [, string username [, string password]]]): thiết lập kết nối đến MySQL server. • bool mysql_ping ( [resource link_identifier]): kiểm tra kết nối đến server cĩ làm việc hay khơng. Nếu nĩ khơng làm việc thì một kết lại tự động thực hiện. Hàm này cĩ thể được dùng bởi các script mà giữ nguyên trạng thái nhàn rỗi trong một lúc để kiểm tra xem server cĩ đĩng kết nối và kết nối lại nếu cần thiết hay khơng. Hàm này sẽ trả về TRUE nếu kết nối đến server đang làm việc nếu khơng thì trả về FALSE. • resource mysql_query ( string query [, resource link_identifier [, int result_mode]]): gởi một truy vấn đến cơ sở dữ liệu hiện hành đang hoạt động trên server mà kết hợp với định danh liên kết được chỉ định. Nếu link_identifier khơng được chỉ định, liên kết mở cuối cùng sẽ được thừa nhận. Nếu khơng cĩ liên kết nào được mở, hàm sẽ cố thiết lập một liên kết nếu mysql_connect( ) đã được gọi khơng cĩ tham số nào và dùng nĩ. • string mysql_real_escape_string ( string unescaped_string [, resource link_identifier]): tránh được các kí tự đặc biệt trong unescaped_string, trả về tập hợp kí tự hiện hành của kết nối. • mixed mysql_result ( resource result, int row [, mixed field]): trả về nội dung của một cell từ tập hợp kết quả MySQL. Tham số trường cĩ thể là offset của trường hay là tên trường hay là tên bảng của trường.tên trường. Nếu tên cột cĩ tên hiệu thì sử dụng tên hiệu thay cho tên cột. • bool mysql_select_db ( string database_name [, resource link_identifier]): gán cơ sở dữ liệu hiện hành hoạt động trên server mà kết hợp với định danh liên kết chỉ định. Nếu khơng cĩ định danh liên kết nào được chỉ định thí liên kết mở cuối cùng được thừa nhận. Nếu khơng cĩ liên kết nào được mở thì hàm sẽ cố thiết lập mộ liên kết như khi hàm mysql_connect( ) đã được gọi khơng cĩ tham số và sử dụng nĩ • string mysql_stat ( [resource link_identifier]): trả về tình trạng hiện hành của server. • string mysql_tablename ( resource result, int i): trả về tên bảng của trường, lấy con trỏ kết quả trả về bởi hàm mysql_list_table( ) cũng như chỉ mục integer. • int mysql_thread_id ( [resource link_identifier]): trả về ID của thread hiện hành. Nếu kết nối bị mất và bạn kết nối lại với mysql_ping( ), thì ID của thread sẽ bị thay đổi. ðiều này cĩ nghĩa là bạn khơng nên lấy ID của thread và chứa nĩ cho sau này. Bạn nên lấy nĩ khi nào bạn cần nĩ. • resource mysql_unbuffered_query ( string query [, resource link_identifier [, int result_mode]]): gởi một truy vấn SQL query đến MySQL mà khơng cần các hàng kết quả tìm nạp và đệm một cách tự động như mysql_query( ). - Tài liệu hướng dẫn học lập trình web, lập trình ứng dụng với PHP & My SQL - 25 Sau đây là ví dụ đơn giản trình bày cách kết nối, thực thi câu truy vấn, in các hàng kết quả và ngừng kết nối từ cơ sở dữ liệu MySQL. <?php /* Kết nối,chọn cơ sở dữ liệu */ $link = mysql_connect("mysql_host", "mysql_user", "mysql_password") or die("Could not connect"); print "Connected successfully"; mysql_select_db("my_database") or die("Could not select database"); /* Thực hiện câu truy vấn SQL */ $query = "SELECT * FROM my_table"; $result = mysql_query($query) or die("Query failed"); /* In kết quả ra trang *.HTML */ print "\n"; while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) { print "\t\n"; foreach ($line as $col_value) { print "\t\t$col_value\n"; } print "\t\n"; } print "\n"; /* Free resultset */ mysql_free_result($result); /*ðĩng kết nối */ mysql_close($link); ?> Sự cần thiết của một cơ sở dữ liệu khơng chỉ bởi nhu cầu phục vụ, tạo ra các nguồn tài liệu một cách phong phú, mà bởi sự tăng lên của nhu cầu truy cập các thơng tin "trực tiếp" trong ngày bằng việc sử dụng một giao diện đơn giản và hợp nhất. Bạn cĩ thể cho phép mọi người trong các văn phịng bán hàng truy vấn một cơ sở dữ liệu hàng tồn kho. Cơ sỡ dữ liệu này cĩ thể được xây dựng khác, chạy trên một hệ điều hành hồn tồn khác với máy tính của người dùng. Với một web server cĩ cấu hình tốt, một cơ sở dữ liệu server( chẳng hạn như MySQL), và một vài "phép thần thơng" của PHP, chỉ những thứ người dùng cần mới cĩ thể cĩ trên trình duyệt web. Cuối cùng: nếu bạn cần các thơng tin luơn năng động, cập nhật, bạn cần phải phát triển một cơ sở dữ liệu đằng sau ứng dụng web.Với một cơ sở dữ liệu phía sau, web site của bạn sẽ đạt được một trình độ phức tạp và linh hoạt, nơi mà dữ liệu được tạo ra và sử dụng, thơng tin được làm cho cĩ ý nghĩa với người dùng mà khơng cần phải bắt buộc nĩ phải “đúc nặn” lại cho vừa với cách hiển thị hay tổ chức nĩ. IV. Kiến trúc của một ứng dụng Web Database Các phần cơ bản của ứng dụng Web Database là: Client: trình duyệt web của người dùng, một java applet, một ứng dụng java, thậm chí là một platform phụ thuộc vào chương trình của client. Ứng dụng logic: mã hố các thuật tốn sử dụng trong các scripts CGI, các modul đặc biệt của web server, thậm chí một ứng dụng phụ thuộc vào server. Kết nối database: the database API, hay là các giao thức kết nối thơng thường như ODBC hay JDBC. Database server: RDBMS, ODBMS... Việc thực hiện các ứng dụng đĩ cĩ thể được thực hiện bởi sử dụng mơ hình nhiều lớp, bởi một hay nhiều lớp cĩ thể kết hợp với nhau. Cách thực hiện thơng thường nhất là hệ thống ba lớp. 1. Lớp thứ 1: web client( ví dụ như trình duyệt web của người dùng). - Tài liệu hướng dẫn học lập trình web, lập trình ứng dụng với PHP & My SQL - 26 2. Lớp thứ 2: web server, các scripts của CGI, kết nối API đến database. 3. Lớp thứ 3: database server (ví dụ MySQL server). Mơ hình các lớp cụ thể như sau: ðối với Web site xây dựng bằng PHP&MySQL thì mơ hình ứng dụng web database như sau: Một giao dịch chính của Web database bao gồm các giai đoạn sau: 1. Trình duyệt Web của người dùng sẽ đưa ra một yêu cầu HTTP cho một trang web riêng biệt... Ví dụ, muốn viết ý kiến của mình vào guestbook, sau khi điền vào các thơng tin cần thiết theo yêu cầu vào trong các form HTML, người dùng bấm vào nút “Gởi đi”, thì thơng tin vừa mới viết đĩ sẽ được hiển thị trên trang index.php, 2. Web server sẽ nhận được một yêu cầu cho trang index.php, nĩ sẽ truy xuất file này và chuyển nĩ qua PHP engine để xử lý. 3. PHP engine bắt đầu phân tích script. Bên trong script là một yêu cầu kết nối đến cơ sở dữ liệu và thực thi một truy vấn. PHP mở một kết nối đến MySQL server và gởi trên một truy vấn chính xác. 4. MySQL server nhận một truy vấn dữ liệu và xữ lý nĩ, sau đĩ gởi các kết quả về lại cho PHP engine. 5. PHP engine hồn thành việc chạy script mà thường liên quan đến định dạng các kết quả truy vấn trong HTML. Sau đĩ nĩ trả kết quả HTML về lại Web server. Second Tier Third Tier ODBC/JDBC Database specific API Database HTTP HTTP Web browser Java Applet/ Application Platform dependent Client HTTP Web server + CGI programs/ Servlets/ PHP scripts 3 2 Trình duyệt Web server PHP engine MySQL server 1 6 5 4 - Tài liệu hướng dẫn học lập trình web, lập trình ứng dụng với PHP & My SQL - 27 6. Web server chuyển HTML về lại trình duyệt, nơi mà bạn cĩ thể thấy danh sách các quyển sách mà bạn đã yêu cầu. Quá trình này là căn bản tương tự đối với các script engine hay các database server mà chúng ta dùng. Thường thì một phần mềm Web server, PHP engine, và database server tất cả cùng chạy trên cùng một máy. Tuy nhiên, việc database server chạy trên một máy khác cũng là điều khá thơng dụng. Bạn cĩ thể làm được điều này bởi các lý do bảo mật, tăng dung lượng .
File đính kèm:
- tai_lieu_huong_dan_ve_lap_trinh_php_va_mysql.pdf