Come verificare un record duplicato prima dell'inserimento con wpdb in WordPress

24 giu 2014, 11:08:23
Visualizzazioni: 17.9K
Voti: 11

Sto inserendo una riga in una tabella personalizzata del database WordPress. Questo è il codice:

$wpdb->insert( 'wp_pl_my_parts', 
                    array( 
                    'user_ID' => $user_ID, 
                    'PL_part_ID' => $PL_part_ID, 
                    'part_save_date' => $part_save_date ), array( '%d', '%d', '%s' ) );

Come posso assicurarmi di non inserire un record duplicato? Cioè, non voglio che venga inserito se user_ID e PL_part_ID sono uguali a un record esistente.

La data non ha importanza e non dovrebbe essere verificata.

0
Tutte le risposte alla domanda 4
1
10

Supponiamo che la chiave primaria della tabella sia my_part_ID. Quindi verificheremo se esiste un valore di chiave primaria per la combinazione di user_ID e PL_part_ID come mostrato di seguito

$my_part_ID = $wpdb->get_var(
                $wpdb->prepare(
                    "SELECT my_part_ID FROM " . $wpdb->prefix . "pl_my_parts
                    WHERE user_ID = %d AND PL_part_ID = %d LIMIT 1",
                    $user_ID, $PL_part_ID
                )
            );

if ( $my_part_ID > 0 )
    // esiste
else
    // non esiste
24 giu 2014 13:35:22
Commenti

Se stai verificando le $rows ricevute, devi usare count($rows) per far funzionare correttamente l'if - quindi if ( count($rows) > 0 )

pbaranski pbaranski
25 lug 2018 10:36:43
8

Ho scoperto che il modo migliore per verificare se un record esiste o meno con WPDB è controllare utilizzando prima la funzione di aggiornamento di WPDB. Un esempio potrebbe essere:

    if(!$wpdb->update($wpdb->prefix.'table_name',$data,array('id'=>$dbRowId),array('%s'),array('%d'))){
        $wpdb->insert($wpdb->prefix.'table_name',$data,array('%s'));
        return $wpdb->insert_id;
    }else{
        return $dbRowId;
    }

È un po' più lungo di quanto si potrebbe desiderare in termini di funzione complessiva, ma se lo configuri come metodo richiamabile in un modello o in una classe DB nel tuo plugin o tema, puoi fargli gestire la funzionalità WPDB.

24 giu 2014 11:31:23
Commenti

Sembra interessante, guardando il mio codice originale come funzionerebbe. Penso che stia usando $dbRowId, se ho capito ciò che hai scritto, come my_part_ID. Dove hai messo database_name non dovrebbe essere il nome della tabella?

M1 Creative Developer M1 Creative Developer
24 giu 2014 11:59:52

@Caleuanhopkins quando si inserisce il record, come si otterrà $dbRowId o possibilmente il valore della chiave primaria in questo caso?

Chittaranjan Chittaranjan
24 giu 2014 13:19:38

@Chittaranjan la variabile $dbRowId è solo un esempio, per ottenere l'id di una riga inserita, $wpdb->insert_id; restituirà l'id della riga appena inserita nel database

Caleuanhopkins Caleuanhopkins
24 giu 2014 18:11:08

@M1CreativeDeveloper Sì, ho anche aggiornato il codice e cambiato il nome del database con quello della tabella. Scusa per la confusione.

Caleuanhopkins Caleuanhopkins
24 giu 2014 18:19:41

@Caleuanhopkins quella variabile va benissimo. La domanda dice prima di inserire quindi come puoi avere $dbRowId nella query di aggiornamento?

Chittaranjan Chittaranjan
24 giu 2014 23:33:31

@Chittaranjan $dbRowId potrebbe essere null se non è disponibile. Lo scopo è verificare se esiste già una riga, altrimenti inserirne una nuova. $dbRowId potrebbe essere cambiato in $PL_part_ID, è solo un codice di esempio, non è una soluzione copia-e-incolla.

Caleuanhopkins Caleuanhopkins
25 giu 2014 18:38:44

Sì, è solo un codice di esempio. Ma il punto a cui mi riferisco qui è che $dbRowId viene passato come condizione where nella query di update. Quindi se è null, aggiornerà mai qualche record? In altre parole, se è null, allora non c'è alcun record nel database, quindi qual è lo scopo di eseguire una query di update?

Chittaranjan Chittaranjan
25 giu 2014 23:21:18

@Chittaranjan è un codice universale di gestione WPDB che, quando eseguito, se il codice ha una variabile che può usare per verificare se una riga esiste già nel DB, verificherà quella riga. Se non ha quella var o non c'è alcuna riga da trovare in base a quella var, inserisce una nuova riga nel DB. Il tuo esempio aiuta a verificare una riga, ma non inserisce una nuova riga se non ne viene trovata nessuna. $dbRowId nell'esempio può essere null, o può essere un id o una riga da verificare, potrebbe anche essere una variabile diversa memorizzata in una riga, come $PL_part_ID usata per identificare cosa controllare per determinare se una riga esiste già.

Caleuanhopkins Caleuanhopkins
26 giu 2014 11:37:23
Mostra i restanti 3 commenti
7

Crea semplicemente la tua tabella del database con un indice (o indici) UNIQUE per prevenire i duplicati, consulta MySQL: Sintassi CREATE INDEX per iniziare. Per i dettagli specifici di WordPress dai un'occhiata a Codex: Creare tabelle con i plugin - Creare tabelle del database. Il codice di esempio riportato di seguito è tratto da lì:

global $wpdb;
$sql = "CREATE TABLE $table_name (
  id mediumint(9) NOT NULL AUTO_INCREMENT,
  time datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
  name tinytext NOT NULL,
  text text NOT NULL,
  url VARCHAR(55) DEFAULT '' NOT NULL,
  UNIQUE KEY id (id)
);";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

Il presupposto di questa risposta è prevenire il problema che l'OP sta riscontrando in anticipo. Significa progettare, pianificare e configurarlo in modo che il problema non possa verificarsi in primo luogo.

24 giu 2014 13:48:40
Commenti

L'utente chiede un record, non una tabella E questa risposta in realtà non è quella giusta per la domanda posta dall'OP.

Mike Kormendy Mike Kormendy
21 feb 2017 01:24:51

@MikeKormendy Beh, vero, l'OP ha chiesto il record. La mia risposta è comunque valida, perché se crei la tabella impostando l'ID o alcuni ID come univoci, allora si assicura che questi siano univoci. Il che ergo porta a risolvere il problema dell'OP, che è prevenire voci con indici duplicati. Quindi la tua valutazione qui non è completamente corretta.

Nicolai Grossherr Nicolai Grossherr
21 feb 2017 13:44:39

la mia valutazione è che la tua risposta è vaga e non abbastanza specifica per essere la risposta più appropriata. 1. l'OP non ha mai chiesto un indice univoco a prescindere dal fatto che quel possibile risultato risolva remotamente la domanda. 2. l'OP chiedeva due campi univoci, la tua risposta nella specificità, non affronta esattamente quella domanda. Sentiti libero di modificare la tua risposta per rispondere direttamente e specificatamente alla domanda.

Mike Kormendy Mike Kormendy
21 feb 2017 18:32:30

L'OP dovrebbe anche rifattorizzare il proprio codice per adattarsi alle voci uniche per indice invece di verificare i valori unici stessi. Non hai fornito quel codice o link a risorse per farlo.

Mike Kormendy Mike Kormendy
21 feb 2017 18:39:14

@MikeKormendy Il metodo insert di $wpdb rispetta l'unicità. Inoltre le risposte non devono fornire soluzioni complete, ma devono essere utili per risolvere un problema - la mia risposta soddisfa questo requisito. Non mi dispiace se sei in disaccordo, ma allora non dovresti dispiacerti se io sono in disaccordo con te.

Nicolai Grossherr Nicolai Grossherr
21 feb 2017 20:04:27

Questa è la bellezza dei forum pubblici di domande e risposte. La mia valutazione e il mio voto negativo rimangono fino a quando la tua risposta non sarà migliorata per essere più specifica alla domanda dell'OP. Caso chiuso.

Mike Kormendy Mike Kormendy
21 feb 2017 21:07:01

@MikeKormendy Come ho detto, semplicemente non sono d'accordo con la tua valutazione, punto e basta. In realtà ho anche votato positivamente il tuo commento originale. Inoltre ho modificato la mia risposta per spiegare il mio obiettivo.

Nicolai Grossherr Nicolai Grossherr
21 feb 2017 21:38:25
Mostra i restanti 2 commenti
1
global $wpdb;
$table_user = $wpdb->prefix . 'user';
$PL_part_ID= $_POST['PL_part_ID'];
// prima verifica se i dati esistono con una query SELECT
$datum = $wpdb->get_results("SELECT * FROM $table_user WHERE PL_part_ID= '".$PL_part_ID."'");
 if($wpdb->num_rows > 0) {
 echo "il risultato esiste";
 }
// se non esiste nel database allora inseriscilo
else{
$result = $wpdb->insert( 
$table_token, 
array( 
'Firstname' => $_POST["value1"], // Nome
'Surname' => $_POST["value2"],    // Cognome
'Month' => $_POST["value3"],     // Mese
'Day' => $_POST["value4"],       // Giorno
'Email Address' => $_POST["value5"] // Indirizzo Email
)
);
}
23 set 2016 14:18:19
Commenti

Si prega di preferire il metodo $wpdb->prepare().

bravokeyl bravokeyl
23 set 2016 14:41:45