WPDB Inserisci o se esiste Aggiorna


21

Non ho una pazza familiarità con WPDB o SQL in generale, ma ho una tabella personalizzata per il mio progetto e sto provando ad assegnargli alcuni metadati. Quello che "mi piacerebbe" succedere è se esiste una riga, aggiornarla e se non inserirla. Ho letto sia Inserisci che Aggiorna nel codice WPDB, ma nessuno dei due è realmente entrato in una situazione di "o o". Pensavo di poter lavorare con l'aggiornamento, quindi il mio codice finora è simile al seguente:

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.'item_info',
        array(
            'post_id'       => $post_id,
            'item_stock'    => $item_stock
        ),
        array('post_id' => $post_id)
    )
);

WordPress ha qualcosa di simile a un "IF IFES Update, ELSE Insert" o devo eseguire SQL personalizzato per raggiungere questo obiettivo o devo prima interrogare il database per vedere se esiste un ID nella mia tabella POI decidere se aggiornare o inseriscilo?

Risposte:


23

Innanzitutto, stai usando in preparemodo errato. Sembra che tu abbia $wpdb->updategli argomenti racchiusi in $wpdb->preparequesto modo. Non funzionerà In effetti, stai passando updateun singolo argomento: l'output di prepare. Prova qualcosa di semplice come il seguente e vedrai perché non funziona:

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.'item_info',
    array(
        'post_id'       => $post_id,
        'item_stock'    => $item_stock
    ),
    array('post_id' => $post_id)
  )
);

E $wpdb->update()corre prepareper te .

In secondo luogo, se fossi in me, salterò la funzione di supporto gonfio e scriverò una ON DUPLICATE KEY UPDATEquery corretta :

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);

Questo presuppone che post_idsia un UNIQUEindice oPRIMARY KEY . Se la struttura della tua tabella è quella che penso sia, lascia che sia il database a gestirla.


Questo è stato follemente utile ... Grazie per il tuo tempo s_ha_dum!
Jake,

Prepara restituisce false per me - nessun altro errore db. Se si esegue la query manualmente in phpmyadmin, funziona come previsto. Ho anche verificato che le variabili siano quelle che dovrebbero essere. Qualche idea?
trainoasi,

1
Cosa succede se post_id non è il PRIMARY KEY?
Mike Kormendy,

18

Hai provato $wpdb->replace. Secondo il codice WP:

Sostituisci una riga in una tabella se esiste o inserisci una nuova riga in una tabella se la riga non esiste già.

Ho provato me stesso in alcuni plugin e fa il lavoro quando si cerca di evitare errori di duplicazione di ID univoci, ecc.

Maggiori informazioni nel codice


Questo ha funzionato per me mentre la query personalizzata non ha funzionato - grazie per aver menzionato sostituire ()
trainoasi il

Questa è la risposta corretta alla domanda.
Tyler Jones,

6
vale la pena notare che $wpdb->replaceè una sovrascrittura distruttiva dell'intero record, mentre $wpdb->updateaggiorna solo i campi specifici inclusi $datanell'array
MatthewLee

0

È necessario verificare se la riga esiste per prima.

Molto probabilmente vorrai provare a ottenere l'ID o la chiave primaria per la riga che stai cercando di aggiornare, quindi $wpdb->updatese lo fa o $wpdb->insertno


14
Un esempio di come verificare se esiste l'ID o la chiave primaria renderebbe davvero questa una risposta utile. È quasi come ripetere la domanda.
Jake,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.