{"id":228594,"date":"2022-10-29T19:34:00","date_gmt":"2022-10-29T16:34:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228594"},"modified":"2022-11-09T03:10:41","modified_gmt":"2022-11-09T00:10:41","slug":"direkta-databasfraagor-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/direkta-databasfraagor-i-wordpress\/","title":{"rendered":"Direkta databasfr\u00e5gor i WordPress"},"content":{"rendered":"\n<p>Om du gick igenom n\u00e5got av inl\u00e4ggen jag har skrivit under de senaste, l\u00e5t oss s\u00e4ga, tv\u00e5 \u00e5ren, kommer du sannolikt att hitta mig som f\u00f6respr\u00e5kar att anv\u00e4nda tillg\u00e4ngliga API:er \u00f6ver katalogdatabasfr\u00e5gor n\u00e4stan varje g\u00e5ng.<\/p>\n<p>Och sanningen \u00e4r att jag fortfarande lutar \u00e5t det h\u00e5llet. Det vill s\u00e4ga, om det finns en abstraktion eller ett API som \u00e4r tillg\u00e4ngligt f\u00f6r att g\u00f6ra n\u00e5got specifikt, d\u00e5 f\u00f6rs\u00f6ker jag anv\u00e4nda det.<\/p>\n<p>Men i ett par nya projekt har jag arbetat med n\u00e5gra relativt stora datam\u00e4ngder (stora i j\u00e4mf\u00f6relse med dataupps\u00e4ttningar p\u00e5 icke-f\u00f6retagsniv\u00e5). Och genom att g\u00f6ra det har jag f\u00f6rs\u00f6kt se till att uppdateringarna av data sker s\u00e5 snabbt som m\u00f6jligt.<\/p>\n<p>I situationer som denna, \u00e4ven om <a href=\"https:\/\/tommcfarlin.com\/following-the-wordpress-coding-standards\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordPress-kodningsstandarderna<\/a> inte gillar det, tycker jag att direkta databasfr\u00e5gor ibland \u00e4r det b\u00e4sta alternativet f\u00f6r att g\u00f6ra det under vissa f\u00f6rh\u00e5llanden.<\/p>\n<h2>Anv\u00e4nda direkta databasfr\u00e5gor<\/h2>\n<p>Direkta databasfr\u00e5gor \u00e4r en av de saker som har ett lite blandat rykte bland WordPress-utvecklare:<\/p>\n<ul>\n<li>de \u00e4r avskr\u00e4ckta i kodningsstandarderna,<\/li>\n<li>WordPress erbjuder tillg\u00e5ng direkt till databasen via $wpdb,<\/li>\n<li>det finns nyanser i databasfr\u00e5gor som b\u00f6r f\u00f6rst\u00e5s.<\/li>\n<\/ul>\n<p>S\u00e5 n\u00e4r du ser n\u00e5got <a href=\"https:\/\/gist.github.com\/tommcfarlin\/cdc5a95834e8bf581fc8ac65fad6ce20\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5nt h\u00e4r<\/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>Hur vet du om det \u00e4r ett bra drag eller inte? Och \u00e4nnu b\u00e4ttre, hur vet du om du ska anv\u00e4nda katalogdatabasfr\u00e5gor i din egen kod?<\/p>\n<p>Det finns n\u00e5gra fr\u00e5gor jag normalt st\u00e4ller mig sj\u00e4lv n\u00e4r jag hanterar dem alla som delas nedan.<\/p>\n<h3>1 Finns det index p\u00e5 kolumnerna?<\/h3>\n<p>Innan du anv\u00e4nder direkta databasfr\u00e5gor i WordPress \u00e4r att kontrollera om kolumnerna jag fr\u00e5gar har index p\u00e5 n\u00e4mnda kolumner.<\/p>\n<p>Och <a href=\"https:\/\/en.wikipedia.org\/wiki\/Database_index\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">anledningen \u00e4r denna<\/a> :<\/p>\n<blockquote>\n<p>Index anv\u00e4nds f\u00f6r att snabbt hitta data utan att beh\u00f6va s\u00f6ka p\u00e5 varje rad i en databastabell varje g\u00e5ng en databastabell anv\u00e4nds.<\/p>\n<\/blockquote>\n<p>Summan av kardemumman \u00e4r att hastigheten med vilken du kan fr\u00e5ga och uppdatera kolumner \u00e4r snabbare om det finns index p\u00e5 kolumnerna.<\/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=\"Direkta databasfr\u00e5gor i WordPress\" ><\/a><\/p>\n<p>Direkta databasfr\u00e5gor beror p\u00e5 databasens struktur.<\/p>\n<p>F\u00f6r det \u00e4ndam\u00e5let \u00e4r detta inte n\u00e5got som vi borde g\u00f6ra hela tiden. Men det finns tillf\u00e4llen d\u00e5 det \u00e4r l\u00e4mpligt (som n\u00e4r du uppdaterar en upps\u00e4ttning metav\u00e4rden) och n\u00e4r det inte \u00e4r det.<\/p>\n<h3>2 Parametrisera dina fr\u00e5gor<\/h3>\n<p>N\u00e4r du anv\u00e4nder direkta databasfr\u00e5gor \u00e4r det extremt viktigt att parametrisera dina fr\u00e5gor f\u00f6r s\u00e4kerhets skull. Du kan l\u00e4sa allt om detta <a href=\"https:\/\/codex.wordpress.org\/Data_Validation#Database\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">i Codex<\/a>, och det h\u00e4r \u00e4r inget att hoppa \u00f6ver.<\/p>\n<p>Direkt <a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Parameters\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">fr\u00e5n dokumentationen<\/a> :<\/p>\n<blockquote>\n<p>F\u00f6r en mer komplett \u00f6versikt av SQL-escape i WordPress, se databasdatavalidering. Det \u00e4r ett m\u00e5ste att l\u00e4sa f\u00f6r alla WordPress-kodbidragsgivare och pluginf\u00f6rfattare.<\/p>\n<\/blockquote>\n<p>Det vill s\u00e4ga, om du tar anv\u00e4ndarinput m\u00e5ste du se till att den \u00e4r sanerad, ren och redo att infogas i databasen. Men f\u00f6r vad det \u00e4r v\u00e4rt till\u00e5ter jag n\u00e4stan aldrig anv\u00e4ndarinmatning att p\u00e5verka direkta databasfr\u00e5gor.<\/p>\n<p>Ist\u00e4llet \u00e4r de normalt baserade p\u00e5 data som jag har i koden och vill uppdatera eller modifiera n\u00e4r de \u00e4r s\u00e4kert inom kontrollomr\u00e5det f\u00f6r kodbasen.<\/p>\n<h3>3 Testa dem och testa dem igen<\/h3>\n<p>Och slutligen, innan jag implementerar n\u00e5gra direkta fr\u00e5gor rekommenderar jag:<\/p>\n<ol>\n<li>Starta ditt SQL-gr\u00e4nssnitt och k\u00f6r fr\u00e5gorna,<\/li>\n<li>Notera eventuella fel som de kan skapa,<\/li>\n<li>Fixa dem och f\u00f6rs\u00f6k igen.<\/li>\n<\/ol>\n<p>Sedan, n\u00e4r du har ett fungerande fr\u00e5getest f\u00f6r kantfall f\u00f6r att se till att n\u00e5got inte kommer att f\u00f6rs\u00e4mras. Detta g\u00e4ller s\u00e4rskilt om du ska anv\u00e4nda LIKE-satser i dina fr\u00e5gor (vilket f\u00f6rmodligen \u00e4r en artikel f\u00f6r sig sj\u00e4lv).<\/p>\n<h2>Saknar jag ett API?<\/h2>\n<p>Med storleken p\u00e5 WordPress API finns det alltid en chans att jag missar n\u00e5got, f\u00f6rsummar n\u00e5got eller helt enkelt inte \u00e4r smart med de befintliga API:erna.<\/p>\n<p>Och om s\u00e5 \u00e4r fallet, s\u00e5 korrigerar jag g\u00e4rna informationen som st\u00e5r ovan (s\u00e5 tveka inte att l\u00e4mna en kommentar).<\/p>\n<p>Men under tiden, om du arbetar med en relativt best\u00e4md bit data, \u00e4r du s\u00e4ker p\u00e5 att det finns index p\u00e5 kolumnerna, du vet hur du parametriserar fr\u00e5gorna, och du har testat data, och kanske g\u00f6r med direkt databasfr\u00e5gor \u00e4r v\u00e4gen att g\u00e5.<\/p>\n<p>Och om s\u00e5 \u00e4r fallet finns det n\u00e5gra s\u00e4tt att ignorera kodningsstandarderna utan att PHP CodeSniffer skriker \u00e5t dig. \ud83d\ude42<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c4ven om WordPress-kodningsstandarderna inte gillar det, \u00e4r direkta databasfr\u00e5gor ibland det b\u00e4sta alternativet under vissa f\u00f6rh\u00e5llanden.<\/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":[848,901,724,868],"tags":[1173],"class_list":["post-228594","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228594","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228594"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228594\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/223796"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}