Comprobar si los datos ya existen en la base de datos de WordPress - Plugin personalizado

26 may 2015, 10:42:41
Vistas: 18.2K
Votos: 0

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?

5
Comentarios

Puedes obtener el resultado como un array y contarlo. Si no es 0, significa que el usuario ya existe.

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

Pero en la base de datos puede haber el mismo nombre si no tiene el mismo apellido y puede ser el mismo apellido si no tiene el mismo nombre. No solo estoy verificando si coinciden el nombre y el apellido. ¿También se puede hacer eso con el conteo?

dea dea
26 may 2015 11:15:28

¡El comentario es confuso! ¿Puedes ilustrarlo? Otra cosa, también necesitas usar algo de JavaScript para limpiar tus formularios. Usa un identificador único para un estudiante, como un número de matrícula o una dirección de correo electrónico, porque los nombres + apellidos pueden duplicarse.

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

Este formulario está en un plugin personalizado que utiliza datos de tablas personalizadas y un tipo de entrada personalizado, y se muestra en el menú de administración. El administrador agrega el nombre, apellido y correo electrónico de los estudiantes, y si olvida que un estudiante ya fue agregado o algo por el estilo, no quiero permitir entradas duplicadas. Así que un estudiante con el mismo nombre pero diferente correo electrónico puede ser agregado, pero si tienen el mismo nombre y apellido es una entrada duplicada. Tal vez sería más fácil solo verificar si los correos electrónicos son diferentes.

dea dea
26 may 2015 11:39:31

Ahí lo tienes, los correos electrónicos son únicos. Es perfectamente válido que existan 2 personas con los mismos nombres, pero imposible con los mismos correos electrónicos. Lee el código de mi respuesta, utiliza el correo electrónico como ID único para resolver el problema de entradas duplicadas.

Rutwick Gangurde Rutwick Gangurde
26 may 2015 11:41:58
Todas las respuestas a la pregunta 1
22

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

26 may 2015 11:36:36
Comentarios

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

dea dea
26 may 2015 11:57:44

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

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

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

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

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

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

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

dea dea
26 may 2015 13:00:07

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

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

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

Todavía agrega al usuario si tiene el mismo correo electrónico.

dea dea
26 may 2015 14:51:50

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

Recibo bool(false) lo cual es extraño.

dea dea
26 may 2015 15:20:47

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

Revisa mi respuesta actualizada.

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

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

dea dea
26 may 2015 16:09:09

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

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

dea dea
26 may 2015 16:29:15

Al parecer no lo tengo. Funciona, luego no funciona. Ya no sé más.

dea dea
26 may 2015 16:35:40

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

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

Eso es genial, amigo. Si te quedas atascado de nuevo, escríbeme por Skype, el id es rutwick.gangurde.

Rutwick Gangurde Rutwick Gangurde
27 may 2015 09:39:16
Mostrar los 17 comentarios restantes