Cum verific existența unei înregistrări duplicate înainte de inserare folosind wpdb

24 iun. 2014, 11:08:23
Vizualizări: 17.9K
Voturi: 11

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

0
Toate răspunsurile la întrebare 4
1
10

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ă
24 iun. 2014 13:35:22
Comentarii

Dacă verifici prin $rows primit, trebuie să folosești count($rows) pentru ca if să funcționeze corect - deci if ( count($rows) > 0 )

pbaranski pbaranski
25 iul. 2018 10:36:43
8

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.

24 iun. 2014 11:31:23
Comentarii

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?

M1 Creative Developer M1 Creative Developer
24 iun. 2014 11:59:52

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

Chittaranjan Chittaranjan
24 iun. 2014 13:19:38

@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

Caleuanhopkins Caleuanhopkins
24 iun. 2014 18:11:08

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

Caleuanhopkins Caleuanhopkins
24 iun. 2014 18:19:41

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

Chittaranjan Chittaranjan
24 iun. 2014 23:33:31

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

Caleuanhopkins Caleuanhopkins
25 iun. 2014 18:38:44

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 Chittaranjan
25 iun. 2014 23:21:18

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

Caleuanhopkins Caleuanhopkins
26 iun. 2014 11:37:23
Arată celelalte 3 comentarii
7

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.

24 iun. 2014 13:48:40
Comentarii

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

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

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

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

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.

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

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.

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

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

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

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.

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

@MikeKormendy După cum am spus, pur și simplu nu sunt de acord cu evaluarea ta, atât de simplu. De fapt, am și votat în sus comentariul tău original. În plus, am editat răspunsul meu pentru a-mi explica obiectivul.

Nicolai Grossherr Nicolai Grossherr
21 feb. 2017 21:38:25
Arată celelalte 2 comentarii
1
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"]
)
);
}
23 sept. 2016 14:18:19
Comentarii

Te rugăm să preferi metoda $wpdb->prepare().

bravokeyl bravokeyl
23 sept. 2016 14:41:45