Comprobar si los datos ya existen en la base de datos de WordPress - Plugin personalizado
Estoy intentando insertar datos ingresados por el usuario en una tabla personalizada en WordPress y no quiero tener entradas duplicadas. Mi código para verificar esto es:
global $wpdb;
$tablename=$wpdb->prefix."students"; //obteniendo el nombre de nuestra tabla con prefijo
$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']);
//verificando si el usuario ya existe para no agregarlo dos veces
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))
)
{
//asignando los nuevos datos a las filas de la tabla
$newdata = array(
'students_name'=>$name,
'students_lastname'=>$surname,
'students_email'=>$email,
'students_date'=>current_time( 'mysql' ),
);
//insertando un registro en la base de datos
$wpdb->insert(
$tablename,
$newdata
);
//mostrando mensaje de éxito cuando se agrega un estudiante
?>
<div class="wrap">
<div class="updated"><p>Estudiante agregado!</p></div>
</div>
<?php
}else {
if(!is_email($email)){
echo '<div class="error"><p>Correo electrónico inválido!</p></div>';
}else{
?
<div class="wrap">
<div class="error"><p>El estudiante ya existe!</p></div> <!-- clase wp error para notificaciones de error --->
</div>
<?php
}
}
}
}
Mi problema es que cuando el usuario agrega los datos y si luego agrega los mismos datos nuevamente inmediatamente, se muestra el mensaje de error y el usuario no se agrega. El problema ocurre cuando el usuario hace clic para ver los registros agregados (otra función) y luego hace clic para agregar un nuevo estudiante, entonces el mensaje de error no se muestra y el mismo usuario se ingresa dos veces o más. ¿Alguna idea?

Puedes mejorar mucho tu código. Trataré la dirección de correo electrónico como la identificación única del estudiante, ya que definitivamente puedo tener 2 estudiantes llamados '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)) {
//Mostrar error de correo inválido y salir
echo '<div class="error"><p>¡Correo electrónico inválido!</p></div>';
//return o exit
}
//Verificando si el correo del usuario ya existe
$datum = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");
//Imprime el objeto $datum para ver cómo se almacena el conteo en él.
//Asumo que la clave es 'count'
if($wpdb->num_rows > 0) {
//Mostrar mensaje de error de entrada duplicada y salir
?>
<div class="wrap">
<div class="error"><p>¡El estudiante ya existe!</p></div> <!-- clase wp error para notificaciones de error --->
</div>
<?php
//return o exit
}
//Ahora que el correo es único y válido, procedamos a ingresarlo
//asignando los nuevos datos a las filas de la tabla
$newdata = array(
'students_name'=>$name,
'students_lastname'=>$surname,
'students_email'=>$email,
'students_date'=>current_time( 'mysql' ),
);
//insertando un registro en la base de datos
$wpdb->insert(
$tablename,
$newdata
);
//mostrando el mensaje de éxito cuando se agrega el estudiante
?>
<div class="wrap">
<div class="updated"><p>¡Estudiante agregado!</p></div>
</div>
<?php }
He evitado muchas condiciones y bucles innecesarios. Prueba esto. Usa algo de JavaScript para limpiar tu formulario cuando se haga una entrada exitosa.
Actualización:
He usado get_results
de acuerdo con la consulta que habías publicado. Ahora tienes que usar $wpdb->num_rows
para contar el número de resultados en la condición.
Fuente: https://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results https://wordpress.org/support/topic/wpdb-mysql_num_rows

Creo que necesito algunas condiciones, porque ahora sigue agregando el estudiante si tiene el mismo correo electrónico.

Imprime el objeto $datum
para ver si devuelve los datos correctos. Agrega una declaración echo dentro del if count
para verificar si se cumple la condición.

No muestra nada, como si ni siquiera verificara la declaración if. Intenté con var_dump y echo y nada. Simplemente agrega al estudiante.

Luego necesitas verificar la consulta SQL ejecutándola directamente en la base de datos.

Lo solucioné con una consulta SQL diferente. Lo hice con $datum = $wpdb->get_results("SELECT COUNT(*) FROM $tablename WHERE students_email = $email", ARRAY_N);
y luego el if($datum > 0 )
y ahora funciona. ¡Gracias por tu ayuda!

¡Genial! Me alegra haber podido ayudar. Por favor edita mi respuesta y coloca la consulta correcta ahí. Podría ayudar a alguien en el futuro. Por cierto, había un error tipográfico en mi consulta SQL, usé student_email
en lugar de students_email
!

Edié tu respuesta con la consulta SQL modificada y noté el error tipográfico de inmediato :D. ¡Gracias por tu ayuda!

Creo que necesitas usar $wpdb->query
en lugar de get_results
ya que estás comparando un array con un 0, cuando en realidad deberías estar comparando el conteo con el 0. Aunque funcione, está incorrecto.

Estaba tan concentrado en probarlo para ver si los usuarios tienen el mismo correo, que olvidé probar si añade el nuevo usuario, y no lo añade. Siempre obtengo el mensaje de error. Si reemplazo get_results con query, añade el nuevo usuario pero también lo añade aunque tenga el mismo correo.

Déjame revisar el código una vez más. Por cierto, revisa mi código... He hecho un cambio menor en la consulta y en la condición que la verifica.

Porque la comparación está mal. Estás comparando un objeto directamente con 0. Elimina el parámetro ARRAY_N
y haz un var_dump del objeto para ver cómo se devuelve el conteo. Estoy actualizando mi código.

Correcto, entonces solo necesitas usar una función diferente. Lee el codex, la función query
retorna un booleano en operación exitosa. Sugeriría usar get_row
o get_results
con ARRAY_A
(arreglo asociativo). Luego contarlo en la condición. Usa PHPMyAdmin para probar tu consulta.

Sigo agregando al usuario con el mismo correo. Esto ahora me está volviendo loco.

Cambié el código a $data = $wpdb->get_results("SELECT COUNT(*) FROM $tablename WHERE students_email = '".$email."'");
y ahora obtengo el error pero simplemente no puedo agregar al nuevo estudiante.

Creo que ahora lo tengo.
$data = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");if($wpdb->num_rows > 0){

Amigo, imprime la consulta SQL, ejecútala directamente en tu base de datos. Primero con un email existente, luego con uno que no exista. Si la consulta funciona, mi código funcionará bien. ¿Estás en Skype?

Creo que ahora funciona con el código anterior. Solo algunos problemas de prueba supongo. Gracias por toda tu ayuda. Sí, estoy en Skype.
