WPDB Insert o Update se esiste

20 mag 2014, 23:14:22
Visualizzazioni: 76.2K
Voti: 32

Non ho molta familiarità con WPDB o SQL in generale, ma ho una tabella personalizzata per il mio progetto e sto cercando di assegnarvi dei metadati. Quello che vorrei ottenere è che se una riga esiste, venga aggiornata e se non esiste venga inserita. Ho letto sia Insert che Update nel Codex di WPDB ma nessuno dei due approfondisce una situazione del tipo "o uno o l'altro". Pensavo di poter lavorare con update, quindi il mio codice finora appare così:

$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 del tipo "SE esiste Update, ALTRIMENTI Insert", o devo eseguire SQL personalizzato per ottenere questo, oppure devo prima interrogare il database per vedere se un ID esiste nella mia tabella e POI decidere se aggiornarlo o inserirlo?

0
Tutte le risposte alla domanda 5
6
37

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

Sostituisce una riga in una tabella se esiste o inserisce una nuova riga se non esiste già.

L'ho provato personalmente in alcuni plugin e funziona bene quando si cerca di evitare errori di duplicazione di ID univoci, ecc.

Maggiori informazioni nel codex

5 set 2014 02:39:12
Commenti

Questo ha funzionato per me mentre una query personalizzata no - grazie per aver menzionato replace()

trainoasis trainoasis
25 gen 2016 10:49:02

Questa è la risposta corretta alla domanda.

Tyler Jones Tyler Jones
20 set 2016 12:19:55

vale la pena notare che $wpdb->replace è una sovrascrittura distruttiva dell'intero record, mentre $wpdb->update aggiorna solo i campi specifici inclusi nell'array $data

MatthewLee MatthewLee
9 dic 2016 06:46:55

Al momento questa funzione non effettua la sostituzione per me. Duplica le stesse righe. Può essere un campo PRIMARY KEY (id) la causa che impedisce la sostituzione? Non trovo informazioni al riguardo nel Codex.

Viktor Borítás Viktor Borítás
14 mag 2020 19:54:46

Ho capito: Per mitigare questo problema di sostituzione, è anche necessario applicare il vincolo UNIQUE a colonne specifiche durante la creazione della tabella, rendendo così possibili righe univoche.

Viktor Borítás Viktor Borítás
14 mag 2020 20:12:02

@ViktorBorítás - o meglio rendendo impossibili le righe duplicate?

Kropotkin Kropotkin
29 giu 2023 13:53:54
Mostra i restanti 1 commenti
3
32

Innanzitutto, stai usando prepare in modo errato. Sembra che tu abbia racchiuso gli argomenti di $wpdb->update in $wpdb->prepare in questo modo. Non funzionerà. In pratica, stai passando a update un singolo argomento - l'output di prepare. Prova qualcosa di semplice come il seguente e capirai 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() esegue prepare per te.

In secondo luogo, se fossi in te, eviterei l'inutile complicazione delle funzioni helper e scriverei una corretta query ON DUPLICATE KEY UPDATE:

$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_id sia un UNIQUE index o PRIMARY KEY. Se la struttura della tua tabella è quella che penso, lascia che sia il database a gestirla.

21 mag 2014 16:09:45
Commenti

È stato incredibilmente utile... Grazie per il tuo tempo s_ha_dum!

Jake Jake
30 lug 2014 18:01:56

Prepare restituisce false per me - nessun altro errore del database. Se eseguo la query manualmente in phpmyadmin funziona come previsto. Ho anche verificato che le variabili siano quelle che dovrebbero essere... Hai qualche idea?

trainoasis trainoasis
25 gen 2016 10:37:27

E se post_id non è la PRIMARY KEY?

Mike Kormendy Mike Kormendy
29 nov 2016 02:36:02
1

Puoi provare ad aggiornare la tabella utilizzando $wpdb->update, nel seguente codice sto usando l'id, ma puoi utilizzare qualsiasi criterio.

$result = $wpdb->update($tableName, $info, array('id' => $info["id"]));
// Se non trova nulla da aggiornare, proverà a creare il record.
if ($result === FALSE || $result < 1) {
    $wpdb->insert($tableName, $info);
}

Risultato dell'output di Update()

  • $result === FALSE : Fallimento
  • $result === 0 : Successo, ma nulla è stato aggiornato
  • $result > 1: Successo e aggiornato
17 giu 2021 21:18:40
Commenti

Se i valori sono gli stessi, MySQL non aggiornerà la riga, quindi il conteggio delle righe interessate sarà 0.

Darrel K. Darrel K.
8 ott 2021 09:28:48
1
-1

Dovresti prima verificare se la riga esiste.

Molto probabilmente vorrai provare a ottenere l'ID o la chiave primaria per la riga che stai cercando di aggiornare, poi usare $wpdb->update se esiste o $wpdb->insert se non esiste

20 mag 2014 23:40:08
Commenti

Un esempio di come verificare se l'ID o la chiave primaria esiste renderebbe questa risposta davvero utile. Questo è quasi come ribadire la domanda.

Jake Jake
30 lug 2014 17:57:12
1
-1

usa $wpdb->insert, $wpdb->insert può inserire e anche aggiornare.. NEL 2023

MODIFICA $wpdb->insert non aggiorna la riga, usa $wpdb->replace

20 nov 2023 14:20:25
Commenti

Una distinzione importante da notare è che wpdb::replace() effettua un'eliminazione e poi un inserimento se viene trovato un duplicato - non esegue un wpdb::update(), cosa che deve essere considerata caso per caso.

Howdy_McGee Howdy_McGee
20 nov 2023 21:29:54