Missing argument 2 for wpdb::prepare() - Aber warum?

  • Hallo zusammen

    Ich steh mal wieder gewaltig auf dem Schlauch.
    Mein Plugin generiert seit dem Update auf Wp 3.6 folgende PHP Warnmeldung:
    FastCGI: server "/var/run/hcgi/19306" stderr: PHP Warning: Missing argument 2 for wpdb::prepare(), called in /xxxx/xxxx/www/xxxx/wp-content/plugins/milizfeuerwehr-daten/milizfeuerwehr-daten.php on line 800 and defined in /xxxxx/xxxxx/www/xxxxx/wp-includes/wp-db.php on line 992

    Eins vorweg, diese Seite hier (Blog WPDE) ist mir durchaus bekannt, nur hilft sie mir nicht weiter.

    Hier mal mein Code:

    Zeile 800 habe ich fett markiert.
    Wo genau liegt hier der Hund begraben?

    LG Bakterius

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • 1. Richtig, der (oder die) Parameter für [FONT=courier new]prepare [/FONT]fehlt.

    Beispiel aus dem Codex:

    Code
    $wpdb->query( 
        $wpdb->prepare( 
            "
                    DELETE FROM $wpdb->postmeta
             WHERE post_id = %d
             AND meta_key = %s
            ",
                13, 'gargle' 
            )
    );

    %d gibt den Integer zurück, %s den String.

    2. Probier das mal mit einer sinnvolleren Schreibweise (Beispiel):

    3. Versuchs erstmal ohne [FONT=courier new]prepare [/FONT]mit einem einfachen [FONT=courier new]query[/FONT]. :)

    PS: Dein Problem ist hier exakt erklärt: http://make.wordpress.org/core/2012/12/1…r-wpdb-prepare/ ;)

  • Der zweite Parameter für prepare muss ein Array mit den Werten sein, mit denen die %...-Platzhalter ersetzt werden.

    Ich glaube, Du hast in dem Aufruf einiges durcheinander geworfen..

    Danke für Deine Antwort.
    Ich werde es mal mit einem Array versuchen.
    Gem. dieser Seite können aber mehrere Parameter hintereinander angegeben werden.

    Code
    [$wpdb->prepare( "SELECT * FROM table WHERE ID = %d AND name = %s", $id, $name );

    Was meinst Du mit durcheinandergeworfen?
    Die Abfrage liefert genau das Ergebnis, was ich erwarte.

    Gruss
    Bakterius

    Einmal editiert, zuletzt von bakterius (5. August 2013 um 14:52)

  • 1. Richtig, der (oder die) Parameter für [FONT=courier new]prepare [/FONT]fehlt.

    Das wars, danke :-)
    Ich habe die Parameter wohl mitgegeben, allerdings vor statt nach der Klammer. Deshalb kam die Fehlermeldung. Die Parameter wurden aber trotzdem brav übergeben und das Statement funktionierte einwandfrei.

    PHP
    $anzahl_einsaetze = $wpdb->get_var( 
                    $wpdb->prepare('
         SELECT COUNT('. $wpdb->posts .'.ID) 
         FROM '. $wpdb->posts .'
         INNER JOIN '. $wpdb->postmeta .' ON '. $wpdb->postmeta .'.post_id  = %d
         AND '. $wpdb->postmeta .'.meta_key = %s
         WHERE ('. $wpdb->posts .'.post_type = %s)
         AND ('.$wpdb->posts .'.post_status = %s), '. $wpdb->posts .'.ID, "datumzeit", "feuerwehreinsatz", "publish"
                    ')
       );

    2. Probier das mal mit einer sinnvolleren Schreibweise (Beispiel):


    Der Text wurde durch das Forum so verworfen. Die Schreibweise ist eingentlich genau so.


    3. Versuchs erstmal ohne [FONT=courier new]prepare [/FONT]mit einem einfachen [FONT=courier new]query[/FONT]. :)


    Ohne prepare ein Select Count über mehrere Tabellen? Wüsste nciht wie das gehen soll.


    PS: Dein Problem ist hier exakt erklärt: http://make.wordpress.org/core/2012/12/1…r-wpdb-prepare/ ;)


    Jein. Das Problem allgemein wird zwar hier erklärt, nur war mein Problem, dass ich die Parameter am falschen Ort übergeben habe.
    Lustigerweise hat das trotzdem funktioniert. Frag mich aber bitte nicht warum.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!