Verificarea existenței datelor înainte de inserare în baza de date WordPress - plugin personalizat

26 mai 2015, 10:42:41
Vizualizări: 18.2K
Voturi: 0

Î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?

5
Comentarii

Poți obține rezultatul ca un array și să-l numeri. Dacă nu este 0, înseamnă că utilizatorul există deja.

Rutwick Gangurde Rutwick Gangurde
26 mai 2015 11:12:04

Dar în baza de date poate exista același nume dacă nu are același prenume și poate exista același prenume dacă nu are același nume. Nu verific doar dacă numele și prenumele se potrivesc. Se poate face și asta prin numărare?

dea dea
26 mai 2015 11:15:28

Comentariul este confuz! Poți ilustra? Un alt lucru, trebuie să folosești și ceva JavaScript pentru a goli formularele. Folosește un identificator unic pentru un student, cum ar fi un număr matricol sau o adresă de email, deoarece numele+prenumele pot fi duplicate.

Rutwick Gangurde Rutwick Gangurde
26 mai 2015 11:16:28

Acest formular se află într-un plugin personalizat care utilizează date din tabele personalizate și un tip de postare personalizat și este afișat în meniul de administrare. Administratorul adaugă numele, prenumele și adresa de email a studenților, iar dacă uită că un student a fost deja adăugat sau ceva similar, nu doresc să permit intrări duplicate. Deci un student cu același nume dar cu altă adresă de email poate fi adăugat, dar dacă au același nume și prenume, este o intrare duplicat. Poate ar fi mai ușor să verificăm doar dacă adresele de email sunt diferite.

dea dea
26 mai 2015 11:39:31

Iată, adresele de email sunt unice. Este perfect valid ca 2 persoane cu aceleași nume să existe, dar imposibil cu aceleași adrese de email. Citește codul din răspunsul meu, acesta folosește email-ul ca ID unic pentru a rezolva problema intrărilor duplicate.

Rutwick Gangurde Rutwick Gangurde
26 mai 2015 11:41:58
Toate răspunsurile la întrebare 1
22

Îț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

26 mai 2015 11:36:36
Comentarii

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

dea dea
26 mai 2015 11:57:44

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 Rutwick Gangurde
26 mai 2015 12:03:12

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 dea
26 mai 2015 12:09:58

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

Rutwick Gangurde Rutwick Gangurde
26 mai 2015 12:46:11

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 dea
26 mai 2015 12:53:42

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 Rutwick Gangurde
26 mai 2015 12:54:45

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

dea dea
26 mai 2015 13:00:07

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 Rutwick Gangurde
26 mai 2015 13:00:42

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 dea
26 mai 2015 13:05:19

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 Rutwick Gangurde
26 mai 2015 14:14:11

Încă adaugă utilizatorul dacă are același email.

dea dea
26 mai 2015 14:51:50

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 Rutwick Gangurde
26 mai 2015 14:58:37

Am primit bool(false) ceea ce este ciudat.

dea dea
26 mai 2015 15:20:47

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 Rutwick Gangurde
26 mai 2015 15:49:30

Verifică răspunsul meu actualizat.

Rutwick Gangurde Rutwick Gangurde
26 mai 2015 15:55:43

Încă adaug utilizatorul cu același email. Asta începe să mă enerveze.

dea dea
26 mai 2015 16:09:09

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 dea
26 mai 2015 16:22:20

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

dea dea
26 mai 2015 16:29:15

Se pare că nu am înțeles. Funcționează, apoi nu funcționează. Nu mai știu.

dea dea
26 mai 2015 16:35:40

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 Rutwick Gangurde
26 mai 2015 17:17:12

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 dea
26 mai 2015 18:45:36

Excelent, omule. Dacă te blochezi din nou, contactează-mă pe Skype, ID-ul este rutwick.gangurde.

Rutwick Gangurde Rutwick Gangurde
27 mai 2015 09:39:16
Arată celelalte 17 comentarii