Verificarea existenței datelor înainte de inserare în baza de date WordPress - plugin personalizat
Încerc să inserez date introduse de utilizator într-un tabel personalizat în WordPress și nu vreau să am înregistrări duplicate. Codul meu pentru verificare este:
global $wpdb;
$tablename=$wpdb->prefix."students"; //obținem numele tabelului cu prefix
$data=$wpdb->get_results("SELECT students_name, students_lastname FROM $tablename");
foreach($data as $da){
$da->students_name;
$da->students_lastname;
}
if(isset($_POST['submit'])){
$name=esc_attr($_POST['firstname']);
$surname=esc_attr($_POST['lastname']);
$email=sanitize_email($_POST['email']);
//verificăm dacă utilizatorul există deja pentru a nu-l adăuga de două ori
if (
(is_email($email)) &&
(($da->students_name != $name) && ($da->students_lastname != $surname))
|| (($da->students_name == $name) && ($da->students_lastname != $surname))
|| (($da->students_name != $name) && ($da->students_lastname == $surname))
)
{
//atribuim noile date rândurilor din tabel
$newdata = array(
'students_name'=>$name,
'students_lastname'=>$surname,
'students_email'=>$email,
'students_date'=>current_time( 'mysql' ),
);
//inserăm o înregistrare în baza de date
$wpdb->insert(
$tablename,
$newdata
);
//afișăm mesajul de succes când studentul este adăugat
?>
<div class="wrap">
<div class="updated"><p>Student adăugat!</p></div>
</div>
<?php
}else {
if(!is_email($email)){
echo '<div class="error"><p>E-mail invalid!</p></div>';
}else{
?
<div class="wrap">
<div class="error"><p>Studentul există deja!</p></div> <!-- clasa wp error pentru notificări de eroare --->
</div>
<?php
}
}
}
}
Problema mea este că atunci când utilizatorul adaugă datele și dacă le adaugă din nou imediat, mesajul de eroare este afișat și utilizatorul nu este adăugat. Problema apare când utilizatorul face clic pentru a vizualiza înregistrările adăugate (altă funcție) și apoi face clic pentru a adăuga un nou student - atunci mesajul de eroare nu este afișat și același utilizator este introdus de două sau mai multe ori. Idei?

Îți poți îmbunătăți considerabil codul. Voi trata adresa de email ca identificator unic al studentului, deoarece pot avea cu siguranță 2 studenți numiți 'John Doe'.
global $wpdb;
$tablename = $wpdb->prefix."students";
if(isset($_POST['submit'])){
$name = esc_attr($_POST['firstname']);
$surname = esc_attr($_POST['lastname']);
$email = sanitize_email($_POST['email']);
if(!is_email($email)) {
// Afișează eroare de email invalid și ieși
echo '<div class="error"><p>Email invalid!</p></div>';
// return sau exit
}
// Verifică dacă emailul studentului există deja
$datum = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");
// Afișează obiectul $datum pentru a vedea cum este stocat count-ul în el.
// Presupun că cheia este 'count'
if($wpdb->num_rows > 0) {
// Afișează mesaj de eroare pentru intrare duplicat și ieși
?>
<div class="wrap">
<div class="error"><p>Studentul există deja!</p></div> <!-- clasa wp error pentru notificări de eroare --->
</div>
<?php
// return sau exit
}
// Acum că emailul este unic și valid, să-l introducem
// atribuind noile date rândurilor din tabel
$newdata = array(
'students_name'=>$name,
'students_lastname'=>$surname,
'students_email'=>$email,
'students_date'=>current_time( 'mysql' ),
);
// inserarea unui record în baza de date
$wpdb->insert(
$tablename,
$newdata
);
// afișează mesajul de succes când studentul este adăugat
?>
<div class="wrap">
<div class="updated"><p>Student adăugat!</p></div>
</div>
<?php }
Am evitat multe condiții și bucle inutile. Încearcă asta. Folosește JavaScript pentru a goli formularul când o înregistrare este făcută cu succes.
Actualizare:
Am folosit get_results
în conformitate cu interogarea pe care ai postat-o. Acum trebuie să folosești $wpdb->num_rows
pentru a număra rezultatele în condiție.
Sursă: https://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results https://wordpress.org/support/topic/wpdb-mysql_num_rows

Cred că am nevoie de niște condiții, pentru că acum tot adaugă studentul chiar dacă are același email.

Afișează obiectul $datum
pentru a vedea dacă returnează datele corecte. Adaugă un echo în interiorul lui count
if pentru a verifica dacă condiția este îndeplinită.

Nu afișează nimic, de parcă nici nu verifică instrucțiunea if. Am încercat cu var_dump și echo și nimic. Doar adaugă studentul.

Apoi trebuie să verifici interogarea SQL rulând-o direct pe baza de date.

Am rezolvat cu o altă interogare SQL. Am făcut-o cu $datum = $wpdb->get_results("SELECT COUNT(*) FROM $tablename WHERE students_email = $email", ARRAY_N);
și apoi if($datum > 0 )
și acum funcționează. Mulțumesc pentru ajutor!

Super! Mă bucur că am putut ajuta. Te rog să editezi răspunsul meu și să pui acolo interogarea corectă. Poate ajuta pe cineva în viitor. Apropo, era o greșeală de tipar în interogarea mea SQL, am folosit student_email
în loc de students_email
!

Am editat răspunsul tău cu interogarea SQL modificată și am observat imediat greșeala de tipar :D. Mulțumesc pentru ajutor!

Cred că trebuie să folosești $wpdb->query
în loc de get_results
deoarece verifici un array împotriva unui 0, când de fapt ar trebui să verifici count-ul împotriva lui 0. Chiar dacă funcționează, este greșit.

Eram atât de concentrat să testez dacă utilizatorii au același email, încât am uitat să testez dacă adaugă noul utilizator, și nu îl adaugă. Întotdeauna primesc mesajul de eroare. Dacă înlocuiesc get_results cu query, adaugă noul utilizator, dar îl adaugă și dacă are același email.

Lasă-mă să verific codul încă o dată. Apropo, verifică codul meu... Am făcut o mică modificare la interogare și la condiția care o verifică.

Pentru că comparația este greșită. Compari un obiect direct cu 0. Elimină parametrul ARRAY_N
și folosește var_dump pe obiect pentru a vedea cum este returnat count-ul. Îmi actualizez codul.

Corect, deci trebuie să folosești o altă funcție. Citește codex-ul, funcția query
returnează boolean la operațiune reușită. Aș sugera să folosești get_row
sau get_results
cu ARRAY_A
(array asociativ). Apoi verifică în condiție. Folosește PHPMyAdmin pentru a testa interogarea ta.

Am modificat codul în $data = $wpdb->get_results("SELECT COUNT(*) FROM $tablename WHERE students_email = '".$email."'");
și acum primesc eroarea dar pur și simplu nu pot adăuga noul student.

Cred că am reușit acum.
$data = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");if($wpdb->num_rows > 0){

Omule, printează interogarea SQL, ruleaz-o direct pe baza ta de date. Mai întâi cu un email existent, apoi cu unul care nu există. Dacă interogarea funcționează, codul meu va funcționa perfect. Ești pe Skype?

Cred că acum funcționează cu codul de mai sus. Probabil doar niște probleme la testare. Mulțumesc pentru ajutor. Da, sunt pe Skype.
