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.
dea
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.
Rutwick Gangurde
No muestra nada, como si ni siquiera verificara la declaración if. Intenté con var_dump y echo y nada. Simplemente agrega al estudiante.
dea
Luego necesitas verificar la consulta SQL ejecutándola directamente en la base de datos.
Rutwick Gangurde
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!
dea
¡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!
Rutwick Gangurde
Edié tu respuesta con la consulta SQL modificada y noté el error tipográfico de inmediato :D. ¡Gracias por tu ayuda!
dea
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.
Rutwick Gangurde
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.
dea
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.
Rutwick Gangurde
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.
Rutwick Gangurde
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.
Rutwick Gangurde
Sigo agregando al usuario con el mismo correo. Esto ahora me está volviendo loco.
dea
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.
dea
Creo que ahora lo tengo.
$data = $wpdb->get_results("SELECT * FROM $tablename WHERE students_email = '".$email."'");if($wpdb->num_rows > 0){
dea
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?
Rutwick Gangurde
Creo que ahora funciona con el código anterior. Solo algunos problemas de prueba supongo. Gracias por toda tu ayuda. Sí, estoy en Skype.
dea