web-dev-qa-db-de.com

wpdb :: prepare wurde falsch aufgerufen

Ich habe diesen Code, um verwaiste Beiträge nach dem Löschen des benutzerdefinierten Beitragstyps zu entfernen.

Es funktioniert, aber dieser Code ...

global $wpdb;
$wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
    WHERE a.post_type='attorneys'"
  )
);

... wirft diesen Fehler:

PHP-Hinweis: wpdb :: prepare hieß falsch . Das Abfrageargument von wpdb :: prepare () muss einen Platzhalter haben.

Nachdem ich die Erklärung auf make.wordpress.org von Andrew Nacin gelesen habe, verstehe ich (irgendwie), dass ... nun ... mir fehlt das zweite Argument.

Dann, nachdem ich diesen Stapel nach gelesen habe, frage ich mich, ob ich überhaupt die Funktion prepare() brauche. Gibt es Variablen mit unbekannten Werten? Das ist mir nicht klar.

...Was vermisse ich?

UPDATE: Dieser Code funktioniert auch, aber ohne prepare () frage ich mich, ob es sicher ist.

global $wpdb;
$wpdb->query( 
  "DELETE a,b,c FROM wp_posts a
  LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
  LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
  WHERE a.post_type='attorneys'"
);

Bitte beraten.

3
sleeper

Es wird immer empfohlen, $wpdb->prepare zu verwenden, wenn Sie Eingaben vom Benutzer entgegennehmen. Dies hilft beim Schutz von Abfragen gegen SQL Injection. Weitere Informationen finden Sie im Codex

Wenn Sie $wpdb->prepare verwenden, müssen Sie die Variablen an die Abfrage übergeben. In Ihrem Fall können Sie $wpdb->prepare überspringen, da Sie einen fest codierten Wert verwenden. Wenn Sie jedoch denselben Wert für eine Variable haben, müssen Sie diesen wie folgt ändern

$post_type = 'attorneys';

$wpdb->query( 
     $wpdb->prepare(
          "DELETE a,b,c FROM wp_posts a
          LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
          LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
          WHERE a.post_type=%s",
          $post_type
     )
);
7
Chittaranjan