Fatal error: Uncaught Error: Call to a member function bind_param() on bool

publicado por: Anonymous

estoy tratando de hacer una Web, y quiero implementarle un sistema de inicio de sesion, pero al darle registrar en el formulario, me salta el siguiente error

Fatal error: Uncaught Error: Call to a member function bind_param() on
bool in C:xampphtdocspruebafunciones.php:15 Stack trace: #0
C:xampphtdocspruebaregisterregister.php(6): registro() #1 {main}
thrown in C:xampphtdocspruebafunciones.php on line 15

Este es el codigo

 function registro() {
    require_once('conexiones.php');
    $errores = [];

    $nombre = limpiar($_POST['nombre']);
    $apellido = limpiar($_POST['apellido']);
    $user = limpiar($_POST['user']);
    $contraseña = limpiar($_POST['contraseña']);
    $correo = limpiar($_POST['correo']);
    $pais = limpiar($_POST['pais']);

    $dec = $con -> prepare("INSERT INTO `perfiles` ('nombre', 'apellido', 'user', 'contraseña', 'correo', 'pais') VALUES (?, ?, ?, ?, ?, ?)");
    $dec -> bind_param("ssssss", $nombre, $apellido, $user, $contraseña, $correo, $pais);
    $dec -> execute();
    $resultado = $dec -> affected_rows;
    $dec -> free_result();
    $dec -> close();
    $con -> close();

    if ($resultado == 1) {
        $_SESSION['usuario'] = $user;
        header('Location: index.php');
    }
    else {
        $errores[] = 'Problemas tecnicos en estos momentos';
    }

    return $errores;

}

function limpiar($datos) {
    $datos = trim($datos);
    $datos = stripcslashes($datos);
    $datos = htmlspecialchars($datos);
    return $datos;
}

solución

El problema está en la query, para el nombre de las columnas se utiliza ` (tilde abierta) en lugar de ‘ (comilla).

Por ende, al dar error al preparar la query, lo anterior es false en lugar de un resultado, por ende, un bool, al cual no se le puede bindear nada.

Si eres nuevo en PHP, no te compliques la vida, entiendo que $con es el link de mysqli, sería tan fácil como:

 $con->query('INSERT INTO `perfiles` (`nombre`, `apellido`, `user`, `contraseña`, `correo`, `pais`) VALUES ('' . $nombre . '', '' . $apellido. '', '' . $user . '', '' . $contraseña. '', '' . $correo. '', '' . $pais . '')');

No obstante, si lo quieres hacer como lo haces, esto debería solucionar el problema de tu prepared statement:

$dec = $con->prepare("INSERT INTO `perfiles` (`nombre`, `apellido`, `user`, `contraseña`, `correo`, `pais`) VALUES (?, ?, ?, ?, ?, ?)");

Indicar además, que para evitar inyecciones SQL, y limpiar los datos con ello (aunque nombre, apellidos, etc. debe llevar una limpieza más específica, al igual que comprobar que el email y país sean válidos), deberías utilizar mysqli_real_escape_string.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *