wpdb::prepare a fost apelat incorect - Soluții și explicații

16 iun. 2014, 07:07:56
Vizualizări: 19.5K
Voturi: 5

Am acest cod pentru a elimina postările orfane după ștergerea unui custom post type.

Funcționează, dar acest cod...

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

...generează această eroare:

PHP Notice: wpdb::prepare a fost apelat incorect. Argumentul query al wpdb::prepare() trebuie să aibă un placeholder.

După ce am citit explicația pe make.wordpress.org de la Andrew Nacin, am înțeles (cam pe jumătate) că... ei bine... îmi lipsește al doilea argument.

Apoi, după ce am citit acest post pe stack, mă întreb dacă am nevoie chiar de funcția prepare(). Există vreo variabilă care conține valori necunoscute? Nu sunt sigur de asta.

...ce îmi scapă?

ACTUALIZARE: Acest cod funcționează și el, dar fără prepare() mă întreb dacă este sigur.

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

Aștept sfaturi.

0
Toate răspunsurile la întrebare 1
0
11

Este întotdeauna recomandat să folosiți $wpdb->prepare atunci când preluați date de la utilizator. Acest lucru vă va ajuta să protejați interogările împotriva injectărilor SQL. Pentru mai multe detalii, consultați Codex

Când utilizați $wpdb->prepare, trebuie să transmiteți variabilele către interogare. În cazul dvs., puteți sări peste utilizarea $wpdb->prepare deoarece utilizați o valoare fixă. Dar dacă aveți aceeași valoare sub formă de variabilă, trebuie să o modificați după cum urmează:

$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
     )
);
16 iun. 2014 09:59:59