Header Ads Widget

Tương tác với cơ sở dữ liệu trong Wordpress

Class wpdb là 1 class được xây dựng sẵn, nằm trong wp-includes/wp-db.php. Nó cung cấp các phương thức và thuộc tính giúp cho chúng ta thao tác với csdl 1 cách dễ dàng và an toàn nhất.


Để sử dụng class này các bạn có thể khởi tạo mới 1 đối tượng với cú pháp sau:

Nếu không muốn tạo mới đối tượng các bạn có thể sử dụng đối tượng global có sẵn với tên $wpdb.

Khởi tạo đã xong, bây giờ mình sẽ hướng dẫn các bạn sử dụng đối tượng này.

1. Thực thi 1 câu truy vấn bất kỳ

Để thực thi 1 câu truy vấn bất kỳ tới database các bạn sử dụng phương thức query của đối tượng. Cú pháp như sau:

Phương thức này có 1 tham số truyền vào đó là câu truy vấn sql. Nó trả về kết quả là một số nguyên, tương ứng với số dòng ảnh hưởng hay tìm thấy nếu thực thi thành công. Ngược lại nếu thực thi lỗi kết quả trả về sẽ là false.
Ví dụ: xóa post có ID là 10

$wpdb->post trả về tên bảng của Posts. Các bạn có thể tham khảo thêm về danh sách các bảng tại đây.

2. Lấy kết quả duy nhất trả về từ DB

Khi dùng các câu truy vấn sql như đếm, … thường thì sẽ chỉ có 1 kết quả trả về. Vậy để lấy kết quả đó các bạn dùng phương thức get_var. Nếu không tìm thấy kết quả thì phương thức này trả về NULL.
Ví dụ: đếm tổng số post đã publish
$num = $wpdb->get_var("select count('id') from $wpdb->posts where post_status = 'publish' and post_type = 'post'");echo $num;

Phương thức này còn 2 tham số khác là column_offset và row_offset. Nó quyết định cột và dòng muốn lấy. Thứ tự bắt đầu từ 0 và mặc định là 0.

3. Lấy 1 dòng từ kết quả truy vấn

Để lấy 1 dòng từ kết quả của câu truy vấn trả về các bạn dùng phương thức get_row. Phương thức này có 3 tham số:
 Với:
  • query: câu truy vấn sql
  • output_type: loại kết quả trả về (OBJECT: trả về 1 đối tượng, ARRAY_A: trả về 1 mảng dạng key => value, ARRAY_N: trả về mảng dạng chỉ số), mặc định là OBJECT.
  • row_offset: thứ tự dòng muốn lấy, mặc định là 0 (dòng thứ 1)
Nếu không tìm thấy kết quả nó sẽ trả về NULL.
Ví dụ: lấy post đã publish (lấy dòng thứ 2 từ kết quả và kết quả trả về dạng mảng key=>value)
$row = $wpdb->get_row("select * from $wpdb->posts where post_status = 'publish' and post_type = 'post'", ARRAY_A, 1);


Các bạn print để xem kết quả và thay đổi các tham số để thấy sự khác biệt.

4. Lấy 1 cột từ kết quả truy vấn

Nếu kết quả từ câu truy vấn của các bạn trả về nhiều cột và các bạn muốn lấy 1 cột bất kỳ thì sử dụngphương thức get_col.
Phương thức này có 2 tham số: câu truy vấn sql và cột muốn lấy (mặc định là 0). Nếu không tìm thấy kết quả trả về là 1 mảng rỗng.
Ví dụ: Lấy cột thứ 6(tiêu đề) các post đã publish
$rs = $wpdb->get_col("select * from $wpdb->posts where post_status = 'publish' and post_type = 'post'", 5);


//5 chính là cột thứ 6 trong bảng posts (cột post_title)

5. Lấy nhiều dòng kết quả

Để lấy nhiều dòng kết quả các bạn sử dụng phương thức get_results. Phương thức sẽ trả về NULL nếu không có kết quả.
Phương thức này cũng chỉ có 2 tham số: câu truy vấn sql và loại dữ liệu trả về. Có 4 loại dữ liệu trả về:
  • OBJECT: 1 mảng các đối tượng với key là chỉ số bắt đầu từ 0
  • OBJECT_K: 1 mảng các đối tượng với key là giá trị cột đầu tiên của bảng
  • ARRAY_A: 1 mảng các mảng dạng key=>value với key là chỉ số bắt đầu từ 0
  • ARRAY_N: 1 mảng các mảng dạng chỉ số với key là chỉ số bắt đầu từ 0
Ví dụ: lấy các post loại page đã publish với kết quả trả về dạng OBJECT_K.
$rs = $wpdb->get_results("select * from $wpdb->posts where post_status = 'publish' and post_type = 'page'", OBJECT_K);
Các bạn thay đổi tham số và print để xem kết quả.

6. Bảo vệ câu truy vấn, ngăn chặn sql injection

Class wpdb đã cung cấp cho chúng ta 1 phương thức có tên prepare để bảo vệ câu truy vấn nhằm ngăn chặn việc tấn công bằng phương pháp sql injection. Mình nghĩ các bạn nên dùng nó và kết hợp validate đầy đủ các dữ liệu đưa vào.
Việc sử dụng nó cũng đơn giản thôi. Thay vì ở trên các bạn đưa câu query trực tiếp vào phương thức thì ở đây các bạn làm thêm 1 bước nữa là dùng phương thức prepare.
Ví dụ: thêm 1 post meta cho post có id là 10
$query = $wpdb->prepare("INSERT INTO $wpdb->postmeta( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", 10, "su_dung_prepare", "sử dụng prepare");
$wpdb->query($query);

Có 3 loại value_parameter:
  • %s: chuỗi
  • %d: tất cả các số
  • %f: số thập phân

7. Thêm

Để thêm 1 dòng vào bảng các bạn dùng phương thức insert. Phương thức này sẽ trả về số dòng ảnh hưởng nếu thành công và false nếu thất bại.
Cú pháp như sau:
 tên bảng cần thêm
  • $data: mảng dạng key=>value với key là tên cột của bảng và value là giá trị cần thêm
  • $format: chuỗi hoặc mảng định dạng tương ứng với $data ở trên.
Ví dụ:
 Nếu không truyền tham số $format thì giá trị trong $data được xem là chuỗi hết.

8. Cập nhật

Để cập nhật 1 dòng trong bảng các bạn dùng phương thức update. Tương tự phương thức này sẽ trả về số dòng ảnh hưởng nếu thành công và false nếu thất bại.
Cú pháp:
 Với:
  • $table: tên bảng
  • $data: mảng dữ liệu cập nhật dạng key=>value
  • $where: mảng điều kiện để cập nhật dạng key=>value
  • $data_format: mảng định dạng kiểu dữ liệu tương ứng cho $data
  • $where_format: mảng định dạng kiểu dữ liệu tương ứng cho $where
Ví dụ:
$wpdb->update($wpdb->postmeta, array("meta_value" => "test da sua"), array("meta_id" => 10), array("%s"), array("%d"));


Xóa

Để xóa các bạn sử dụng phương thức delete. Cũng tương tự phương thức này sẽ trả về số dòng ảnh hưởng nếu thành công và false nếu thất bại.
Cú pháp:

Với:
  • $table: tên bảng
  • $where: mảng điều kiện xóa dạng key=>value
  • $where_format: mảng định dạng kiểu dữ liệu tương ứng cho $where
Ví dụ:

10. Bật, tắt và hiển thị lỗi


Một số thuộc tính thông dụng

Ngoài các phương thức trên thì $wpdb còn có các thuộc tính mà các bạn cần biết. Ở đây mình sẽ nói về 3 thuộc tính thường được sử dụng nhất. Những thuộc tính khác các bạn có thể tham khảo thêm tại đây.
  • $wpdb->insert_id: thuộc tính này sẽ lấy ra id của dòng vừa được thêm bởi câu truy vấn sql gần nhất.
  • $wpdb->num_rows: trả về tổng số dòng tìm thấy của câu truy vấn cuối.
  • $wpdb->prefix: trả về prefix của bảng

Nhận xét