✅ WEB- och WordPress -nyheter, teman, plugins. Här delar vi tips och bästa webbplatslösningar.

En stubb för att arbeta med databasfrågor i WordPress

15

Lika mycket som jag är ett fan av vissa WordPress API:er för att fråga databasen som:

Jag är också ett fan av att fråga direkt mot databasen när det behövs.

Som du kommer att märka finns det ett konsekvent sätt att göra detta på och eftersom det finns tillfällen då jag har gjort detta oftare, på senare tid, är här ett grundläggande format för att arbeta med databasfrågor i WordPress.

Om jag gör det här finns det i allmänhet saker som jag tänker på:

  1. se alltid till att frågan är parametriserad (särskilt i fallet med användarinmatning),
  2. returnera i informationen i form av en associativ array.

Det första fallet är för säkerhet; den andra är mer eller mindre för att göra det enklare att iterera genom data via PHP-arrayfunktioner.

Databasfrågor i WordPress

Först är det viktigt att förstå två begrepp:

  1. parametrisering,
  2. array_column

Dessa är kärnan i hur jag skriver mina frågor och arbetar med resultatet av dem.

1 Parametrering

Du kan läsa mer om detta i Codex, men parameterisering är ett sätt som vi kan skriva frågor som fungerar för att förhindra SQL-injektion.

Från Codex-sidan :

All data i SQL-frågor måste SQL-escaped innan SQL-frågan exekveras för att förhindra SQL-injektionsattacker. Metoden prepareutför denna funktionalitet för WordPress, som stöder både en sprintf() -like och vsprintf() -liknande syntax.

Det vill säga att metoden stöder tokens som %s, %d och %f när information skickas in i frågan. Jag ska visa ett exempel på detta senare i inlägget.

2 Arbeta med matriskolumner

Resultaten av sådana frågor kan returneras på en mängd olika sätt. Nämligen som ett objekt, en numeriskt indexerad array eller en associativ array. Oftare än inte gillar jag att använda arrays (och jag kommer att visa hur man gör detta i WordPress senare i det här inlägget).

En stubb för att arbeta med databasfrågor i WordPress

Anledningen är dock att jag kan dra nytta av array_column. Från PHP-manualen:

array_column() returnerar värdena från en enskild kolumn i inmatningen, identifierad av kolumnnyckeln. Valfritt kan en index_key tillhandahållas för att indexera värdena i den returnerade arrayen med värdena från index_key-kolumnen i inmatningsarrayen.

Det betyder att om du har en array och den har ett gäng resultat som var och en har samma kolumn, kan du enkelt enkelt överföra arrayen till en metod och sedan skicka kolumnnamnet till en metod.

Resultatet? En numeriskt indexerad matris av värdena. Detta gör det mycket enklare att iterera genom data genom array_map, använda for eller använda foreach.

En stubb för att söka i databasen

Med den logiken på plats, här är stubben som jag normalt använder när jag arbetar direkt med databasfrågor:

<?php
global $wpdb;
$results = $wpdb->get_results(
    $wpdb->prepare(
        "
        ",
        $userId
    ),
    ARRAY_A
);

if (empty($results)) {
  return;
}
$results = array_map($results, 'column_name');

Och här är ett exempel med ett par olika uppgifter så att du kan se hur det fungerar :

<?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');

Att fråga mot tabellen wp_user_meta kan verka dumt eftersom get_user_meta är en giltig API-funktion, men jag trodde att det skulle vara en enkel fråga att förstå med tanke på vad det är jag försöker förklara tidigare.

Hur som helst, jag kan inte tillhandahålla frågan och inte heller kan jag hantera fallet när resultaten kan komma tillbaka med flera kolumner (i så fall måste du arbeta med något annat än array_map, men det borde vara tillräckligt enkelt, eller hur? )

Inspelningskälla: tommcfarlin.com

Denna webbplats använder cookies för att förbättra din upplevelse. Vi antar att du är ok med detta, men du kan välja bort det om du vill. Jag accepterar Fler detaljer