
Hướng dẫn viết một website PHP căn bản từ A-Z (p2)

Trong phần 1 chúng ta đã tìm hiểu về database và cấu trúc của một website. Trong phần này mình sẽ tiếp tục với các hàm để lấy cơ sở dữ liệu lên các action và widget hay gọi đơn giản hơn là phần Thêm, đọc, sửa, xóa (CRUD) cơ sở dữ liệu trong PHP.. Nếu bạn chưa đọc phần 1 có thể đọc lại tại: Hướng dẫn viết một website PHP căn bản từ A-Z (p1).
Hàm lấy danh sách dữ liệu
- Để tiện cho việc lấy một loạt dữ liệu, mình sẽ tạo một hàm lấy danh sách dữ liệu với đoạn code như sau:
- Đây là hàm bắt buộc truyền tham số. Tham số ở đây là một câu
select sql
. - Đầu tiên là sử dụng hàm
openconnect();
để mở kết nối đến database. - Sử dụng
mysqli_query
để truy vấn dữ liệu và lưu vào biến$result
. - Hoàn thành truy vấn thì dùng hàm
closeconnect()
; để đóng kết nối. - Dùng hàm if kiểm tra thử nếu biến
$result
lỗi có thể cho dừng. - Tiếp theo khai báo một biến
$list
là một kiểu mảng. - Sử dụng hàm lặp
while
để đưa các kết quả từng dòng của$result
về một biến.$row. fetch_assoc()
là một lệnh để mình lấy ra một mảng đa chiều, nó là một đối tượng. - Từng dòng một sẽ được
insert
vào mảng$list
. - Sử dụng hàm
mysqli_free_resul()
để giải phóng bộ nhớ. - Cuối cùng là trả về danh sách đó là biến
$list
.
Hàm lấy 1 dòng dữ liệu
- Ngoài việc lấy ra một tệp danh sách thì mình cũng sẽ tạo ra một hàm để lấy 1 dòng dữ liệu. Mặc dù có thể dùng chung hàm. nhưng mà mình đưa ra như thế này để hàm lặp đỡ phải sử dụng nhiều do truy vấn 1 dòng thường rất phổ biến.
- Không khác gì với hàm ở trên nên minh không giải thích lại. ở đây bạn chỉ cần thay cái hàm lặp thành một biến
$row
và nhét dữ liệu vào, sau đó là return nó về là đủ.
Hàm thêm dữ liệu
- Đây là hàm chắc chắn sẽ viết rồi. hàm này mình đã tối ưu rất kỹ bao gồm việc bảo vệ cho đoạn query tránh bị lỗi hoặc cố tình gây phá hoại bằng phương pháp SQL Injection. Hàm này được code như sau.
- Đầu tiên bạn khởi tạo hàm
insert_data
và cho phép truyền vào hai tham số là tên bảng (biến$table
) và dữ liệu là một mãng (biến$data
). - Trước khi thao tác với CSDL bạn nên mở kết nối đến nó. Mình sẽ gọi hàm mở kết nối đã viết.
openconnect()
; - Tiếp theo bạn cũng gọi biến
$conn
vào, nhưng nhớ thêmglobal
. - Mình sẽ tạo ra hai biến là
$field
và$values
để lưu giá trị lặp trong biến$table
. - Bây giờ thì sẽ lặp cái
$data
để lấy ra các$key
và$val
. Biến mảng mình truyền vào là một mảng liên hợp. - Trong hàm lặp mình sẽ nối các
$key
lại và được ngăn cách bởi dấu “,” đưa vào biến$field
. các cái$val
sẽ được nối lại và cũng được ngăn cách bởi đấu “,” đưa vào biến$values
. Ở đây mình sử dụng hàmmysqli_real_escape_string
để khử đi các ký tự gây nhầm lẫn trong câu lệnh SQL. Đây là điểm mấu chốt của việc chống SQL Injection. - Tiếp theo tạo một biến
$cmd
để lưu chuỗi lệnh cmd được nối vào từ các thông tin đã lưu trên. Hàmtrim
trên là để loại bỏ đi dấu “,” dư ở mỗi biến lúc trên mình nối. - Đưa biến chuỗi
$cmd
vào lệnhmysqli_query
để thực thi và trả về kết quả. - Cuối cùng là gọi hàm
closeconnect()
để đóng kết nối sau khi thực thi.
Hàm sửa dữ liệu
- Điều kiện truyền vào ở hàm sửa nhiều hơn rất nhiều so với hàm thêm, bở hàm cần xác định được đối tượng cần sửa. Để dễ hiểu các bạn hãy xem hàm sau.
- Với hàm này bạn sẽ cần truyền thêm hai tham số vào là
$idfield
và$idvalue
ngoài$table
và$data
. Mình sẽ giải thích kỹ hơn ở phần test các hàm. - Mình sẽ không nói đến các phần lặp lại. Ở đây mình tạo ra một biến
$set
và dùng hàm lặp tương tự bên trên để ghép các$key
và$val
thành chuỗi đưa vào biến$set
. - Tiếp theo tạo biến
$cmd
và chèn các biến vào đúng cú pháp của một câu Update. Ở câu này có một điều kiệnwhere
và bạn hãy đưa$idfield
và$idvalue
vào. - các phần cuối này tương tự câu ở trên.
Hàm xóa dữ liệu
- Đây là hàm cuối cùng trong các hàm thực thi dữ liệu, và nó cũng là hàm ngắn ngọ nhất. Code của hàm như sau:
- Ở hàm này mình chỉ cần vào
$table
,$idfield
và$idvalue
. - Nhìn code trên bạn sẽ hiểu vì nó có tất cả những cái hàm trên nên mình không giải thích thêm về hàm này.
Hàm đếm dữ liệu
- Đây là hàm mình bổ sung thêm để lấy số liệu hàng trả về. Số này sẽ được dùng để phân trang sau này.
- Hàm này mình đưa vào câu lệnh select count (biến
$cmd
) và biến ($counts
) là tên trường AS mình đặt trong câu cmd. Mình sẽ giải thích kỹ hơn trong phần sau.
Kiểm tra thử các hàm
Khi viết xong hàm, bạn nên test nó để biết chắn chắn nó hoạt động nhé. Bây giờ mở file home.php
trong thư mục action lên và tiến hành code để test từng đoạn như sau. Lưu ý là bạn phải kết nối đến CSDL rồi nhé. Nếu chưa được thì bạn xem lại phần 1.
Bạn cần require cái file data.php vào để kết nối CSDL.
require (SYSPATH.'data.php');
Kiểm tra lấy 1 dòng dữ liệu
$list = select_row('SELECT * FROM user');
var_dump($list);
- Câu này đơn giản là gọi hàm
select_row
và truyền vào một câu lệnh select và gán hàm này cho biến$list
để lấy dữ liệu. Thật ra đây là câu lệnh mình demo thôi. Thường thì bạn phải cówhere
để lấy chính xác hơn. Câu này chỉ trả về một hàng dữ liệu đầu tiên. - Để hiển thị cấu trúc của biến
$list
đang lưu, mình sử dụng lệnhvar_dump
. - Hàm lấy danh sách dữ liệu tương tự nên mình không kiểm tra nữa.
Kiểm tra hàm thêm dữ liệu
$data = array(
'username' => 'admin2',
'pass' => 'admin2',
'name' => 'Tuấn2',
);
$var = insert_data('user',$data);
var_dump($var);
- Đầu tiên cần tạo ra biến
$data
để lưu mãng dữ liệu bao gồm trường bạn cần insert và giá trị của trường đó. - Tiếp theo thì chỉ việc sẻ dụng nó như hàm trên, chỉ khác là bạn cần truyền vào tên bảng trong csdl và biến dữ liệu
$data
.
Kiểm tra hàm sửa dữ liệu
$data2 = array(
'username' => 'admin2',
'pass' => 'admin2',
'name' => 'Tuấn2',
);
$varupdate = update_id ('user','id_user','2',$data2);
var_dump($varupdate);
- Tương tự hàm thêm dữ liệu, hàm này mình chỉ cần truyền thêm vào hàm tên trường khóa chính và id cần sửa. Ở đây là ‘id_user’ và ‘2’.
Kiểm tra hàm xóa dữ liệu
$delete = delete_id('user','id_user','3');
var_dump($delete);
- Hàm này rất đơn giản, bạn chỉ cần truyền vào tên bảng (user), tên trường id (id_user) và id cần xóa là được.
Kiểm tra hàm lấy số dòng dữ liệu
echo db_count("SELECT COUNT(*) AS num FROM user",'num');
- Hàm này bạn cần truyền vào một câu lệnh
Select count(*). As
là bạn đặt tên cho trường này. Giả sử mình đặt num thì biến truyền bên kia mình sẽ truyền là num.
Như vậy là mình đã đi xong phần 2 của phần lập trình một website cơ bản bằng PHP.
Chúc bạn thành công.
