{"id":228643,"date":"2022-10-29T19:39:00","date_gmt":"2022-10-29T16:39:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228643"},"modified":"2022-11-09T03:30:14","modified_gmt":"2022-11-09T00:30:14","slug":"bezposrednie-zapytania-do-bazy-danych-w-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pl\/bezposrednie-zapytania-do-bazy-danych-w-wordpress\/","title":{"rendered":"Bezpo\u015brednie zapytania do bazy danych w WordPress"},"content":{"rendered":"\n<p>Je\u015bli wr\u00f3ci\u0142e\u015b do kt\u00f3regokolwiek z post\u00f3w, kt\u00f3re napisa\u0142em w ci\u0105gu ostatnich, powiedzmy, dw\u00f3ch lat, prawdopodobnie znajdziesz mnie za u\u017cywaniem dost\u0119pnych interfejs\u00f3w API zamiast zapyta\u0144 do bazy danych katalogowych prawie za ka\u017cdym razem.<\/p>\n<p>A prawda jest taka, \u017ce \u200b\u200bwci\u0105\u017c sk\u0142aniam si\u0119 w tym kierunku. To znaczy, je\u015bli istnieje abstrakcja lub API, kt\u00f3re jest dost\u0119pne do zrobienia czego\u015b konkretnego, wtedy staram si\u0119 go u\u017cy\u0107.<\/p>\n<p>Ale w kilku ostatnich projektach pracowa\u0142em ze stosunkowo du\u017cymi zestawami danych (du\u017cymi w por\u00f3wnaniu do zestaw\u00f3w danych na poziomie niekorporacyjnym). Robi\u0105c to, stara\u0142em si\u0119, aby aktualizacje danych odbywa\u0142y si\u0119 tak szybko, jak to mo\u017cliwe.<\/p>\n<p>W takich sytuacjach, chocia\u017c <a href=\"https:\/\/tommcfarlin.com\/following-the-wordpress-coding-standards\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">standardy kodowania WordPressa<\/a> tego nie lubi\u0105, od czasu do czasu uwa\u017cam, \u017ce bezpo\u015brednie zapytania do bazy danych s\u0105 najlepsz\u0105 opcj\u0105 w pewnych warunkach.<\/p>\n<h2>Korzystanie z bezpo\u015brednich zapyta\u0144 do bazy danych<\/h2>\n<p>Bezpo\u015brednie zapytania do bazy danych to jedna z tych rzeczy, kt\u00f3re maj\u0105 nieco mieszan\u0105 reputacj\u0119 w\u015br\u00f3d programist\u00f3w WordPress:<\/p>\n<ul>\n<li>zniech\u0119caj\u0105 ich standardy kodowania,<\/li>\n<li>WordPress oferuje dost\u0119p bezpo\u015brednio do bazy danych poprzez $wpdb,<\/li>\n<li>istniej\u0105 pewne niuanse dotycz\u0105ce zapyta\u0144 do bazy danych, kt\u00f3re nale\u017cy zrozumie\u0107.<\/li>\n<\/ul>\n<p>Wi\u0119c kiedy zobaczysz co\u015b <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cdc5a95834e8bf581fc8ac65fad6ce20\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">takiego<\/a> :<\/p>\n<pre><code>&lt;?php\n\nprivate function set_all_scheduled_events_as_public() {\n\n    global $wpdb;\n\n    \/\/ @codingStandardsIgnoreStart\n    $wpdb-&gt;query(\n        $wpdb-&gt;prepare(\n            \"\n            UPDATE $wpdb-&gt;posts\n            SET post_status = '%s'\n            WHERE post_type = '%s'\n            AND post_status = '%s'\n            \",\n            'publish',\n            'tribe_events',\n            'future') );\n    \/\/ @codingStandardsIgnoreEnd\n}\n<\/code><\/pre>\n<p>Sk\u0105d wiesz, czy to dobry ruch, czy nie? A jeszcze lepiej, sk\u0105d wiesz, czy powiniene\u015b u\u017cywa\u0107 zapyta\u0144 do bazy danych katalog\u00f3w w swoim w\u0142asnym kodzie?<\/p>\n<p>Jest kilka pyta\u0144, kt\u00f3re zwykle zadaj\u0119 sobie, maj\u0105c do czynienia z nimi wszystkimi udost\u0119pnionymi poni\u017cej.<\/p>\n<h3>1 Czy na kolumnach s\u0105 indeksy?<\/h3>\n<p>Przed u\u017cyciem bezpo\u015brednich zapyta\u0144 do bazy danych w WordPressie nale\u017cy sprawdzi\u0107, czy kolumny, o kt\u00f3re pytam, maj\u0105 indeksy na tych kolumnach.<\/p>\n<p>A <a href=\"https:\/\/en.wikipedia.org\/wiki\/Database_index\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">pow\u00f3d jest taki<\/a> :<\/p>\n<blockquote>\n<p>Indeksy s\u0142u\u017c\u0105 do szybkiego lokalizowania danych bez konieczno\u015bci przeszukiwania ka\u017cdego wiersza w tabeli bazy danych przy ka\u017cdym dost\u0119pie do tabeli bazy danych.<\/p>\n<\/blockquote>\n<p>Najwa\u017cniejsze jest to, \u017ce szybko\u015b\u0107, z jak\u0105 mo\u017cna wyszukiwa\u0107 i aktualizowa\u0107 kolumny, jest wi\u0119ksza, je\u015bli w kolumnach znajduj\u0105 si\u0119 indeksy.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167356-61e7a1f8cf8a2.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167356-61e7a1f8cf8a2.png\" alt=\"Bezpo\u015brednie zapytania do bazy danych w WordPress\" ><\/a><\/p>\n<p>Bezpo\u015brednie zapytania do bazy danych zale\u017c\u0105 od struktury bazy danych.<\/p>\n<p>W tym celu nie jest to co\u015b, co powinni\u015bmy robi\u0107 ca\u0142y czas. Ale zdarzaj\u0105 si\u0119 sytuacje, w kt\u00f3rych jest to w\u0142a\u015bciwe (np. gdy aktualizujesz zestaw warto\u015bci meta), a kiedy nie.<\/p>\n<h3>2 Sparametryzuj swoje zapytania<\/h3>\n<p>Podczas korzystania z bezpo\u015brednich zapyta\u0144 do bazy danych niezwykle wa\u017cne jest sparametryzowanie zapyta\u0144 ze wzgl\u0119du na bezpiecze\u0144stwo. Mo\u017cesz o tym przeczyta\u0107 <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">w Kodeksie<\/a> i nie jest to co\u015b do pomini\u0119cia.<\/p>\n<p>Prosto <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">z dokumentacji<\/a> :<\/p>\n<blockquote>\n<p>Aby uzyska\u0107 pe\u0142niejszy przegl\u0105d escapingu SQL w WordPressie, zobacz sprawdzanie poprawno\u015bci danych w bazie danych. Jest to obowi\u0105zkowa lektura dla wszystkich wsp\u00f3\u0142tw\u00f3rc\u00f3w kodu WordPress i autor\u00f3w wtyczek.<\/p>\n<\/blockquote>\n<p>Oznacza to, \u017ce je\u015bli pobierasz dane wej\u015bciowe u\u017cytkownika, musisz upewni\u0107 si\u0119, \u017ce jest odka\u017cony, czysty i gotowy do wstawienia do bazy danych. Ale, co jest warte, prawie nigdy nie pozwalam, aby dane wprowadzane przez u\u017cytkownika mia\u0142y wp\u0142yw na bezpo\u015brednie zapytania do bazy danych.<\/p>\n<p>Zamiast tego s\u0105 zwykle oparte na danych, kt\u00f3re mam w kodzie i chc\u0119 zaktualizowa\u0107 lub zmodyfikowa\u0107, gdy s\u0105 bezpiecznie w sferze kontroli bazy kodu.<\/p>\n<h3>3 Przetestuj je i przetestuj ponownie<\/h3>\n<p>I na koniec, przed wdro\u017ceniem jakichkolwiek bezpo\u015brednich zapyta\u0144 polecam:<\/p>\n<ol>\n<li>Uruchamianie frontendu SQL i wykonywanie zapyta\u0144,<\/li>\n<li>Zwr\u00f3\u0107 uwag\u0119 na wszelkie b\u0142\u0119dy, kt\u00f3re mog\u0105 zg\u0142osi\u0107,<\/li>\n<li>Napraw je i wypr\u00f3buj ponownie.<\/li>\n<\/ol>\n<p>Nast\u0119pnie, gdy masz dzia\u0142aj\u0105cy test zapyta\u0144 dla przypadk\u00f3w brzegowych, aby upewni\u0107 si\u0119, \u017ce co\u015b nie zostanie zniekszta\u0142cone. Jest to szczeg\u00f3lnie wa\u017cne, je\u015bli zamierzasz u\u017cywa\u0107 klauzul LIKE w swoich zapytaniach (co prawdopodobnie jest artyku\u0142em samym w sobie).<\/p>\n<h2>Czy brakuje mi interfejsu API?<\/h2>\n<p>Przy rozmiarze API WordPressa zawsze istnieje szansa, \u017ce \u200b\u200bczego\u015b przegapi\u0119, co\u015b zaniedbuj\u0119 lub po prostu nie jestem sprytny w stosunku do istniej\u0105cych API.<\/p>\n<p>A je\u015bli tak jest, to z przyjemno\u015bci\u0105 poprawi\u0119 powy\u017csze informacje (wi\u0119c nie wahaj si\u0119 zostawi\u0107 komentarza).<\/p>\n<p>Ale w mi\u0119dzyczasie, je\u015bli pracujesz ze stosunkowo ustalonym fragmentem danych, masz pewno\u015b\u0107, \u017ce w kolumnach s\u0105 indeksy, wiesz, jak sparametryzowa\u0107 zapytania i przetestowa\u0142e\u015b dane, a nast\u0119pnie by\u0107 mo\u017ce robisz to z bezpo\u015brednim zapytania do bazy danych s\u0105 do zrobienia.<\/p>\n<p>A je\u015bli tak jest, istnieje kilka sposob\u00f3w na zignorowanie standard\u00f3w kodowania bez krzyczenia na ciebie przez PHP CodeSniffer.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\u0179r\u00f3d\u0142o nagrywania:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Chocia\u017c standardy kodowania WordPress tego nie lubi\u0105, bezpo\u015brednie zapytania do bazy danych czasami s\u0105 najlepsz\u0105 opcj\u0105 w okre\u015blonych warunkach.<\/p>\n","protected":false},"author":1,"featured_media":223796,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[721,897,845,866],"tags":[1169],"class_list":["post-228643","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deweloper","category-kod","category-samouczki","category-wordpress-7","tag-affiai-pl"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228643","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/comments?post=228643"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/posts\/228643\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media\/223796"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/media?parent=228643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/categories?post=228643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pl\/wp-json\/wp\/v2\/tags?post=228643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}