{"id":230325,"date":"2022-12-08T13:33:00","date_gmt":"2022-12-08T10:33:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230325"},"modified":"2022-12-07T11:53:30","modified_gmt":"2022-12-07T08:53:30","slug":"en-stubb-foer-att-arbeta-med-databasfraagor-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/en-stubb-foer-att-arbeta-med-databasfraagor-i-wordpress\/","title":{"rendered":"En stubb f\u00f6r att arbeta med databasfr\u00e5gor i WordPress"},"content":{"rendered":"\n<p>Lika mycket som jag \u00e4r ett fan av vissa WordPress API:er f\u00f6r att fr\u00e5ga databasen som:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Query<\/a><\/strong> ,<\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_User_Query\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_User_Query<\/a><\/strong> ,<\/li>\n<li><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/WP_Meta_Query#Related\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WP_Meta_Query<\/a><\/strong> ,<\/li>\n<li>och s\u00e5 vidare<\/li>\n<\/ul>\n<p>Jag \u00e4r ocks\u00e5 ett fan av att fr\u00e5ga direkt mot databasen n\u00e4r det beh\u00f6vs.<\/p>\n<p>Som du kommer att m\u00e4rka finns det ett konsekvent s\u00e4tt att g\u00f6ra detta p\u00e5 och eftersom det finns tillf\u00e4llen d\u00e5 jag har gjort detta oftare, p\u00e5 senare tid, \u00e4r h\u00e4r ett grundl\u00e4ggande format f\u00f6r att arbeta med databasfr\u00e5gor i WordPress.<\/p>\n<p>Om jag g\u00f6r det h\u00e4r finns det i allm\u00e4nhet saker som jag t\u00e4nker p\u00e5:<\/p>\n<ol>\n<li>se alltid till att fr\u00e5gan \u00e4r parametriserad (s\u00e4rskilt i fallet med anv\u00e4ndarinmatning),<\/li>\n<li>returnera i informationen i form av en associativ array.<\/li>\n<\/ol>\n<p>Det f\u00f6rsta fallet \u00e4r f\u00f6r s\u00e4kerhet; den andra \u00e4r mer eller mindre f\u00f6r att g\u00f6ra det enklare att iterera genom data via PHP-arrayfunktioner.<\/p>\n<h2>Databasfr\u00e5gor i WordPress<\/h2>\n<p>F\u00f6rst \u00e4r det viktigt att f\u00f6rst\u00e5 tv\u00e5 begrepp:<\/p>\n<ol>\n<li>parametrisering,<\/li>\n<li>array_column<\/li>\n<\/ol>\n<p>Dessa \u00e4r k\u00e4rnan i hur jag skriver mina fr\u00e5gor och arbetar med resultatet av dem.<\/p>\n<h3>1 Parametrering<\/h3>\n<p>Du kan l\u00e4sa mer om detta i Codex, men parameterisering \u00e4r ett s\u00e4tt som vi kan skriva fr\u00e5gor som fungerar f\u00f6r att f\u00f6rhindra SQL-injektion.<\/p>\n<p><strong><a href=\"https:\/\/codex.wordpress.org\/Class_Reference\/wpdb#Protect_Queries_Against_SQL_Injection_Attacks\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fr\u00e5n Codex-sidan<\/a><\/strong> :<\/p>\n<blockquote>\n<p>All data i SQL-fr\u00e5gor m\u00e5ste SQL-escaped innan SQL-fr\u00e5gan exekveras f\u00f6r att f\u00f6rhindra SQL-injektionsattacker. Metoden <code>prepare<\/code>utf\u00f6r denna funktionalitet f\u00f6r WordPress, som st\u00f6der b\u00e5de en <a href=\"https:\/\/php.net\/sprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">sprintf()<\/a> -like och <a href=\"https:\/\/php.net\/vsprintf\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">vsprintf()<\/a> -liknande syntax.<\/p>\n<\/blockquote>\n<p>Det vill s\u00e4ga att metoden st\u00f6der tokens som <strong>%s<\/strong>, <strong>%d<\/strong> och <strong>%f<\/strong> n\u00e4r information skickas in i fr\u00e5gan. Jag ska visa ett exempel p\u00e5 detta senare i inl\u00e4gget.<\/p>\n<h3>2 Arbeta med matriskolumner<\/h3>\n<p>Resultaten av s\u00e5dana fr\u00e5gor kan returneras p\u00e5 en m\u00e4ngd olika s\u00e4tt. N\u00e4mligen som ett objekt, en numeriskt indexerad array eller en associativ array. Oftare \u00e4n inte gillar jag att anv\u00e4nda arrays (och jag kommer att visa hur man g\u00f6r detta i WordPress senare i det h\u00e4r inl\u00e4gget).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162387-61e73d7998688.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-162387-61e73d7998688.png\" alt=\"En stubb f\u00f6r att arbeta med databasfr\u00e5gor i WordPress\" ><\/a><\/p>\n<p>Anledningen \u00e4r dock att jag kan dra nytta av <a href=\"https:\/\/php.net\/manual\/en\/function.array-column.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_column<\/a>. Fr\u00e5n PHP-manualen:<\/p>\n<blockquote>\n<p>array_column() returnerar v\u00e4rdena fr\u00e5n en enskild kolumn i inmatningen, identifierad av kolumnnyckeln. Valfritt kan en index_key tillhandah\u00e5llas f\u00f6r att indexera v\u00e4rdena i den returnerade arrayen med v\u00e4rdena fr\u00e5n index_key-kolumnen i inmatningsarrayen.<\/p>\n<\/blockquote>\n<p>Det betyder att om du har en array och den har ett g\u00e4ng resultat som var och en har samma kolumn, kan du enkelt enkelt \u00f6verf\u00f6ra arrayen till en metod och sedan skicka kolumnnamnet till en metod.<\/p>\n<p>Resultatet? En numeriskt indexerad matris av v\u00e4rdena. Detta g\u00f6r det mycket enklare att iterera genom data genom <a href=\"https:\/\/php.net\/manual\/en\/function.array-map.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">array_map<\/a>, anv\u00e4nda <strong><a href=\"https:\/\/php.net\/manual\/en\/control-structures.for.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">for<\/a> eller<\/strong> anv\u00e4nda <strong><a href=\"https:\/\/php.net\/manual\/en\/control-structures.foreach.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">foreach<\/a><\/strong>.<\/p>\n<h2>En stubb f\u00f6r att s\u00f6ka i databasen<\/h2>\n<p>Med den logiken p\u00e5 plats, <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-00-query-stub-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">h\u00e4r \u00e4r stubben<\/a><\/strong> som jag normalt anv\u00e4nder n\u00e4r jag arbetar direkt med databasfr\u00e5gor:<\/p>\n<pre><code>&lt;?php\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        \",\n        $userId\n    ),\n    ARRAY_A\n);\n\nif (empty($results)) {\n  return;\n}\n$results = array_map($results, 'column_name');<\/code><\/pre>\n<p>Och h\u00e4r \u00e4r ett exempel med ett par olika uppgifter s\u00e5 att du kan se <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/83522e41b58ba2ee8633282cb03e6a60#file-01-example-query-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">hur det fungerar<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\nglobal $wpdb;\n$results = $wpdb-&gt;get_results(\n    $wpdb-&gt;prepare(\n        \"\n        SELECT\n            user_id,\n            meta_value\n        FROM $wpdb-&gt;usermeta\n        WHERE meta_key LIKE %s\n        AND user_id = %d\n        \",\n        '%wc_authorize_net_cim_customer_profile_id%',\n        wp_get_current_user()-&gt;ID;\n    ),\n    ARRAY_A\n);\n\nif (empty($results)) {\n    return [];\n}\n$results = array_map($results, 'meta_value');<\/code><\/pre>\n<p>Att fr\u00e5ga mot tabellen <strong>wp_user_meta<\/strong> kan verka dumt eftersom get_user_meta \u00e4r en giltig API-funktion, men jag trodde att det skulle vara en enkel fr\u00e5ga att f\u00f6rst\u00e5 med tanke p\u00e5 vad det \u00e4r jag f\u00f6rs\u00f6ker f\u00f6rklara tidigare.<\/p>\n<p>Hur som helst, jag kan inte tillhandah\u00e5lla fr\u00e5gan och inte heller kan jag hantera fallet n\u00e4r resultaten kan komma tillbaka med flera kolumner (i s\u00e5 fall m\u00e5ste du arbeta med n\u00e5got annat \u00e4n <strong>array_map<\/strong>, men det borde vara tillr\u00e4ckligt enkelt, eller hur? )<\/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>Det finns ett konsekvent s\u00e4tt att fr\u00e5ga efter WordPress-databasen. Eftersom det finns tillf\u00e4llen d\u00e5 jag har gjort detta oftare, p\u00e5 senare tid, \u00e4r h\u00e4r ett grundl\u00e4ggande format f\u00f6r att arbeta med databasfr\u00e5gor i WordPress.<\/p>\n","protected":false},"author":1,"featured_media":235713,"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-230325","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\/230325","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=230325"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/230325\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/235713"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=230325"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=230325"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=230325"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}