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_Query
, WP_Term_Query
, WP_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 phải viết SQL của riêng mình để lấy dữ liệu bạn cần — có lẽ việc sử dụng truy vấn SQL tùy chỉnh sẽ hiệu quả hơn 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 AND
, OR
và NOT
toán tử cũng như 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_Query
0, WP_Term_Query
1 và WP_Term_Query
2
Ở 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_Query
7 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_Query
6 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_Query
3 để 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 wpdb
3 và wpdb
4 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
3
Ký tự wpdb
3 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à wpdb
7, 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
4
Ký tự đại diện wpdb
4 tương tự như ký tự đại diện wpdb
3 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à SELECT
1, 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 wpdb
3 và wpdb
4, 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 wpdb
3 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_Query
0
Bằng cách sử dụng từ khóa WP_Term_Query
0, 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_Query
0 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_Query
1 . 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_Query
2 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 LIKE
8. Bằng cách khai báo biến LIKE
8 là WHERE
0 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 WHERE
1 — đâ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 WHERE
1 thay cho mã hóa cứng WHERE
4 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ố của bảng sẽ luôn là WHERE
4 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 bất ngờ 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 hại, 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 WHERE
7 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 WHERE
7 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 WHERE
7
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
AND
0 khi thay thế các số nguyên - Sử dụng
AND
1 khi thay thế các số có dấu phẩy động - Sử dụng
AND
2 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 AND
2 để 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 AND
4 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'
Thoạt nhìn, ví dụ sau có vẻ khá vô hại nhưng với thông tin cơ bản mà chúng tôi biết tại thời điểm này, chúng tôi có thể giả định rằng truy vấn này dễ bị tấn công bởi SQL injection thông qua đối số AND
5
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 WHERE
7 để bảo vệ cùng một câu lệnh SQL trước các cuộc tấn công tiêm chích. Ở đâ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 AND
9 của PHP để thoát các ký tự đặc biệt và OR
0 để 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 wpdb
3 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 WHERE
7 với ký tự đại diện khiến nó hiểu sai thành tham số truy vấn. Ví dụ: nếu WHERE
7 thấy hai biểu tượng wpdb
3 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
OR
5
Đ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 AND
2. 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 WHERE
7 đ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 wpdb
3 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ữ wpdb
3 và wpdb
4 sử dụng NOT
2
Như chúng ta đã thấy trong phần trước, ký tự đại diện wpdb
3 đôi khi có thể bị hiểu sai thành một 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
- Điều gì xảy ra nếu chúng tôi có nhu cầu trực tiếp sử dụng
wpdb
3 hoặcwpdb
4 làm ký tự chữ trong một truy vấn được mã hóa cứng? - Đ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%?
- Đ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
wpdb
4 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 sự sẽ trả về bất kỳ hàng nào có NOT
9 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
— NOT
2. e. g;
Phương thức WP_Term_Query
02 đặc biệt thoát các ký tự wpdb
3 và wpdb
4 để 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;