Cơ sở dữ liệu truy vấn WordPress và hiển thị kết quả

Không có quá nhiều dịp trong sự nghiệp của tôi với tư cách là một nhà phát triển web mà tôi cần truy vấn trực tiếp các bảng cơ sở dữ liệu WordPress cốt lõi bằng SQL. Phần lớn, các cơ chế truy vấn khác nhau của WordPress như WP_QueryWP_Term_QueryWP_User_Query, v.v. , giúp chúng tôi không phải viết các câu lệnh SQL của riêng mình

Tuy nhiên, bạn có thể phải đối mặt với các tình huống mà bạn cần viết SQL của riêng mình để lấy dữ liệu bạn cần — có lẽ sẽ hiệu quả hơn khi sử dụng truy vấn SQL tùy chỉnh hoặc có thể bạn đang xử lý các bảng cơ sở dữ liệu tùy chỉnh.

Thông tin sau đây được trình bày dưới dạng hướng dẫn dành cho người mới bắt đầu viết SQL trong ngữ cảnh của WordPress để truy vấn dữ liệu. Nó không phải là một tài nguyên phong phú nhưng sẽ cung cấp cho bạn một nền tảng tốt để viết các truy vấn của riêng bạn cho phù hợp với các yêu cầu của ứng dụng của bạn. Lưu ý rằng điều này nhằm mục đích tìm nạp dữ liệu từ cơ sở dữ liệu, vì vậy nếu bạn đang muốn cập nhật bảng của mình thông qua câu lệnh SQL, thì bạn nên tham khảo WordPress. tài liệu wpdb của tổ chức cung cấp một số truy vấn ví dụ cho các nhiệm vụ như. chèn hàng mới, thay thế hàng hiện có, cập nhật hàng hiện có và xóa hàng hiện có

Một lưu ý về cấu trúc của bài viết này

Chúng ta sẽ bắt đầu với một bản tóm tắt ngắn gọn về các câu lệnh SQL phổ biến nhất mà bạn có thể sử dụng để truy xuất dữ liệu từ cơ sở dữ liệu của mình — phần này sẽ là SQL thô và sẽ không tự chạy trong PHP. Sau đó, chúng tôi sẽ chuyển sang sử dụng lớp truy cập cơ sở dữ liệu tích hợp của WordPress để thực thi các câu lệnh SQL và sau đó đi sâu vào cách đảm bảo các câu lệnh SQL của bạn vẫn an toàn trước các cuộc tấn công SQL injection

Tất cả các ví dụ mã bạn sẽ thấy trong phần đầu tiên không có thành phần PHP vì chúng chỉ là các câu lệnh SQL. Để chạy chúng, bạn cần kích hoạt MySQL trên dòng lệnh của mình hoặc mở vùng lệnh SQL trong ứng dụng khách cơ sở dữ liệu, chẳng hạn như TablePlus, Sequel Pro, MySQL Workbench hoặc phpMyAdmin

CẢNH BÁO. nhiều nguy hiểm…

Vui lòng tránh thực thi các câu lệnh SQL ngay lập tức đối với cơ sở dữ liệu sản xuất của bạn. Bạn có thể gây ra nhiều thiệt hại trong môi trường đó nên tôi không thể nhấn mạnh điều này đủ — luôn phát triển/thử nghiệm trong môi trường phi sản xuất

Phần 1. Các câu lệnh SQL cơ bản

Chúng ta sẽ xem nhanh một số câu lệnh SQL đơn giản để chọn dữ liệu từ các bảng cơ sở dữ liệu tùy chỉnh. Vì đây là hướng dẫn dành cho người mới bắt đầu nên chúng tôi sẽ chỉ xem xét các trường hợp sử dụng sẽ áp dụng cho những trường hợp bạn sử dụng Bảng cơ sở dữ liệu tùy chỉnh ACF

Chúng ta sẽ bắt đầu bằng cách xem các truy vấn SELECT cơ bản, sau đó xem xét cách sử dụng toán tử SQL LIKE để khớp các mẫu (chuỗi bắt đầu bằng, kết thúc bằng, chứa, v.v.). Chúng tôi sẽ đề cập đến việc sử dụng WHERE mệnh đề kết hợp với ANDOR và NOT toán tử và cả cách sắp xếp và sắp xếp dữ liệu của chúng tôi bằng cách sử dụng WP_Term_Query0, WP_Term_Query1 và WP_Term_Query2

Ở giai đoạn này, tôi sẽ không đi sâu vào các liên kết hoặc các chủ đề khác ngoài những gì tôi đã đề cập ở đây vì có rất nhiều thông tin trực tuyến hướng dẫn bạn cách nâng cao kỹ năng SQL cơ bản của mình — W3Schools là một nơi tuyệt vời để bắt đầu. Tôi thực sự chỉ muốn giúp bạn làm quen với những điều cơ bản và giúp bạn bắt đầu. Tuy nhiên, nếu có đủ người hỏi, tôi sẽ bổ sung thêm vào bài viết

Cơ bản SELECT câu lệnh

Truy vấn SQL SELECT đơn giản nhất là trả về tất cả các hàng dữ liệu từ một bảng mong muốn như sau

Không sao, nhưng nó hoàn toàn trả về mọi thứ không lý tưởng. Bạn có thể tiến xa hơn một chút và chỉ chọn các cột cụ thể. e. g;

Điều này thêm tính cụ thể trong dữ liệu mà chúng tôi muốn thấy trong tập hợp kết quả của mình. tôi. e; . Chúng tôi vẫn đang chọn tất cả các hàng ở giai đoạn này, điều này thường không phải là mục tiêu của chúng tôi, vì vậy, hãy xem cách kiểm soát những hàng nào được trả về bằng cách sử dụng mệnh đề WHERE

Sử dụng mệnh đề WHERE để truy vấn dữ liệu có điều kiện

Mệnh đề WHERE cho phép chúng tôi giới hạn các hàng dữ liệu được trả về chỉ ở những hàng phù hợp với một nhóm điều kiện cụ thể. Một ví dụ đơn giản có thể trông như sau

Trong ví dụ trên, chúng ta sẽ nhận được tất cả các cột trừ các hàng có cột WP_Term_Query7 là 90. Hãy cùng xem một ví dụ khác khớp với một chuỗi

Chú ý khi làm việc với chuỗi ta cần khoanh chuỗi bằng dấu ngoặc kép. Đây là những ví dụ rất cơ bản về dữ liệu khớp với một giá trị chính xác nhưng có một số toán tử tiện dụng khác mà bạn có thể sẽ muốn sử dụng vào một lúc nào đó. Ví dụ: giả sử bạn cần tìm tất cả các hàng khớp với một vài giá trị có thể

Trong ví dụ trên, chúng tôi sẽ nhận được bất kỳ hàng nào có cột WP_Term_Query6 là một trong các giá trị đã chỉ định. Tiếp tục, chúng ta cũng có thể sử dụng các toán tử so sánh để phù hợp với các yêu cầu khác nhau. e. g;

Chúng ta thậm chí có thể sử dụng toán tử WP_User_Query3 để chọn các hàng có giá trị phù hợp với một phạm vi nhất định

Nhiều điều kiện sử dụng các toán tử AND & OR 

Một tính năng hữu ích của ngôn ngữ là khả năng kết hợp _______ 6 mệnh đề bằng cách sử dụng ________ và _______ 8 từ khóa

Những từ khóa này cũng có thể được kết hợp và tổ chức thành các kết hợp logic bằng cách sử dụng dấu ngoặc đơn khi cần thiết

Phủ định một điều kiện bằng toán tử NOT 

Toán tử NOT về cơ bản cho bạn điều ngược lại của một điều kiện. Ví dụ

Sử dụng LIKE và 'ký tự đại diện' để khớp các mẫu

Bạn có thể gặp các tình huống cần tìm tất cả các hàng trong đó một cột bắt đầu bằng, kết thúc bằng hoặc chứa một đoạn văn bản. Đối với tình huống này, bạn có thể sử dụng toán tử LIKE mà chúng ta sẽ đề cập sâu hơn một chút. Trước tiên, chúng ta nên làm quen với các ký hiệu wpdb3 và wpdb4 có thể được sử dụng để khớp với các giá trị biến — các ký hiệu này được gọi là 'ký tự đại diện' và có thể khớp với 0, một hoặc nhiều ký tự thuộc bất kỳ loại nào

Ký tự đại diện wpdb

Ký tự wpdb3 sẽ khớp với 0, một hoặc nhiều ký tự bất kỳ, vì vậy nếu mẫu khớp của bạn là wpdb7, thì truy vấn sẽ trả về các hàng chứa giá trị của cột

  • dự thảo
  • người soạn thảo
  • người thảo văn thư
  • người soạn thảo
  • nhà sản xuất bia tươi
  • dự thảofkerjsdofgsdfgzsdfgsdfg

Một số ví dụ về ký tự đại diện được sử dụng bao gồm

Ký tự đại diện wpdb

Ký tự đại diện wpdb4 tương tự như ký tự đại diện wpdb3 nhưng thay vào đó sẽ chỉ khớp với một ký tự duy nhất. Vì vậy, nếu mẫu đối sánh của bạn là SELECT1, thì truy vấn sẽ trả về các hàng chứa giá trị của cột

  • kiến trúc sư
  • kiến trúc sư
  • kiến trúc1tect
  • kiến trúc sư

Lưu ý rằng mẫu sẽ không khớp với các ký tự trống hoặc nhiều ký tự. e. g;

Một số ví dụ về ký tự đại diện được sử dụng bao gồm

Ví dụ về toán tử LIKE phức tạp hơn một chút

Bây giờ chúng ta đã hiểu các ký tự đại diện wpdb3 và wpdb4 , chúng ta có thể sử dụng chúng cùng với toán tử LIKE bên trong mệnh đề WHERE . Trong các khối mã trước, chúng ta đã thực sự xem xét một số câu lệnh cơ bản bằng cách sử dụng LIKE, vì vậy hãy xem một ví dụ phức tạp hơn một chút

Lưu ý rằng trong ví dụ trên, chúng tôi đã sử dụng hai điều kiện LIKE, mỗi điều kiện có ký tự đại diện wpdb3 kết hợp với toán tử OR . Cũng xin lưu ý rằng chúng tôi đã dàn trải câu lệnh trên nhiều dòng và sử dụng thụt lề để dễ đọc hơn một chút — điều này hoàn toàn có thể chấp nhận được khi viết SQL của bạn và tôi khuyên bạn nên làm như vậy vì nó sẽ giúp mã SQL của bạn dễ đọc hơn rất nhiều

Sắp xếp kết quả bằng cách sử dụng WP_Term_Query0

Bằng cách sử dụng từ khóa WP_Term_Query0, chúng tôi cũng có thể sắp xếp các tập hợp kết quả của mình theo thứ tự tăng dần hoặc giảm dần. Một ví dụ về sắp xếp tập kết quả theo thứ tự tăng dần như sau

Xin lưu ý rằng WP_Term_Query0 sẽ sắp xếp các bản ghi theo thứ tự tăng dần theo mặc định, do đó, trên thực tế có thể rút ngắn một chút để đạt được hiệu quả tương tự bằng cách xóa từ khóa WP_Term_Query1 . e. g;

Nếu bạn cần sắp xếp theo thứ tự giảm dần, chỉ cần sử dụng WP_Term_Query2 từ khóa. e. g;

Cũng có thể sắp xếp theo nhiều cột. Khi làm như vậy, tập hợp kết quả sẽ được sắp xếp theo cột đầu tiên và khi có nhiều hàng có cùng giá trị trong cột đầu tiên, thì chúng sẽ được sắp xếp thêm theo cột thứ hai, v.v. Sắp xếp theo nhiều cột được thực hiện như vậy

Bằng cách thêm ASC hoặc DESC, chúng tôi có thể kiểm soát thứ tự sắp xếp cho từng cột. e. g;

Phần 2. Thực thi SQL bằng cách sử dụng wpdb — lớp truy cập cơ sở dữ liệu cốt lõi trong WordPress

Lớp wpdb là lớp trừu tượng hóa cơ sở dữ liệu tích hợp sẵn của WordPress. Nó được sử dụng để truy cập cơ sở dữ liệu trên khắp WordPress và cung cấp cho các nhà phát triển các phương pháp thuận tiện để chuẩn bị các truy vấn SQL thô để thực thi an toàn

May mắn thay, WordPress cung cấp cho chúng tôi một phiên bản có sẵn của lớp wpdb thông qua biến toàn cục LIKE8. Bằng cách khai báo biến LIKE8 là WHERE0 trong các hàm, phương thức và tập lệnh của riêng bạn, bạn có quyền truy cập vào cùng một phiên bản được sử dụng bởi WordPress. e. g;

______61 là gì?

Lưu ý trong ví dụ trên việc sử dụng WHERE1 — đây là tiền tố phổ biến được sử dụng cho tất cả các bảng cơ sở dữ liệu cốt lõi trong WordPress cũng như bất kỳ bảng DB tùy chỉnh nào sử dụng tiền tố này để tạo tên bảng đầy đủ. Nói chung, bạn nên sử dụng tiền tố bảng cơ sở dữ liệu trong WordPress vì nó sẽ giúp giảm thiểu các sự cố tương thích với plugin và có thể làm xáo trộn tên bảng đầy đủ của bạn, khiến kẻ tấn công khó thực hiện các truy vấn SQL chức năng khi cố gắng tấn công trang web của bạn. Nó cũng giúp giữ sự tách biệt giữa các trang web nếu cùng một cơ sở dữ liệu được sử dụng cho nhiều trang web, miễn là tiền tố là duy nhất. Đây thực sự là cách nhiều trang WordPress duy trì nhiều trang phụ và trang cốt lõi trong một cơ sở dữ liệu

Sử dụng nó đảm bảo các truy vấn của bạn sẽ hoạt động bất kể tiền tố cơ sở dữ liệu trên trang web hiện tại. Luôn sử dụng WHERE1 thay cho mã hóa cứng WHERE4 tiền tố bảng mặc định vì tiền tố mặc định thay đổi giữa các trang web là điều rất phổ biến. Nếu bạn cho rằng tiền tố bảng sẽ luôn là WHERE4 và phát hành một plugin có các truy vấn cơ sở dữ liệu, thì bạn có thể gặp một chút sốc về hỗ trợ ngay sau khi mọi người bắt đầu cài đặt plugin của bạn

Dữ liệu động là một rủi ro — xử lý cẩn thận

Nếu bạn đang viết SQL của riêng mình, rất có thể các câu lệnh SQL của bạn sẽ phụ thuộc vào dữ liệu được cung cấp thông qua đầu vào của người dùng — i. e; . Trong tình huống này, giá trị bạn sẽ sử dụng là giá trị động

Dữ liệu động thường không thể đoán trước và thường được coi là không an toàn và cần được chuẩn bị trước khi được thực thi bởi MySQL. Với suy nghĩ này, chúng ta sẽ xem xét chính xác cách xử lý dữ liệu đầu vào của người dùng theo cách an toàn để bảo vệ các truy vấn của bạn khỏi các cuộc tấn công SQL injection

Bảo vệ chống lại các cuộc tấn công SQL injection

Rủi ro chính với dữ liệu động là ứng dụng của bạn có thể dễ bị tấn công bởi SQL injection; . Đơn giản nhất, tin tặc có thể nhập một số mã SQL vào một biểu mẫu mà khi được gửi, có khả năng sửa đổi bất kỳ câu lệnh SQL liên quan nào xử lý đầu vào biểu mẫu

Mục tiêu của một cuộc tấn công như vậy là sửa đổi mục đích của truy vấn cơ sở dữ liệu, thường là ác ý, như một phương tiện để có quyền truy cập vào thông tin riêng tư hoặc nhạy cảm, kiểm soát ứng dụng web hoặc thậm chí có thể xóa toàn bộ cơ sở dữ liệu

Hãy đọc định nghĩa OWASP về SQL Injection

“Một cuộc tấn công SQL injection bao gồm việc chèn hoặc “tiêm” một truy vấn SQL thông qua dữ liệu đầu vào từ máy khách đến ứng dụng. Khai thác SQL injection thành công có thể đọc dữ liệu nhạy cảm từ cơ sở dữ liệu, sửa đổi dữ liệu cơ sở dữ liệu (Chèn/Cập nhật/Xóa), thực thi các thao tác quản trị trên cơ sở dữ liệu (chẳng hạn như tắt DBMS), khôi phục nội dung của tệp đã cho có trên tệp DBMS . Các cuộc tấn công tiêm nhiễm SQL là một kiểu tấn công tiêm nhiễm, trong đó các lệnh SQL được đưa vào đầu vào của mặt phẳng dữ liệu để thực hiện việc thực thi các lệnh SQL được xác định trước. ”

— OWASP. tổ chức

Chúng tôi có thể bảo vệ chống lại các cuộc tấn công SQL injection thông qua việc sử dụng các câu lệnh đã chuẩn bị dùng tham số hóa truy vấn là phương tiện chuẩn bị dữ liệu đầu vào để sử dụng an toàn trong một truy vấn SQL. Các câu lệnh được chuẩn bị chính xác sẽ loại bỏ khả năng sửa đổi ý định của truy vấn SQL của kẻ tấn công, điều đó có nghĩa là các truy vấn của bạn sẽ chỉ thực hiện những gì bạn đã viết chúng để thực hiện

Nếu tất cả nghe có vẻ hơi nặng nề, thì không sao - đó cũng là một vấn đề khó khăn đối với tôi trong một thời gian. Hãy tiếp tục và tất cả sẽ có ý nghĩa khi bạn tích lũy được kinh nghiệm

Rất may, lớp wpdb của WordPress có một phương thức WHERE7 rất tiện lợi sẽ xử lý việc thoát cho chúng tôi và bảo vệ các truy vấn của chúng tôi trước các cuộc tấn công SQL injection. Rất đáng để bạn dành thời gian làm quen với phương pháp WHERE7 vì nó có thể giúp bạn tránh mọi rắc rối

Chuẩn bị các câu lệnh SQL bằng phương pháp WHERE7 

Sử dụng cú pháp rất giống hàm sprintf() của PHP, phương thức này sẽ chấp nhận (dưới dạng đối số hàm) một câu lệnh SQL chứa bất kỳ số lượng giữ chỗ dữ liệu nào, cùng với một số giá trị phù hợp để thoát và thay thế vào câu lệnh đã cho. Các trình giữ chỗ cần biết như sau

  • Sử dụng AND0 khi thay thế các số nguyên
  • Sử dụng AND1 khi thay thế các số có dấu phẩy động
  • Sử dụng AND2 khi thay thế chuỗi

Đây là một ví dụ đơn giản về việc chuẩn bị một câu lệnh SQL bằng một tham số. Lưu ý việc sử dụng AND2 để chỉ vị trí thay thế một chuỗi

Bây giờ hãy xem xét một ví dụ trong đó cần có hai giá trị động trong một câu lệnh SQL. Lưu ý rằng trong ví dụ này, phương thức AND4 chỉ tiếp tục chấp nhận nhiều biến hơn làm đối số hàm

Bạn biết đấy, bạn cũng có thể truyền các biến cùng với phương thức dưới dạng một mảng, nếu bạn cần. Đây là ví dụ tương tự ở trên, nhưng sử dụng một mảng để truyền dữ liệu vào

Một ví dụ 'không an toàn'

Ví dụ sau thoạt nhìn có vẻ khá vô hại nhưng với thông tin cơ bản mà chúng ta biết vào thời điểm này, chúng ta có thể cho rằng truy vấn này dễ bị tấn công bởi SQL injection thông qua đối số AND

Làm cho nó an toàn bằng cách chuẩn bị tuyên bố của bạn

Hãy sử dụng phương thức WHERE7 để bảo vệ cùng một câu lệnh SQL trước các cuộc tấn công tiêm nhiễm. Ở đây, chúng tôi chuyển dữ liệu biến cho phương thức một cách riêng biệt để đối tượng wpdb có thể thoát dữ liệu khi cần trước khi hợp nhất dữ liệu đó vào câu lệnh SQL

Nếu xem kỹ mã nguồn, bạn sẽ thấy rằng lớp wpdb đang sử dụng AND9 của PHP để thoát các ký tự đặc biệt và OR0 để xử lý các ký tự thay thế. Tất nhiên, còn nhiều điều nữa đang diễn ra và hầu như sẽ luôn khôn ngoan hơn khi sử dụng phương pháp này để tự lăn lộn, nhưng sẽ không hại gì khi làm quen với các công cụ bạn đang sử dụng

Sử dụng ký tự đại diện wpdb3 trong báo cáo đã chuẩn bị

Khi sử dụng ký tự đại diện tỷ lệ phần trăm trong câu lệnh đã chuẩn bị, chúng tôi cần thay đổi mọi thứ một chút vì chúng tôi không muốn nhầm lẫn WHERE7 với ký tự đại diện khiến nó hiểu sai thành tham số truy vấn. Ví dụ: nếu WHERE7 thấy hai biểu tượng wpdb3 trong câu lệnh SQL, nó sẽ cần hai phần dữ liệu để chuẩn bị và thay thế vào truy vấn. Xem xét ví dụ sau

Trong ví dụ trên, truy vấn sẽ không thành công và bạn sẽ nhận được thông báo PHP dọc theo các dòng sau

OR5

Điều này xảy ra vì chuỗi chúng ta đang sử dụng với toán tử LIKE thứ hai chứa AND2. Chúng tôi đang sử dụng điều này với mục đích lấy bất kỳ thứ gì kết thúc bằng 'some_string' nhưng phương thức WHERE7 đang diễn giải đây là tham số thứ hai mà nó không có dữ liệu cho. Cách tốt hơn để xử lý việc này là chuyển tất cả các chuỗi chứa wpdb3 ký tự đại diện thành giá trị dữ liệu. e. g;

Ví dụ này sẽ cứu chúng ta khỏi lỗi vì giờ đây WordPress sẽ có số lượng giá trị dữ liệu chính xác để thay thế thành các tham số được nhận diện — trong trường hợp này là 2

Cân nhắc đặc biệt đối với các ký tự chữ wpdb3 và wpdb4 sử dụng NOT2

Như chúng ta đã thấy trong phần trước, ký tự đại diện wpdb3 đôi khi có thể bị hiểu sai thành tham số truy vấn dẫn đến lỗi truy vấn của chúng ta. Điều này chúng tôi đã khắc phục bằng cách di chuyển các chuỗi chứa ký tự đại diện sang các biến dữ liệu để thay thế

Khi sử dụng toán tử LIKE, chúng ta có thể rơi vào tình huống mà chúng ta có thể sử dụng các ký tự đại diện theo nghĩa đen và chúng tôi muốn tránh việc đọc chúng dưới dạng ký tự đại diện. Hãy xem xét những điều xảy ra nếu như sau đây

  1. Điều gì xảy ra nếu chúng tôi có nhu cầu trực tiếp sử dụng wpdb3 hoặc wpdb4 làm ký tự chữ trong một truy vấn được mã hóa cứng?
  2. Điều gì sẽ xảy ra nếu chúng tôi có một số thông tin đầu vào của người dùng mà chúng tôi cần sử dụng để tra cứu thứ gì đó như 90%?
  3. Điều gì sẽ xảy ra nếu chúng tôi đang gọi một chức năng của bên thứ ba trả về các khóa meta chứa wpdb4 ký tự?

Khi thay thế các giá trị này thành một câu lệnh được tham số hóa, ________ 67 sẽ xem các giá trị này là ký tự đại diện và xử lý chúng như vậy. Hãy xem xét những điều sau đây

Truy vấn trên thực tế sẽ trả về bất kỳ hàng nào có NOT9 bắt đầu bằng bất kỳ ký tự đơn nào, theo sau là từ giá trị và sau đó là một ký tự đơn khác. Ví dụ: giá trị này sẽ khớp với avaluezwhatever không phải là thứ chúng tôi muốn trong trường hợp này. Những gì chúng tôi thực sự theo đuổi là bất cứ thứ gì bắt đầu bằng '_value_' theo đúng nghĩa đen. Để có được kết quả mà chúng ta đang theo đuổi, chúng ta có thể sử dụng một phương thức khác trong lớp wpdb — NOT2. e. g;

Phương thức WP_Term_Query02 đặc biệt thoát các ký tự wpdb3 và wpdb4 để có thể sử dụng chúng dưới dạng chuỗi ký tự trong truy vấn

Trong trường hợp bạn đang kết hợp dữ liệu biến đổi với các ký tự đại diện, bạn chỉ cần sử dụng phép nối để đạt được kết quả mình cần. e. g;