Verificare se i dati esistono già nel database di WordPress - plugin personalizzato
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?
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

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

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.

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

Quindi devi verificare la query SQL eseguendola direttamente sul database.

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!

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
!

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

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.

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.

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.

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.

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.

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

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.

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

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

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?

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