1.3.1 Giới thiệu về MySQL
MySQL là một hệ quản trị cơ sở dữ liệu quan hệ mạnh mẽ và tốc độ. MySQL cho phép bạn lƣu trữ, tìm kiếm, sắp xếp và lấy dữ liệu rất hiệu quả và nhanh chóng. Cơ sở dữ liệu chủ MySQL điều khiển việc truy cập dữ liệu, cho phép nhiều ngƣời dùng cùng truy cập đồng thời mà an toàn và nhanh chóng. Do đó MySQL trở thành một hệ quản trị cơ sở dữ liệu chủ đa ngƣời dùng và đa luồng. Nó sử dụng ngôn ngữ truy vấn có cấu trúc SQL, là ngôn ngữ truy vấn cơ sở dữ liệu chuẩn trên thế giới hiện nay.
1.3.2 Quản trị cơ sở dữ liệu trong MySQL Định danh trong MySQL Định danh trong MySQL
Qui tắc định danh rất đơn giản, gồm một số qui tắc nhƣ sau:
• Không dùng ký tự có mã ASCII(O) và mã ASCII(255) để định danh cho các loại đôi tƣợng(nhƣ tên bảng, tên cột, tên database, tên alias,...)
• Nếu trong định danh có khoảng trắng thì định danh phải đƣợc đặt trong cặp dấu nháy đơn ( ‗ trƣờng hợp này chỉ dùng cho các phiên bản MySQL 3.23.6 trở lên. • Các phiên bản MySQL 3.23.6 trở xuông không đƣợc dùng khoảng trắng khi
định danh các đôi tƣợng kể cả khi định danh đƣợc đặt trong cặp dấu nháy đơn ( ‗ ‗ ).
• Các trƣờng hợp khác để định danh cho mọi đối tƣợng trong MySỌL phải tuân theo nguyên tắc sau:
Đối tƣợng cần định danh
Chiều dài
tối đa Trƣờng hợp tƣơng tự Ký tự đƣợc dùng
Cơ sở dữ liệu 64
Cách định danh cho một thƣ mục trong hệ điều hành
Mọi ký tự cho phép ngoại trừ ký tự ― / ‖
Bảng 64 Cách định danh cho một
tập tin trong hệ điều hành
Mọi ký tự cho phép ngoại trừ ký tự ― / ‖ và dấu ― . ‖
31
Cột 64 Không có Mọi ký tự
Bí danh 255 Không có Mọi ký tự
Bảng 1-1: Bảng định danh a. Vấn đề phân quyền và ngƣời dùng
Mỗi hệ thống MySQL có thể có nhiều ngƣời sử dụng đồng thời. Vì lý do bảo mật nên ngƣời quản trị hệ thông cần phải bảo vệ tài khoản và mật khẩu truy cập vào root. Khi có một ngƣời dùng khác cần sử dụng hệ thông, ngƣời quản trị cần cấp cho ngƣời dùng này một tài khoản và mật khẩu riêng để log vào hệ thống. Ngoài ra cần phải cấp cho ngƣời này một số quyền tối thiểu để thực hiện một vài thao tác. Các quyền này dùng để xác định những điều gì ngƣời dùng này có thể làm đƣợc và những gì không thể làm đƣợc.
Hệ thống phân quyền của MySQL gồm các cấp độ nhƣ sau: - Toàn quyền sử dụng
- Các quyền trên cơ sở dữ liệu - Quyền trên các bảng (table) - Quyền trên các cột (column)
Các cấp độ phân quyền đƣợc chia thành hai nhóm quyền nhƣ : nhóm các quyền cho ngƣời dùng và nhóm các quyền dùng để quản trị.
Phân quvển nhóm ngƣời dùng: Bạn chỉ nên cấp cho ngƣời dùng các quyền trên cơ sở dữ liệu, trên các bảng (table) hoặc trên các cột (column) nhƣ sau:
Phạm vi áp dụng Cấp quyền Mô tả
Cơ sở dữ liệu CREATE Tao môt cơ sở dữ liêu mới
DROP Xoá cơ sở dữ liêu
Bảng (table)
SELECT Cho phép lấy các mẫu tin trong bảng
INSERT Thêm một dòng mới vào các bảng
UPDATE Câp nhật mới các giá trị của bảng
32
INDEX Cho phép tạo và xoá các chỉ mục đặc biệt
trong bảng
ALTER Chỉnh sửa cấu trúc của bảng nhƣ đổi tên
bảng
CREATE Tạo một bảng mới
DROP Xoá một bảng
Cột (column)
SELECT Cho phép lây các mẫu tin trong cột
INSERT Thêm một dòng mới vào cột
UPDATE Cập nhật mới các giá trị trong cột
Bảng 1-2: Bảng phân quyền nhóm ngƣời dùng
Phân quyển nhóm quản trị hệ thống : Bạn có thể cấp các quyền này cho một ngƣời dùng đặc biệt nào đó để ngƣời này có thể quản lý hệ thống.
Cấp quyền Mô tả
RELOAD Cho phép đƣợc Reload
SHUTDOWN Cho phép một nhà quản trị có thể tắt hệ thông MySQL server
PROCESS Cho phép một nhà quản trị có thể xem các tiến trình xử lý trên server và ngăn chặn chúng.
FILE Cho phép lấy dữ liệu từ các tập tin và đọc vào các bảng.
Bảng 1-3: Bảng phân quyền móm quản trị hệ thống
Các quvển đăc biêt khác: ngƣời quản trị hệ thống có thể cấp các quyền tổng quát này cho một ngƣời dùng mới để tiết kiệm thời gian phân quyển chi tiết:
Cấp quyền Mô tả
ALLhay ALL PRIVILEGES
Cho phép một ngƣời dùng có toàn quyền trên mọi cơ sở dữ liệu, mọi bảng, mọi cột, kể cả nhóm quyền dùng để quản trị hệ thống.
USAGE
Khi một ngƣời dùng đƣợc cấp quyền này, ngƣời đó chỉ có thể đăng nhập (log) vào hệ thống mà không thể làm bất cứ điều gì khác, các quyền khác có thể đƣợc cấp sau (nếu có thể).
33
Bảng 1-4: Bảng cấp quyền cho thành viên b. Câu lệnh dùng để cấp quyền
Bạn có thể dùng câu lệnh này để tạo một tài khoản và mật khẩu cho một ngƣời dùng mới và phân cho ngƣời này các quyền chi tiết để sử dụng trong hệ thống.
Dạng tổng quát của câu lệnh này nhƣ sau: GRANTpriveleges[columns]
ON item
TO user_name [ IDENTIFIED BY ‗password’]
[ WITH GRANT OPTION ] Mô tả:
• priveleges : danh sách các quyền cần cấp (các quyền đã đƣợc mô tả ở trên) • [columns] : phạm vi các quyền đƣợc sử dụng trên một cột cụ thể hay trên danh
sách các cột.
• item : cung cấp tên cơ sở dữ liệu hoặc tên bảng mà các quyền mới cấp này áp dụng lên. Bạn có thể sử dụng các ký hiệu đặc biệt thay cho một danh sách cần cung cấp nhƣ sau:
Đại diện cho mọi cơ sở dữ liệu nằm trong hệ thống.
Đại diện cho mọi cơ sở dữ liệu và mọi bảng nằm trong hệ thống dbname.*
Cung cấp danh sách tất cả các bảng nằm trong cơ sở dữ liệu có tên dbname. dbname.tablename Chỉ định một bảng có tên dbname nằm trong cơ sở dữ liệu có tên dbncime.
• user_name : Chỉ định tên một ngƣời dùng đƣợc cấp các quyền mới này. Nếu MySỌL không tìm thấy tên user_name này trong danh sách các user của hệ thống MySQL thì hệ thống sẽ tự động tạo ra một user mới với tên user_name và cập nhật vào hệ thống.
• [ IDENTIFIED BY ípassword‘] : Chỉ định mật khẩu đi kèm với tên user_name
trên.
• [ WITH GRANT OPTION] : Nếu câu lệnh cấp quyền có phần này, nghĩa là ngƣời có tên user_name ở trên có thể cấp lại các quyền này cho một ngƣời khác .
34
c. Câu lệnh dùng để rút quyền
Để rút lại các quyền đã cấp cho một ngƣời dùng, bạn có thể dùng câu lệnh REVOKE dƣới dạng tổng quát nhƣ sau:
REVOKE priveleges [columns] ON item
FROM user_name
Mô tả:
• priveleges : danh sách các quyền cần rút lại
• [columns] : phạm vi các cột hay trên danh sách các cột cần rút quyền.
• item : cung cấp tên cơ sở dữ liệu hoặc tên bảng nằm trong phạm vi đã cấp quyền trƣớc đó mà ta cần rút quyền. Chúng ta có thể sử dụng các ký hiệu đặc biệt để thay cho một danh sách các cột cần cung cấp.
• user_name : Chỉ định tên ngƣời dùng cấn rút quyền. Nếu MySQL không tìm thấy tên user_name này trong danh sách các user của hệ thống
35
1.4 Tìm hiểu về PHP 1.4.1 Giới thiệu về PHP 1.4.1 Giới thiệu về PHP a. Khái quát về PHP
PHP (Personal Home Page) là ngôn ngữ kịch bản phía Server. Đoạn mã PHP nhúng vào một trang HTML sẽ đƣợc thực thi tại Web server mỗi khi trang đƣợc gọi.
PHP là một sản phẩm có mã nguồn mở, đƣợc biết đến từ năm 1994 do một tổ chức tƣ nhân thiết kế. Phiên bản PHP mới nhất hiện nay là PHP 4 và có khoảng trên năm triệu Web site trên thế giới hiện đang sử dụng ngôn ngữ này.
b. PHP và các hệ quản trị cơ sở dữ liệu
PHP hầu nhƣ hỗ trợ cho tất cả mọi hệ quản trị cơ sở dữ liệu hiện nay nhƣ: Adabas, dBase, filePro, mSQL, MySQL, Oracle, PostgreSQL, Solid, Sybase, Sybase-CT, Velocis,... , bạn có thể kết nối trực tiếp với hệ quản trị cơ sở dữ liệu bằng các hàm mà PHP hỗ trợ (nếu có) hay kết nốì gián tiếp thông qua một cầu nốì ODBC , JDBC đều đƣợc.
Trang test.PHP minh hoạ dƣới đây là một ví dụ về cách kết nối trực tiếp từ các hàm PHP đến hệ quản trị cơ sở dữ liệu MySQL để lấy dữ liệu cho trang web.
<html>
<head><title>Test page</title> </head> cbody bgcolor=#ffffff>
<? mysql_connect("localhost", "username", "password"); Squery = "SELECT name, phone FROM mytable";
Sresult = mysql_db_query("example", $query); if (Sresult) { echo "Found these entries in the database:<ul>"; while ($r = mysql_fetch_array($result)) {
$name = $r["name"];
$phone = $r["phone"]; echo "<li>$name, $phone"; }
36 } else {
echo "No data."; } mysql_free_result($result); ?> </body> </html> 1.4.2 Ứng dụng PHP
a. Lƣu trữ và truy xuất dữ liệu từ tập tin
Có ba bƣớc để viết dữ liệu vào tập tin đó là: mở tập tin (nếu tập tin chƣa tồn tại thì tập tin sẽ đƣợc tạo), viết dữ liệu vào tập tin, đóng tập tin.
Có ba bƣớc để đọc dữ liệu từ tập tin: Mở tập tin (nếu tập tin không thể mở thì ta chấp nhận và thoát khỏi), đọc dữ liệu từ tập tin, đóng tập tin.
Mở tập tin:Có ba cách chọn khi mở tập tin:
Bạn muôn mở tập tin chỉ đọc, chỉ viết hay có cả hai thuộc tính đọc và viết. Nếu viết vào tập tin, bạn muốn viết đè lên nội dung đã có của tập tin hay thêm dữ liệu mới vào cuối tập tin.
Nếu bạn đã viết vào tập tin trên hệ thống mà sự khác nhau giữa các tập tin kiểu văn bản và kiểu nhị phân, bạn muốn chỉ định điều này.
Sử dụng fopen() để mở tập tin: Có thể dùng hàm fopen() mở tập tin nhƣ sau: $fp = fopen (―$DOCUMENT_ROOT/../part – to – your – file/ file _name‖, ― w ‖
Khi hàm này đƣợc gọi, nó thực thi với hai hoặc ba tham số. Thƣờng thì chúng ta dùng hai tham số.
Tham số thứ nhất làtập tin bạn muốn mở. Bạn có thể chỉ đƣờng dẫn đến tập tin này. Ta dùng PHP để xây dựng biến $DOCUMENT_ROOT. Biến này chỉ vào cây tài liệu cơ bản trên Web server của bạn. Chúng ta sử dụng ― ... ‖ có nghĩa là thƣ mục hiện hành của thƣ mục $DOCUMENT_ROOT. Thƣ mục này
37
ở bên ngoài cây tài liệu vì lý do bảo mật. Đƣờng dẫn này gọi là đƣờng dẫn quan hệ để mô tả vị trí trong hệ thống tập tin quan hệ với $DOCUMENT_ROOT.
Thamsố thứ haicủa fopen() là chế độ tập tin. Chế độ này cho biết bạn muốn làm gì trên tập tin. Sau đây là một số các chế độ trong fopen():
Chế độ Ý nghĩa
R Chế độ đọc_mở tập tin để đọc, bắt đầu từ tập tin khởi đầu.
r+ Chế độ đọc_mở tập tin để đọc và viết, bắt đầu từ tập tin khởi đầu.
w
Chế độ viết_mở tập tin để viết, bắt đầu từ tập tin khởi đầu. Nếu tập tin đã tồn tại rồi thì xoá nội dung đã có. Nếu tập tin chƣa tồn tại thì tạo tập tin mới.
w+
Chế độ viết_mở tập tin để viết và đọc, bắt đầu từ tập tin khởi đầu. Nếu tập tin đã tồn tại rồi thì xoá nội dung đã có. Nếu tập tin chƣa tồn tại thì tạo tập tin.
A Chế độ thêm_ mở tập tin để thêm vào (viết), bắt đầu từ nội dung đã có. Nếu tập tin chƣa tồn tại thì tạo tập tin.
a+ Chế độ thêm_ mở tập tin để thêm vào (viết) và đọc, bắt đầu từ nội dung đã có. Nếu tập tin chƣa tồn tại thì tạo tập tin.
B
Chê độ nhị phân_đƣợc sử dụng trong việc liên kết với một trong những chế độ khác. Bạn muốn dùng chê độ này nếu hệ thông tập tin của bạn khác nhau giữa tập tin nhị phân và tập tin văn bản. Hệ thống Windows thì khác nhau còn Unix thì không.
Bảng 1-5: Bảng tham số
Tham số thứ ba của fopen() là tuỳ chọn. Bạn sử dụng tuỳ chọn nếu bạn muôn tìm đƣờng dẫn (include_path) đến tập tin. Nếu bạn muốn dùng thì bạn phải thiết lập tham số này thành 1. Nếu dùng tham số này thì không cần thêm tên thƣ mục hay đƣờng dẫn đến tập tin. Ví dụ:
$fp = fopen (―file_name”, ―a ‖, 1);
Nếu mở tập tin thành công, con trỏ chỉ đến tập tin đƣợc trả về và đƣợc lƣu trong một biến, trong trƣờng hợp này là $fp sử dụng biến này để truy xuất tập tin.
38
Nếu tên tập tin bắt đầu với http:// thì một kết nối HTTP đƣợc mở đến server và kết quả sẽ đƣợc trả về. Khi dùng chế độ HTTP, bạn phải có dấu /.
Hàm fopen() không hỗ trợ HTTP chuyển hƣớng, vì thế phải chỉ ra URL tham chiếu tới thƣ mục sau dấu /.
Lỗi thƣờng gặp khi mở tập tin là cố mở một tập tin không cho quyền đọc và viết. PHP sẽ cảnh báo.
Viết tập tin: Viết vào tập tin trong PHP tƣơng đốì đơn giản. Có thể dùng hàm fwrite() (viết vào tập tin) hoặc fputs() (đặt chuỗi vào tập tin), fputs() là bí danh của fwrite(). Gọi hàm fwrite() nhƣ sau:
fwrite($fp, $outputstring);
Hàm fwrite() có 3 tham số nhƣng tham số thứ ba là tuỳ chọn, cấu trúc chung của fwrite() là:
fwrite(int fp, string str, int [length]);
Tham số thứ ba của fwrite(), length, số byte tối đa đƣợc viết vào. Nếu có dùng tham số này thì fwrite() sẽ viết chuỗi vào tập tin đƣợc chỉ đến bởi fp cho đến khi kết thúc chuỗi hay kết thúc số byte chiều dài.
Đóng tập tin: Khi dùng xong một tập tin thì cần phải đóng tập tin. Nên dùng với hàmfclose(): fclose($fp);
Hàm này trả về giá trị đúng nếu tập tin đóng thành công hoặc sai nếu không thành công.
Đọc từ tập tin: Trƣớc tiên là mở tập tin để đọc: fopen().
Khi nào ngừng mở tập tin thì gọi hàm feof(): Hàm feof() sẽ trả về giá trị đúng nếu con trỏ tập tin ở tại vị trí kết thúc tập tin. Mặc dù tên nghe lạ nhƣng dễ nhớ khi biết feof là: File End Of File.
Đọc một dòng một lần: fgets(), fgetss(), fgetcsv() $order = fgets($fp, 100);
Hàm này dùng để đọc một dòng từ tập tin. Hàm sẽ đọc đến khi bắt gặp ký tự (\n), bắt gặp một EOF, hay đọc 99 byte từ tập tin. Chiều dài tốì đa để đọc bằng chiều dài trừ đi một byte.
39
Có nhiều hàm khác nữa dùng để đọc tập tin. Hàm fgets() thông dụng khi giải quyết các tập tin có chứa văn bản thuần tuý.
Một biến thể của fgets() là fgetss().
String Fgetss(int fp, int length, string [allowable tags]):
Hàm fgetcsv() là biến thể khác của fgets(). Hàm này dùng để ngắt những dòng trong tập tin khi bạn dùng ký tự phân ranh, nhƣ ký tự tab, hay dấu phẩy.
Đọc cả tập tin: readfile(), fpassthru(), file()
Thay vì đọc mỗi lần một dòng thì ta đọc cả tập tin. Có 3 cách thực hiện:
Cách thứ nhất dùng readfile(), gọi hàm readfile() để mở tập tin, hiển thị nội dung chuẩn và đóng tập tin. Mẫu của readfile():
Int readfìle(stringfilename, int[use_include_path]);
Cách thứ hai dùng fpassthru(). Dùng fopen() để mở tập tin trƣớc. Sau đó gửi một tập tin nhƣ gửi đôi số vào fpassthru(), nó sẽ kết xuất nội dung của tập tin từ vị trí con trỏ hƣớng tới xuất chuẩn. Đóng tập tin khi đã hoàn thành. Hàm này trả về giá trị đúng nếu đọc thành công và sai khi không thành công.
Cách thứ ba dùng hàm file(). Hàm này thay vì hiển thị để xuất, nó đƣa vào một mảng.
Ví dụ: $filearray = file($fp);
Nó sẽ đọc cả tập tin vào mảng $filearray. Mỗi dòng của tập tin sẽ đƣợc lƣu trong mỗi phần tử của mảng.
Đọc một ký tự fgetc(): Để đọc mỗi lần một giá trị từ tập tin ta dùng hàm fgetc(). Nó tạo con trỏ tập tin nhƣ một tham số và trả về ký tự kế trong tập tin.
Đọc một chiều dài bất kỳ: Ta dùng hàm fread()
Sử dụng hàm fread() để đọc số byte chiều dài từ tập tin. Hàm này sử dụng nhƣ sau:
String fread( intfp, int length);
Kiểm tra tập tin có tồn tại không: Ta dùng hàm file_exists()
Nếu muôn kiểm tra một file xem có tồn tại không mà không cần mở nó ta dùng hàm file_exists().
40
Echo filesize(―$DOCUMENT_ROOT/../orders/orders.txt‖); Có thể dùng với fread để đọc cả tập tin.
Xóa tập tin: Ta dùng hàm unlink()
unlink( ―$DOCUMENT_ROOT /. ./orders/orders .tx t ‖); Hàm trả về sai nếu tập tin chƣa đƣợc xóa.
Vị trí bên trong tập tin: Ta dùng hàm rewind 0, fseek(), ftell()