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.
dea
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ă.
Rutwick Gangurde
Nu afișează nimic, de parcă nici nu verifică instrucțiunea if. Am încercat cu var_dump și echo și nimic. Doar adaugă studentul.
dea
Apoi trebuie să verifici interogarea SQL rulând-o direct pe baza de date.
Rutwick Gangurde
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!
dea
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!
Rutwick Gangurde
Am editat răspunsul tău cu interogarea SQL modificată și am observat imediat greșeala de tipar :D. Mulțumesc pentru ajutor!
dea
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.
Rutwick Gangurde
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.
dea
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ă.
Rutwick Gangurde
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.
Rutwick Gangurde
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.
Rutwick Gangurde
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.
dea
Cred că am reușit acum.
$data = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");if($wpdb->num_rows > 0){
dea
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?
Rutwick Gangurde
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.
dea