Jeśli wróciłeś do któregokolwiek z postów, które napisałem w ciągu ostatnich, powiedzmy, dwóch lat, prawdopodobnie znajdziesz mnie za używaniem dostępnych interfejsów API zamiast zapytań do bazy danych katalogowych prawie za każdym razem.
A prawda jest taka, że wciąż skłaniam się w tym kierunku. To znaczy, jeśli istnieje abstrakcja lub API, które jest dostępne do zrobienia czegoś konkretnego, wtedy staram się go użyć.
Ale w kilku ostatnich projektach pracowałem ze stosunkowo dużymi zestawami danych (dużymi w porównaniu do zestawów danych na poziomie niekorporacyjnym). Robiąc to, starałem się, aby aktualizacje danych odbywały się tak szybko, jak to możliwe.
W takich sytuacjach, chociaż standardy kodowania WordPressa tego nie lubią, od czasu do czasu uważam, że bezpośrednie zapytania do bazy danych są najlepszą opcją w pewnych warunkach.
Korzystanie z bezpośrednich zapytań do bazy danych
Bezpośrednie zapytania do bazy danych to jedna z tych rzeczy, które mają nieco mieszaną reputację wśród programistów WordPress:
- zniechęcają ich standardy kodowania,
- WordPress oferuje dostęp bezpośrednio do bazy danych poprzez $wpdb,
- istnieją pewne niuanse dotyczące zapytań do bazy danych, które należy zrozumieć.
Więc kiedy zobaczysz coś takiego :
<?php
private function set_all_scheduled_events_as_public() {
global $wpdb;
// @codingStandardsIgnoreStart
$wpdb->query(
$wpdb->prepare(
"
UPDATE $wpdb->posts
SET post_status = '%s'
WHERE post_type = '%s'
AND post_status = '%s'
",
'publish',
'tribe_events',
'future') );
// @codingStandardsIgnoreEnd
}
Skąd wiesz, czy to dobry ruch, czy nie? A jeszcze lepiej, skąd wiesz, czy powinieneś używać zapytań do bazy danych katalogów w swoim własnym kodzie?
Jest kilka pytań, które zwykle zadaję sobie, mając do czynienia z nimi wszystkimi udostępnionymi poniżej.
1 Czy na kolumnach są indeksy?
Przed użyciem bezpośrednich zapytań do bazy danych w WordPressie należy sprawdzić, czy kolumny, o które pytam, mają indeksy na tych kolumnach.
A powód jest taki :
Indeksy służą do szybkiego lokalizowania danych bez konieczności przeszukiwania każdego wiersza w tabeli bazy danych przy każdym dostępie do tabeli bazy danych.
Najważniejsze jest to, że szybkość, z jaką można wyszukiwać i aktualizować kolumny, jest większa, jeśli w kolumnach znajdują się indeksy.
Bezpośrednie zapytania do bazy danych zależą od struktury bazy danych.
W tym celu nie jest to coś, co powinniśmy robić cały czas. Ale zdarzają się sytuacje, w których jest to właściwe (np. gdy aktualizujesz zestaw wartości meta), a kiedy nie.
2 Sparametryzuj swoje zapytania
Podczas korzystania z bezpośrednich zapytań do bazy danych niezwykle ważne jest sparametryzowanie zapytań ze względu na bezpieczeństwo. Możesz o tym przeczytać w Kodeksie i nie jest to coś do pominięcia.
Prosto z dokumentacji :
Aby uzyskać pełniejszy przegląd escapingu SQL w WordPressie, zobacz sprawdzanie poprawności danych w bazie danych. Jest to obowiązkowa lektura dla wszystkich współtwórców kodu WordPress i autorów wtyczek.
Oznacza to, że jeśli pobierasz dane wejściowe użytkownika, musisz upewnić się, że jest odkażony, czysty i gotowy do wstawienia do bazy danych. Ale, co jest warte, prawie nigdy nie pozwalam, aby dane wprowadzane przez użytkownika miały wpływ na bezpośrednie zapytania do bazy danych.
Zamiast tego są zwykle oparte na danych, które mam w kodzie i chcę zaktualizować lub zmodyfikować, gdy są bezpiecznie w sferze kontroli bazy kodu.
3 Przetestuj je i przetestuj ponownie
I na koniec, przed wdrożeniem jakichkolwiek bezpośrednich zapytań polecam:
- Uruchamianie frontendu SQL i wykonywanie zapytań,
- Zwróć uwagę na wszelkie błędy, które mogą zgłosić,
- Napraw je i wypróbuj ponownie.
Następnie, gdy masz działający test zapytań dla przypadków brzegowych, aby upewnić się, że coś nie zostanie zniekształcone. Jest to szczególnie ważne, jeśli zamierzasz używać klauzul LIKE w swoich zapytaniach (co prawdopodobnie jest artykułem samym w sobie).
Czy brakuje mi interfejsu API?
Przy rozmiarze API WordPressa zawsze istnieje szansa, że czegoś przegapię, coś zaniedbuję lub po prostu nie jestem sprytny w stosunku do istniejących API.
A jeśli tak jest, to z przyjemnością poprawię powyższe informacje (więc nie wahaj się zostawić komentarza).
Ale w międzyczasie, jeśli pracujesz ze stosunkowo ustalonym fragmentem danych, masz pewność, że w kolumnach są indeksy, wiesz, jak sparametryzować zapytania i przetestowałeś dane, a następnie być może robisz to z bezpośrednim zapytania do bazy danych są do zrobienia.
A jeśli tak jest, istnieje kilka sposobów na zignorowanie standardów kodowania bez krzyczenia na ciebie przez PHP CodeSniffer.
