Jestem fanem niektórych API WordPressa do odpytywania bazy danych, takich jak:
- WP_Zapytanie ,
- WP_User_Query ,
- WP_Meta_Query ,
- i tak dalej
Jestem również fanem zapytań bezpośrednio do bazy danych w razie potrzeby.
Jak zauważysz, robię to w spójny sposób, a ponieważ ostatnio robię to częściej, oto podstawowy format do pracy z zapytaniami do bazy danych w WordPress.
Jeśli jednak to zrobię, generalnie są rzeczy, o których pamiętam:
- zawsze upewnij się, że zapytanie jest sparametryzowane (szczególnie w przypadku wprowadzania danych przez użytkownika),
- zwracać informacje w postaci tablicy asocjacyjnej.
Pierwsza sprawa dotyczy bezpieczeństwa; drugi jest mniej więcej dla wygody, aby uprościć iterację danych za pomocą funkcji tablicowych PHP.
Zapytania do bazy danych w WordPress
Po pierwsze, ważne jest zrozumienie dwóch pojęć:
- parametryzacja,
- kolumna_tablicy
To jest sedno tego, w jaki sposób piszę moje zapytania i pracuję z ich wynikami.
1 Parametryzacja
Możesz przeczytać więcej na ten temat w Kodeksie, ale parametryzacja to sposób, w jaki jesteśmy w stanie pisać zapytania, które zapobiegają wstrzykiwaniu SQL.
Wszystkie dane w zapytaniach SQL muszą zostać poddane kodowaniu SQL przed wykonaniem zapytania SQL, aby zapobiec atakom typu SQL injection. Metoda
preparerealizuje tę funkcjonalność dla WordPressa, który obsługuje zarówno składnię podobną do sprintf(), jak i do vsprintf() .
Oznacza to, że metoda obsługuje tokeny, takie jak %s, %d i %f podczas przekazywania informacji do zapytania. Przykład tego pokażę w dalszej części postu.
2 Praca z kolumnami tablicy
Wyniki takich zapytań mogą być zwracane na wiele różnych sposobów. Mianowicie jako obiekt, tablica indeksowana numerycznie lub tablica asocjacyjna. Częściej niż nie, lubię używać tablic (i pokażę, jak to zrobić w WordPressie w dalszej części tego postu).
Powodem jest jednak to, że mogę skorzystać z array_column. Z instrukcji PHP:
array_column() zwraca wartości z pojedynczej kolumny danych wejściowych, identyfikowanej przez column_key. Opcjonalnie, index_key może być dostarczony do indeksowania wartości w zwróconej tablicy przez wartości z kolumny index_key tablicy wejściowej.
Oznacza to, że jeśli masz tablicę i zawiera ona kilka wyników, z których każdy ma tę samą kolumnę, możesz łatwo po prostu przekazać informacje, przekazując tablicę do metody, a następnie przekazując nazwę kolumny do metody.
Wynik? Numerycznie indeksowana tablica wartości. To znacznie ułatwia iterację danych przez array_map, używając for lub foreach.
Skrót do przeszukiwania bazy danych
Mając to uzasadnienie, oto skrót, którego zwykle używam, gdy pracuję bezpośrednio z zapytaniami do bazy danych:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
",
$userId
),
ARRAY_A
);
if (empty($results)) {
return;
}
$results = array_map($results, 'column_name');
A oto przykład z kilkoma różnymi informacjami, dzięki czemu możesz zobaczyć , jak to działa :
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
user_id,
meta_value
FROM $wpdb->usermeta
WHERE meta_key LIKE %s
AND user_id = %d
",
'%wc_authorize_net_cim_customer_profile_id%',
wp_get_current_user()->ID;
),
ARRAY_A
);
if (empty($results)) {
return [];
}
$results = array_map($results, 'meta_value');
Zapytanie o tabelę wp_user_meta może wydawać się głupie, ponieważ get_user_meta jest prawidłową funkcją API, ale pomyślałem, że będzie to łatwe zapytanie do zrozumienia, biorąc pod uwagę to, co próbuję wyjaśnić w przeszłości.
W każdym razie nie mogę podać zapytania ani poradzić sobie z przypadkiem, w którym wyniki mogą wrócić z wieloma kolumnami (w takim przypadku będziesz musiał pracować z czymś innym niż array_map, ale to powinno być wystarczająco łatwe, prawda? )
