2

Estoy intentando mediante Ajax mostrar si el usuario existe en la base de datos para no tener dos usuarios registrados con el mismo nombre. Lo que hago es mediante el evento change de jQuery mostrar con un span si existe o no el usuario en la base de datos.

El problema es que todo el tiempo me devuelve que el usuario ya existe en la base de datos aún no estando registrado.

HTML

<form method="post" onsubmit="return validateRegister()">

    <label for="user_register">Usuario<span></span></label><br />
    <input type="text" placeholder="Maximo 6 caracteres" name="user_register" id="user_register" required><br /><br />

    <label for="pass_register">Password</label><br />
    <input type="password" placeholder="Minimo 6 caracteres" name="pass_register" id="pass_register" required><br /><br />

    <label for="email_register">E-mail</label><br />
    <input type="text" placeholder="E-mail" name="email_register" id="email_register" required><br />

    <p><input type="checkbox" id="terms_register"><a href="#">Acepta condiciones</a></p>

    <input type="submit" value="Enviar">

</form>

JavaScript

/*===============================================
        Validar Usuario Existente con Ajax
===============================================*/

$('#user_register').change(function() {

    var user = $("#user_register").val();
    var datas = new FormData();
    datas.append("validateuser", user);

    $.ajax({

        url: "views/modules/ajax.php",
        method: "POST",
        data: datas,
        cache: false,
        contentType: false,
        processData: false,
        success: function(query) {

           if(query == 0) {

                $("label[for='user_register'] span").html('<p>Este usuario ya existe en la base de datos</p>');

           } else {

                $("label[for='user_register'] span").html('No detecto usuario registrado');

           }

        }

    });

});

Ajax

require_once "../../controllers/controller.php";
require_once "../../models/crud.php";

class Ajax {

    public $validateuser;

    public function validateUserAjax() {

        $data = $this->validateuser;

        $return = MvcController::validateUserController($data);

        echo $return;

    }

}

    $a = new Ajax();
    $a->validateuser = $_POST['validateuser'];
    $a->validateUserAjax();

Controller

# Validar el usuario que ha seleccionado el usuario y comprobar que no exista ya en la base de datos
# -----------------------------------------------
public static function validateUserController($user) {

    $datacontroller = $user;

    $return = Data::validateUserModel($datacontroller, "usuarios");

    if(count($return['user'] > 0)) {

        echo 0;

    } else {

        echo 1;

    }

}

Model

# Validar el usuario y que no haya dos repetidos
public static function validateUserModel($datamodel, $table) {

    $sql = "SELECT user FROM $table WHERE user = :user";

    $stmt = Conection::connect()->prepare($sql);
    $stmt->bindParam(':user', $datamodel, PDO::PARAM_STR);

    $stmt->execute();

    return $stmt->fetch();

    $stmt->close();

}

¿Qué he intentado?

He cambiado el método del controlador validateUserController de estático a no estático y lo único que he conseguido es que cambie el valor de 0 a 1 y por lo tanto que cambie el mensaje que se muestra en el formulario. Pero en cualquier caso no está funcionando bien.

Si pongo un usuario que existe muestra que el usuario existe, pero si pongo un usuario que no existe, entonces muestra que el usuario existe. He revisado una y otra vez la query no veo nada raro.

La tabla en MySQL es la siguiente

Tabla: usuarios
Campo: user, tipo VARCHAR

¿Qué estoy haciendo mal?

David
  • 1,437
  • 1
  • 20
  • 40
  • Prueba a limpiar la respuesta que recibes usando `trim`. Algo así: **`if(query.trim() == 0) { //resto del código`**, o bien así: **`if(query.trim() == "0") { //resto del código`** En las peticiones Ajax es conveniente manejar JSON e indicar en PHP el header, pues en ocasiones la respuesta agrega un salto de línea adicional (ya ha pasado [una vez :)](https://es.stackoverflow.com/a/128420/29967) y [también otra vez](https://es.stackoverflow.com/a/103952/29967))... Si aún no funciona, depura tus variables en PHP, puede que no estés obteniendo los datos que crees obtener. – A. Cedano Mar 28 '18 at 00:59
  • Gracias por el comentario, he añadido la respuesta con la solución que he encontrado aplicando lo que me has indicado en el archivo javascript. – David Mar 28 '18 at 16:08
  • Me alegro de que lo hayas resuelto. De todos modos, para evitar dar tantas vueltas para una validación, escribe código coherente en el servidor (en los archivos PHP), y en la petición Ajax, maneja respuestas a través de JSON. Es mucho más fácil, más claro, más rápido, más eficaz y menos propenso a errores. O sea, en el PHP, cuando no haya datos tú puedes devolver un JSON con un dato `NULL` o `0` y cuando haya datos, devolver un `1`, y si hay un error, devolver una clave `error` con un mensaje. Luego en Ajax lees ese JSON y actúas en consecuencia. – A. Cedano Mar 28 '18 at 20:51

2 Answers2

0

En el controler:

# Validar el usuario que ha seleccionado el usuario y comprobar que no 
exista ya en la base de datos
# -----------------------------------------------
public static function validateUserController($user) {

$datacontroller = $user;

$return = Data::validateUserModel($datacontroller, "usuarios");

if(count($return['user'] > 0)) {

    echo 0;

} else {

    echo 1;

}

¿No deberías estar poniendo return 0; y return 1; en vez de echo 0; y echo 1;?

toni lopez
  • 38
  • 4
0

Lo primero que hice fue intentar limpiar el string en el JS, tal y como me ha aconsejado A. Cedano y no resultó, seguía fallando. Así que me puse a depurar las variables o más bien a comprobar qué es lo que llegaba del método.

Hice un var_dump($return) en validateUserController() y lo que pude comprobar es que siempre trae algo, me explico: si daba con el usuario mostraba el usuario, y si no traía false, pero algo siempre venía en el var_dump. Supongo que por esto siempre daba antes con la existencia del usuario, porque siempre contaba algo.

Lo que he hecho es modificar validateUserController() con el siguiente código:

if(count($return['user'] > 0)) {

    echo count($return['user']);

    } else {

    echo "null";

}

Y en el JS he depurado el string tal y como me ha sugerido A. Cedano, aunque antes comprobé con console.log(typeof(query)+": "+query); que devuelve un string y que además venía con "0" o "1" si daba o no con un usuario registrado, huelga decir que también he cambiado el orden de dichos valores y puedo decir que me está funcionando como quería.

if (query.trim() == "1") {

    $("label[for='user_register'] span").html('<p>Este usuario ya existe en la base de datos</p>');

 } else {

    $("label[for='user_register'] span").html('No detecto usuario registrado');

}

Gracias a A. Cedano y Toni López por su ayuda. Si he hecho mal publicando la respuesta ruego por favor que me lo indiquéis para eliminar la respuesta o más bien la pregunta.

David
  • 1,437
  • 1
  • 20
  • 40