wpdb::prepare a fost apelat incorect - Soluții și explicații
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.

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