Cum verific existența unei înregistrări duplicate înainte de inserare folosind wpdb
Inserăm un rând într-un tabel personalizat din baza de date WordPress. Acesta este codul:
$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' ) );
Cum pot mă asigur că nu inserez o intrare duplicată? Adică nu vreau să inserez dacă user_ID și PL_part_ID sunt aceleași cu o înregistrare existentă?
Data nu contează și nu ar trebui verificată.
Să presupunem că cheia primară a tabelului este my_part_ID
. Așadar, vom verifica dacă există vreo valoare a cheii primare pentru combinația dintre user_ID
și PL_part_ID
după cum urmează
$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 )
// există
else
// nu există

Am găsit cel mai bun mod de a verifica dacă o înregistrare există sau nu cu WPDB este să verifici mai întâi utilizând funcția de actualizare WPDB. Un exemplu în acest sens ar putea fi:
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;
}
Este un pic mai mare decât ai putea dori în termeni de funcție generală, dar dacă o configurezi ca o metodă apelabilă într-un model sau clasă de bază de date în plugin-ul sau tema ta, poți avea grijă de funcționalitatea WPDB.

Asta sună interesant, uitându-mă la codul meu original, cum ar funcționa asta. Cred că $dbRowId pe care îl folosesc, dacă am înțeles corect ceea ce ai scris, este my_part_ID. Unde ai pus database_name, nu ar trebui să fie numele tabelei?

@Caleuanhopkins când inserezi înregistrarea, cum va obține cineva $dbRowId
sau posibil valoarea cheii primare în acest caz?

@Chittaranjan variabila $dbRowId este doar un exemplu de variabilă, pentru a obține id-ul unui rând inserat, $wpdb->insert_id;
va returna id-ul rândului tocmai inserat în baza de date

@M1CreativeDeveloper Da, am actualizat și codul și am schimbat numele bazei de date în numele tabelului. Îmi cer scuze pentru confuzie.

@Caleuanhopkins acea variabilă este perfect în regulă. Întrebarea spune înainte de inserare
deci cum ai putea avea $dbRowId
în interogarea de actualizare?

@Chittaranjan $dbRowId
ar putea fi null dacă nu este disponibil. Scopul acestuia este să verifice dacă există un rând, dacă nu, se inserează un rând nou. $dbRowId
ar putea fi schimbat în $PL_part_ID
, este doar un cod exemplu, nu este un cod soluție de copiat și lipit.

Da, este doar un exemplu de cod. Dar ideea la care încerc să mă refer aici este că $dbRowId
este transmis ca condiție WHERE în interogarea de actualizare. Deci, dacă este null, atunci va actualiza vreun record? Cu alte cuvinte, dacă este null, atunci nu există niciun record în baza de date, deci care este rostul de a executa o interogare de actualizare?

@Chittaranjan este un cod universal de gestionare WPDB care, atunci când este executat, dacă codul are o variabilă pe care o poate folosi pentru a verifica dacă un rând există deja în baza de date, va verifica acel rând. Dacă nu are acea variabilă sau nu există niciun rând care să fie găsit pe baza acelei variabile, introduce un rând nou în baza de date. Exemplul tău ajută la verificarea unui rând, dar nu introduce un rând nou dacă nu este găsit niciunul. $dbRowId
în exemplu poate fi null, sau poate fi un id sau un rând de verificat, ar putea fi și o altă variabilă stocată într-un rând, cum ar fi $PL_part_ID
folosită pentru a identifica ce să verifici pentru a determina dacă un rând există deja.

Pur și simplu creează-ți tabelul din baza de date cu un index (sau indecși) UNIQUE
pentru a preveni duplicatele, vezi MySQL: Sintaxa CREATE INDEX pentru început. Pentru specificul WordPress, consultă Codex: Crearea Tabelelor cu Pluginuri - Crearea Tabelelor în Baza de Date. Codul exemplu de mai jos este preluat de acolo:
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 );
Premisa acestui răspuns este de a preveni problema întâmpinată de OP dinainte. Adică prin proiectare, planificare și configurare într-un mod în care problema nu poate apărea de la bun început.

Utilizatorul solicită un înregistrare, nu un tabel, iar acest răspuns nu este cu adevărat cel potrivit pentru întrebarea adresată de OP.

@MikeKormendy Ei bine, adevărat, OP a cerut înregistrarea. Răspunsul meu rămâne valabil, deoarece dacă creezi tabelul cu ID-ul sau unele ID-uri setate ca unice, atunci te asiguri că acestea sunt unice. Ceea ce, ergo, duce la rezolvarea problemei OP, adică prevenirea intrărilor cu indici duplicați. Deci evaluarea ta aici nu este complet corectă.

Evaluarea mea este că răspunsul tău este vag și nu este suficient de specific pentru a fi cel mai potrivit răspuns. 1. OP nu a cerut niciodată un index unic, indiferent că această soluție ar rezolva indirect întrebarea. 2. OP a solicitat două câmpuri unice, răspunsul tău, în specificitate, nu abordează exact această întrebare. Simte-te liber să modifici răspunsul tău pentru a răspunde direct și specific la întrebare.

OP ar trebui să refactorizeze și codul pentru a se adapta la intrări unice prin index în loc să verifice valorile unice în sine. Nu ați furnizat acel cod sau link-uri către resurse pentru a face acest lucru.

@MikeKormendy Metoda insert
a $wpdb
respectă unicitatea. În plus, răspunsurile nu trebuie să ofere soluții complete, ci trebuie să fie utile în rezolvarea unei probleme - răspunsul meu îndeplinește acest lucru. Nu mă deranjează dacă nu ești de acord, dar atunci nu ar trebui să te deranjeze dacă eu nu sunt de acord cu tine.

Acesta este lucrul minunat despre întrebările și răspunsurile publice pe forum. Evaluarea mea și votul negativ rămân valabile până când răspunsul tău este îmbunătățit pentru a fi mai specific la întrebarea OP. Caz închis.

global $wpdb;
$table_user = $wpdb->prefix . 'user';
$PL_part_ID= $_POST['PL_part_ID'];
// mai întâi verifică dacă datele există prin interogare SELECT
$datum = $wpdb->get_results("SELECT * FROM $table_user WHERE PL_part_ID= '".$PL_part_ID."'");
if($wpdb->num_rows > 0) {
echo "rezultatul există";
}
// dacă nu există în baza de date, atunci inserează-le
else{
$result = $wpdb->insert(
$table_token,
array(
'Prenume' => $_POST["value1"],
'Nume' => $_POST["value2"],
'Luna' => $_POST["value3"],
'Zi' => $_POST["value4"],
'Adresă de email' => $_POST["value5"]
)
);
}
