MainRegistrationLogin I'm LeHunGvna Thứ 5, 28/11/2024, 20:34:56
  Sử dụng CSDL MySQL - Diễn Đàn Welcome Guest | RSS

[ New messages · Members · Forum rules · Search · RSS ]
  • Page 1 of 1
  • 1
Forum moderator: lehungvna  
Sử dụng CSDL MySQL
lehungvnaDate: Chủ Nhật, 21/09/2008, 16:11:00 | Message # 1
Admin
Group: Administrators
Messages: 227
Reputation: 0
Status: Offline
CSDL là 1 phần quan trọng không thể thể thiếu được trong các ứng dụng web chuyên nghiệp.

MySQL từ lâu đã là hệ CSDL được dùng phổ biến nhất với PHP vì tính gọn nhẹ, nhanh, miễn phí và được PHP hỗ trợ sẵn. Trong bài viết này chúng ta sẽ tìm hiểu cách kết nối vào CSDL MySQL, truy cập và lưu trữ dữ liệu với PHP.

Để thực hành các ví dụ trong bài viết này, bạn cần phải cài MySQL vào máy của bạn. Bạn có thể tham khảo bài viết cài đặt MySQL Server 4.1 trên Windows ở địa chỉ này: http://www.diendantinhoc.net/?cat=database_mysql&article=41cca76d6c. Xem như bạn đã cài đặt MySQL lên cùng server với PHP và account để kết nối vào MySQL Server có username là root và mật mã (password) là rỗng.

Ngoài ra, bài viết này giới thiệu về cách làm việc với CSDL MySQL trong PHP, cho nên xem như là bạn đã có một số kiến thức căn bản về MySQL và ngôn ngữ SQL. Bạn có thể tham khảo bài viết Tự học về ngôn ngữ SQL ở địa chỉ này: http://www.diendantinhoc.net/tute/sql/tuhocsql/.

KẾT NỐI VÀO MYSQL SERVER

PHP cung cấp hàm mysql_connect để kết nối vèo MySQL server. Cú pháp của hàm này như sau:

mysql_connect($server_address, $username, $password)

$server_address là địa chỉ của MySQL server, có thể là domain name hoặc IP address, các ví dụ trong bài viết này sẽ dùng giá trị "localhost" cho $server_address.
$username là tên account dùng để login vào MySQL server, các ví dụ trong bài viết sẽ sử dụng giá trị "root" cho $username.
$password là mật mã để kết nối vào MySQL server, các ví dụ trong bài viết sẽ sử dụng chuỗi rỗng "" làm mật mã.
Hàm mysql_connect sẽ trả về 1 kết nối đến MySQL server nếu như quá trình kết nối thành công, hoặc trả về giá trị FALSE nếu như kết nối không được.

Để đóng kết nối tới MySQL server, PHP cung cấp hàm mysql_close. Đoạn mã sau ví dụ quá trình kết nối vào MySQL server và đóng kết nối.

Code:
<php>

CHỌN CSDL ĐỂ LÀM VIỆC

Sau khi connet vào MySQL server, thao tác tiếp theo là chọn CSDL để làm việc. PHP cung cấp cho ta hàm mysql_select_db để làm việc này. Cú pháp của hàm này như sau:

mysql_select_db($db_name[, $conn])

Với $db_name là tên CSDL cần chọn, $conn là kết nối được thực hiện qua lệnh mysql_connect. Các ví dụ trong bài viết này sẽ sử dụng CSDL có tên là test:

Code:
<php>

THỰC THI 1 CÂU LỆNH SELECT VÀ LẤY KẾT QUẢ TRẢ VỀ

PHP cung cấp cho ta 3 hàm hữu dụng để thực hiện công việc này:

$result = mysql_query($sql, $conn): thực hiện câu lệnh SQL được cung cấp qua tham số $sql và trả về 1 kết quả kiểu $result (hàm này trả về FALSE nếu như câu lệnh thực hiện không thành công).
mysql_num_rows($result): hàm này trả về số lượng row lấy được qua câu lệnh SELECT (được thực thi bởi hàm mysql_query) trước đó.
$row = mysql_fetch_row($result), $row = mysql_fetch_assoc($result): trả về dòng kết quả hiện thời của câu lệnh select và chuyển con trỏ tới dòng tiếp theo (như vậy lệnh gọi mysql_fetch_row hoặc mysql_fetch_assoc tiếp đó sẽ trả về dòng tiếp theo); hoặc giá trị FALSE nếu như không còn dòng nào để trả về nữa. Kết quả trả về từ 2 hàm này là 1 array.
mysql_error($conn): trả về thông báo lỗi của MySQL server nếu như một lệnh trước đó có lỗi.
Để hiểu rõ hơn công dụng của các hàm trên, đồng thời phân biệt sự khác nhau giữa 2 hàm mysql_fetch_row và mysql_fetch_assoc, ta cung xem xét các ví dụ sau.

Các ví dụ của ta sẽ sử dụng table có tên là member với các trường và dữ liệu như sau:

username
password

abc
123

def
456

Ví dụ 1: dùng mysql_fetch_row()

Code:
<php>

Hàm mysql_fetch_row() sẽ trả về 1 array mà phần tử thứ [0] sẽ tương ứng với cột đầu tiên của table, phần tử thứ [1] sẽ tương ứng với cột thứ hai của table...Chương trình trên sẽ in ra ra 4 dòng:

Username = abc

Password = 123

Username = def

Password = 456

Ví dụ 2: dùng mysql_fetch_assoc()

Code:
<php>

Hàm mysql_fetch_assoc() sẽ trả về 1 array mà các phần tử sẽ được truy cập qua tên, với tên được lấy từ tên các cột của table. Chương trình ví dụ 2 cũng sẽ in ra ra 4 dòng:

Username = abc

Password = 123

Username = def

Password = 456

THỰC THI 1 CÂU LỆNH UPDATE, INSERT hoặc DELETE

Hàm mysql_query cũng được dùng để thực thi các câu lệnh DELETE, INSERT hoặc UPDATE, nhưng lúc này hàm sẽ trả về TRUE nếu câu lệnh thực hiện thành công và FALSE trong trường hợp ngược lại. Để lấy số lượng các row được chèn với lệnh INSERT hoặc bị thay đổi bởi lệnh UPDATE, PHP cung cấp cho ta hàm mysql_affected_rows. Ta hãy xem ví dụ sau:

Code:
<php>

LƯU Ý VẤN ĐỀ BẢO MẬT VỚI LỖI SQL INJECTION

Nếu bạn cần cung cấp 1 tham số cho câu lệnh SQL, nhất là các tham số từ trình duyệt do người dùng nhập vào, bạn hãy lưu ý đề phòng lỗi bảo mật SQL Injection. Giả sử bạn muốn thay đổi mật mã của account xyz, mật mã mới được người dùng nhập vào và lưu vào trong biến $newPwd, đoạn mã đổi password có thể tương tự như sau:

Code:
<php>

Giả sử người dùng nhập vào mật mã mới là zzz, câu lệnh SQL sẽ trở thành
UPDATE member SET password='zzz' WHERE username='xyz'
Hoàn toàn hợp lệ và đúng đắn, không có gì phải thắc mắc hết.

Nhưng giả sử người dùng nhập vào mật mã mới là zzz'#, câu lệnh SQL sẽ trở thành
UPDATE member SET password='zzz'#' WHERE username='xyz'
Nhưng gì phía sau ký tự # sẽ được MySQL xem là chú thích và sẽ bỏ qua, như vậy câu lệnh SQL của chúng ta trên thực tế sẽ tương đương với:
UPDATE member SET password='zzz'
Vậy là xong! Sau khi chạy câu lệnh này, password của tất cả các account đều là zzz hết, tất hiên là account admin cũng sẽ bị đổi password thành zzz và lúc này hậu quả tiếp theo ra sao chắc bạn cũng đã rõ!

Để tránh bị SQL injection, khi đưa các tham số vào câu lệnh SQL, bạn nên luôn nhớ và áp dụng 2 điều sau:

Nếu tham số là số (số nguyên hoặc số thực), cộng thêm 0 vào tham số trước khi đưa vào câu lệnh SQL. Tức là:
$thamso+=0;
$sql = "...$thamso...";
Nếu tham số là chuỗi, sử dụng hàm mysql_real_escape_string trước khi đưa tham số vào câu lệnh SQL. Tức là:
$thamso = mysql_real_escape_string($thamso, $conn);
$sql = "...'$thamso'...";
TRƯỚC KHI KẾT THÚC

Đến đây, bạn đã nắm được các bước cơ bản để làm việc với CSDL MySQL Server:
- Kết nối vào MySQL Server với server address, username và password
- Chọn CSDL để làm việc
- Thao tác với CSDL, Thực thi các lệnh SQL...
- Đóng kết nối khi kết thúc

Trong thực tế, đôi lúc chương trình của bạn cần thực hiện thêm nhiều thao tác nâng cao hơn thế, lúc này bạn đừng quên tham khảo MySQL Manual mục các hàm về MySQL.

CÁC HÀM PHP ĐƯỢC DÙNG TRONG VÍ DỤ

die: in ra câu thông báo và kết thúc chương trình.
mysql_connect: kết nối vào CSDL MySQL Server.
mysql_close: đóng kết nối đã được thiết lập trước đó.
mysql_error: lấy câu thông báo lỗi (nếu có) trả về từ MySQL Server.
mysql_fetch_row: lấy 1 row kết quả từ câu lệnh SELECT.
mysql_fetch_assoc: lấy 1 row kết quả từ câu lệnh SELECT.
mysql_free_result: giải phóng bộ nhớ sau khi lấy kết quả trả về từ câu lệnh SELECT.
mysql_query: thực thi 1 câu lệnh SQL.
mysql_select_db: chọn CSDL để làm việc.
mysql_real_escape_string: escale 1 chuỗi trước khi chèn vào câu lệnh SQL.


Name: Lê Mạnh Hùng
Y!M: lehungvna or to_tin_hoc
Phone: 0988.777.909 or 0912.51.66.40
Email: hunglm.nro@vietnamair.com.vn
Blog: http://360.yahoo.com/lehungvna
Website: http://lehungvna.do.am
 
  • Page 1 of 1
  • 1
Search:

 

Copyright MyCorp © 2024