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

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êm global.
  • Mình sẽ tạo ra hai biến là $field$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$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àm mysqli_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àm trim 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ệnh mysqli_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$idvalue ngoài $table$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$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ện where và bạn hãy đưa $idfield$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$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ệnh var_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.