Come verificare un record duplicato prima dell'inserimento con wpdb in WordPress
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.
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

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.

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?

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

@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

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

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

@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.

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 è 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à.

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.

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

@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.

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.

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.

@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.

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.

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