Проверьте, существует ли электронная почта в базе данных: PHP и MySQL


это функция, которую я использую

function emailExiste($email){

    global $mysqli;

    $stmt = $mysqli->prepare("SELECT id FROM usuarios WHERE correo = ? LIMIT 1");
    $stmt->bind_param("s", $email);

    $stmt->execute();
    $stmt->store_result();
    $num = $stmt->num_rows;
    $stmt->close();

    if ($num > 0){
        return true;
        } else {
        return false;
    }
}

но при запуске я получаю следующую ошибку:

Fatal error: Uncaught Error: Call to a member function bindparam() on bool in C:\xampp\htdocs\Mi-pagina\DBusuarios.php:62 Stack trace: #0 C:\xampp\htdocs\Mi-pagina\registrate.php(29): emailExiste('') #1 {main} thrown in C:\xampp\htdocs\Mi-pagina\DBusuarios.php on line 62

строка 62 является"bind_param ()"

Кто-нибудь может указать мне, как это решить? Я очень новичок в этом, это первое, что я делаю.

Author: ricardo-dlc, 2021-03-04

1 answers

Ошибка: Fatal error: Uncaught Error: Call to a member function bind_param() on bool ... это указывает на то, что объект, на который вы хотите вызвать bind_param, является логическим.

Что происходит в этом случае, так это то, что $stmt является false (логическое значение), а не объектом Prepared Statement, который должен быть.

И почему это false? Ну, потому что что-то не удалось в коде. Таким образом, вы должны контролировать все, что может потерпеть неудачу, тем самым написав надежную программу, которая будет информировать вас во все времена ситуация.

Давайте перейдем к этому:

function emailExiste($email){

    global $mysqli;
    /*
     *1. Controlamos que haya conexión
    */
    if($mysqli) {
        #Para este caso es mejor usar COUNT
        $sql="SELECT COUNT(*) FROM usuarios WHERE correo = ? LIMIT 1";
        /*
         *2. Controlamos la preparación
        */
        if( $stmt = $mysqli->prepare($sql) ) {
            $stmt->bind_param("s", $email);
            $stmt->execute();
            #Se agrega el resultado de COUNT a $num
            $stmt->bind_result($num);
            $stmt->close();
            #Se puede usar operador de comparación
            $mData=array( 'msg'=>'success', 'status'=>($num > 0) );
        } else {
            $mData=array('msg'=>'Error preparando: '.$mysqli->error,'status'=>false);
        }
    } else {
        $mData=array('msg'=>'Error de conexión','status'=>false);        
    }
    return $mData;
}

В вызове метода вы можете сделать var_dump или прочитать ключ msg из него. Я использовал для этого случая array $mData, где я помещаю в ключ ' msg ' возможное сообщение (особенно для ошибок) и в ключе 'status' логическое значение, которое вам может понадобиться. Это то, что я сделал ad libitum, но вы можете изменить по своему вкусу.

Если вы что-то не понимаете, вы можете сказать это в комментариях.

  3
Author: A. Cedano, 2021-03-04 14:53:52