Verificare se i dati esistono già nel database di WordPress - plugin personalizzato

26 mag 2015, 10:42:41
Visualizzazioni: 18.2K
Voti: 0

Sto cercando di inserire un input utente in una tabella personalizzata in WordPress e non voglio avere voci duplicate. Il mio codice per verificarlo è:

    global $wpdb;
    $tablename=$wpdb->prefix."students"; //otteniamo il nome della tabella con il prefisso
    $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']);

    //controlliamo se l'utente esiste già per evitare duplicati
    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)) 
    )
    {
    //assegniamo i nuovi dati alle righe della tabella
        $newdata = array(
        'students_name'=>$name,
        'students_lastname'=>$surname,
        'students_email'=>$email,
        'students_date'=>current_time( 'mysql' ),
        );
        //inseriamo un record nel database
        $wpdb->insert(
        $tablename,
        $newdata
        );
    //mostriamo il messaggio di successo quando lo studente viene aggiunto
        ?>
        <div class="wrap">
            <div class="updated"><p>Studente aggiunto!</p></div>
        </div>
    <?php
    }else {
        if(!is_email($email)){
            echo '<div class="error"><p>Email non valida!</p></div>';
        }else{
        ?
    <div class="wrap">
            <div class="error"><p>Studente già esistente!</p></div> <!-- classe wp error per i messaggi di errore --->
        </div>
    <?php

        }
    }   
}

}

Il mio problema è che quando l'utente aggiunge i dati e poi li inserisce nuovamente subito dopo, viene mostrato il messaggio di errore e l'utente non viene aggiunto. Il problema si verifica quando l'utente clicca per visualizzare i record aggiunti (un'altra funzione) e poi clicca per aggiungere un nuovo studente: in questo caso il messaggio di errore non viene mostrato e lo stesso utente viene inserito due o più volte. Qualche idea?

5
Commenti

Puoi ottenere il risultato come array e contarlo. Se non è 0 significa che l'utente esiste già.

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

Ma nel database può esserci lo stesso nome se non ha lo stesso cognome e può esserci lo stesso cognome se non ha lo stesso nome. Non sto solo controllando se nome e cognome corrispondono. Si può fare anche questo con il conteggio?

dea dea
26 mag 2015 11:15:28

Il commento è confuso! Puoi illustrarlo meglio? Un'altra cosa, devi anche usare JavaScript per pulire i tuoi form. Usa un identificatore univoco per uno studente, come un numero di matricola o un indirizzo email, perché nome+cognome possono essere duplicati.

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

Questo modulo si trova in un plugin personalizzato che utilizza dati di tabelle personalizzate e un custom post type e viene mostrato nel menu di amministrazione. L'amministratore aggiunge il nome, cognome ed email degli studenti, e se dimentica che uno studente è già stato aggiunto o qualcosa di simile, non voglio consentire voci duplicate. Quindi uno studente con lo stesso nome ma email diversa può essere aggiunto, ma se hanno lo stesso nome e cognome è una voce duplicata. Forse sarebbe più semplice controllare solo se le email sono diverse.

dea dea
26 mag 2015 11:39:31

Ecco, le email sono univoche. È perfettamente valido che esistano 2 persone con lo stesso nome, ma impossibile con la stessa email. Leggi il codice della mia risposta, utilizza l'email come ID univoco per risolvere il problema delle voci duplicate.

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 11:41:58
Tutte le risposte alla domanda 1
22

Puoi migliorare molto il tuo codice. Tratterò l'indirizzo email come identificazione unica dello studente, dato che potrei sicuramente avere 2 studenti chiamati '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)) {
        //Mostra errore email non valida ed esci
       echo '<div class="error"><p>Email non valida!</p></div>';
       //return o exit
    }

    //Controllo se l'email dell'utente esiste già
    $datum = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");

    //Stampa l'oggetto $datum per vedere come viene memorizzato il conteggio.
    //Presumo che la chiave sia 'count'

    if($wpdb->num_rows > 0) {
        //Mostra messaggio errore duplicato ed esci
        ?>
        <div class="wrap">
            <div class="error"><p>Studente già esistente!</p></div> <!-- classe wp error per avvisi di errore --->
        </div>
        <?php
        //return o exit
    }

    //Ora che l'email è unica e valida, procediamo con l'inserimento
    //assegnazione dei nuovi dati alle righe della tabella
    $newdata = array(
        'students_name'=>$name,
        'students_lastname'=>$surname,
        'students_email'=>$email,
        'students_date'=>current_time( 'mysql' ),
    );
    //inserimento di un record nel database
    $wpdb->insert(
        $tablename,
        $newdata
    );
    //mostra messaggio successo quando studente viene aggiunto
    ?>
    <div class="wrap">
        <div class="updated"><p>Studente aggiunto!</p></div>
    </div>
<?php }

Ho evitato molte condizioni e loop non necessari. Prova questo. Usa un po' di JavaScript per pulire il form quando viene fatto un inserimento con successo.

Aggiornamento: Ho usato get_results in accordo con la query che hai postato. Ora devi usare $wpdb->num_rows per contare il numero di risultati nella condizione.

Fonte: https://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results https://wordpress.org/support/topic/wpdb-mysql_num_rows

26 mag 2015 11:36:36
Commenti

Penso che mi servano alcune condizioni, perché ora aggiunge comunque lo studente anche se ha la stessa email.

dea dea
26 mag 2015 11:57:44

Stampa l'oggetto $datum per vedere se restituisce i dati corretti. Aggiungi un'istruzione echo all'interno dell'if count per verificare se la condizione è soddisfatta.

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 12:03:12

Non mostra nulla, come se non controllasse nemmeno l'istruzione if. Ho provato con var_dump ed echo e niente. Aggiunge semplicemente lo studente.

dea dea
26 mag 2015 12:09:58

Quindi devi verificare la query SQL eseguendola direttamente sul database.

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

L'ho risolto con una query SQL diversa. L'ho fatto con $datum = $wpdb->get_results("SELECT COUNT(*) FROM $tablename WHERE students_email = $email", ARRAY_N); e poi il if($datum > 0 ) e ora funziona. Grazie per l'aiuto!

dea dea
26 mag 2015 12:53:42

Fantastico! Sono contento di aver potuto aiutare. Per favore modifica la mia risposta e inserisci la query corretta lì. Potrebbe essere utile a qualcuno in futuro. A proposito, c'era un errore di battitura nella mia query SQL, ho usato student_email invece di students_email!

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 12:54:45

Ho modificato la tua risposta con la query SQL cambiata e ho notato subito il refuso :D. Grazie per il tuo aiuto!

dea dea
26 mag 2015 13:00:07

Penso che tu debba usare $wpdb->query invece di get_results visto che stai controllando un array contro 0, quando in realtà dovresti controllare il conteggio contro 0. Anche se funziona, è sbagliato.

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 13:00:42

Ero così concentrato nel testare se gli utenti hanno la stessa email, che ho dimenticato di testare se aggiunge il nuovo utente, e infatti non lo aggiunge. Ricevo sempre il messaggio di errore. Se sostituisco get_results con query aggiunge il nuovo utente ma lo aggiunge anche se ha la stessa email.

dea dea
26 mag 2015 13:05:19

Fammi controllare il codice ancora una volta. A proposito, controlla il mio codice... Ho apportato una piccola modifica alla query e alla condizione che la verifica.

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 14:14:11

Sta ancora aggiungendo l'utente se ha la stessa email.

dea dea
26 mag 2015 14:51:50

Perché il confronto è sbagliato. Stai confrontando un oggetto direttamente con 0. Rimuovi il parametro ARRAY_N e fai un var_dump dell'oggetto per vedere come viene restituito il conteggio. Sto aggiornando il mio codice.

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 14:58:37

Ottengo bool(false) che è strano.

dea dea
26 mag 2015 15:20:47

Esatto, quindi devi solo usare una funzione diversa. Leggi il codex, la funzione query restituisce un booleano sull'operazione riuscita. Suggerirei di usare get_row o get_results con ARRAY_A (array associativo). Poi contalo nella condizione. Usa PHPMyAdmin per testare la tua query.

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 15:49:30

Controlla la mia risposta aggiornata.

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

Continua ad aggiungere l'utente con la stessa email. Questo ora mi sta facendo impazzire.

dea dea
26 mag 2015 16:09:09

Ho modificato il codice in $data = $wpdb->get_results("SELECT COUNT(*) FROM $tablename WHERE students_email = '".$email."'"); e ora ottengo l'errore ma non riesco proprio ad aggiungere il nuovo studente.

dea dea
26 mag 2015 16:22:20

Penso di averlo capito ora. $data = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");if($wpdb->num_rows > 0){

dea dea
26 mag 2015 16:29:15

A quanto pare non ci sono ancora. Funziona, poi non funziona. Non so più cosa pensare.

dea dea
26 mag 2015 16:35:40

Amico, stampa la query SQL ed eseguila direttamente sul tuo database. Prima con un'email esistente, poi con una che non esiste. Se la query funziona, il mio codice funzionerà perfettamente. Sei su Skype?

Rutwick Gangurde Rutwick Gangurde
26 mag 2015 17:17:12

Penso che ora funzioni con il codice sopra. Solo alcuni problemi durante i test immagino. Grazie per tutto l'aiuto. Sì, sono su Skype.

dea dea
26 mag 2015 18:45:36

Fantastico amico. Se rimani di nuovo bloccato, contattami su Skype, l'ID è rutwick.gangurde.

Rutwick Gangurde Rutwick Gangurde
27 mag 2015 09:39:16
Mostra i restanti 17 commenti