wpdb->prepare și mysql UPDATE - cum se realizează?
Încerc să setez o dată de tip 'removed' într-o interogare din plugin dar nu sunt sigur cum să folosesc UPDATE SET cu $wpdb->prepare.
Iată interogarea mea:
$cur_date = date('Y-m-d G:i:s');
$rows_affected = $wpdb->query(
$wpdb->prepare("
UPDATE $table
SET ( removed, post_id, user_id, status )
VALUES ( %s, %d, %d, %d )
"),
array($cur_date, $postid, $userid, 0)
));
Pot face UPDATE în acest mod folosind $wpdb? Sunt foarte nou în crearea manuală a interogărilor pentru baza de date.
Dacă nu, cum ar trebui/pot să realizez acest lucru?
Mulțumesc anticipat!
EDITARE ---------------------------------------------------
Cod nou:
$table = $wpdb->prefix . 'ds_entry_swoons';
$cur_date = date('Y-m-d G:i:s');
$rows_affected = $wpdb->query(
$wpdb->prepare("
UPDATE {$table}
SET removed = %s, post_id = %d, user_id = %d, swoon_status = %d
WHERE post_id = $postid AND user_id = $userid;",
$cur_date, $postid, $userid, 0
)
);

Există o metodă dedicată $wpdb->update()
care este atât un ajutor convenabil pentru a executa interogări UPDATE
, cât și efectuează sanitarizarea, apelând intern $wpdb->prepare()
.

Ai dreptate @Rarst wpdb::update sursă: ... return $this->query( $this->prepare( $sql, $values ) );
: https://developer.wordpress.org/reference/classes/wpdb/update/

Am rezolvat parțial interogarea ta. E nevoie de o tabelă și o condiție WHERE pentru a preveni modificarea tuturor rândurilor. Chiar și un LIMIT 1 la final nu ar strica.
$rows_affected = $wpdb->query(
$wpdb->prepare(
"UPDATE {$table} SET removed = %s, post_id = %d, user_id = %d, status = %d;",
$cur_date = date('Y-m-d H:i:s'), $postid, $userid, 0
) // $wpdb->prepare
); // $wpdb->query
Doar adaugă WHERE... în interogarea MySQL. Utilizarea corectă a prepare este:
$wpdb->prepare($format, $arg1, $arg2, ...); // exact ca printf()

De fapt, LIMIT 1 este foarte periculos cu instrucțiunile UPDATE și DELETE. Acest lucru este valabil în special dacă baza de date este un Master în configurația de Replicare MySQL, deoarece nu există nicio garanție a ordinii UPDATE/DELETE pe Sclav. Avertismentele despre aceasta vor fi postate în jurnalul de erori MySQL al Master-ului. În afară de asta, răspunsul tău este în esență corect odată ce @dkmojo adaugă clauza WHERE. +1 !!!

Dacă țintești un ID cheie primară sau o combinație de chei unice... de ce ar fi periculos?

Asta ar fi singura excepție. Cheile neunice ar fi o altă poveste. MySQL poate totuși să posteze avertismente în jurnalul de erori în orice caz.

Am scris de fapt un articol despre asta pe DBA StackExchange: http://dba.stackexchange.com/questions/1371/problem-with-mysql-subquery/1384#1384. Are legătură cu modul în care Optimizatorul MySQL efectuează transformările de interogări în fundal.

Adevărat, dar aceasta ar trebui să fie o decizie conștientă. Dacă știi că intenționezi să actualizezi un singur înregistrament, AFAIK, este o practică bună să impui LIMIT 1. Dacă ai un număr variabil de înregistrări de actualizat, nu folosi niciodată LIMIT deoarece sortarea implicită este... nesortată :)

Există rapoarte de bug-uri pe site-ul mysql pentru versiunile 4.0 (închis: http://bugs.mysql.com/bug.php?id=1024) și 5.1 (patch aplicat acum un an: http://bugs.mysql.com/bug.php?id=42415) despre folosirea UPDATE/DELETE cu LIMIT. Chiar și cu toate remedierile de bug-uri legate de LIMIT, Replicarea MySQL pentru Slave poate fi totuși afectată. Am aflat despre asta doar din ordinea rândurilor SELECTate: http://dba.stackexchange.com/q/6051/877.

Utilizarea LIMIT poate implica, de asemenea, tabele temporare dacă interogarea o impune. Toate tabelele temporare generate de interogări sunt, prin natura lor, nesortate, așa cum ați comentat înainte. LIMIT parcurge astfel de tabele temporare, făcând ordinea sa de execuție și acces diferită între Master și Slave.

Mulțumesc pentru feedback-ul detaliat! Am adăugat clauza WHERE și am inclus codul meu editat mai sus. Dar nu sunt sigur la ce servesc acoladele '{}' în jurul variabilei $table sau dacă sunt necesare. Am alte interogări care nu folosesc acoladele '{}'. La ce servesc acoladele '{}'? Mulțumesc din nou!

@dkmojo {$variabila} este modul corect de a folosi variabile în "șiruri de caractere" pentru a menține controlul total și a evita caractere nedorite analizate. (Citește aici)[http://php.net/manual/en/language.types.string.php]. Citește despre Sintaxa Simplă versus Sintaxa Complexă (cu acolade) (caută în textul paginii link-uite). (exemplu: $table = "{$wpdb->prefix}ds_entry_swoons";)
