PHP – mysqli :: prepare return false

Tengo este código PHP realmente simple:

$mysqli = new mysqli('localhost', 'xxx', 'xxxxx', 'xxx'); $query = "SELECT * FROM questions WHERE id = ?"; $stmt = $mysqli->prepare($query); $stmt->bind_param('d', $_GET['qid']); $stmt->execute(); $stmt->bind_result($id, $content, $correct_ans, $lol); $stmt->fetch(); //do sth with the data $query = "SELECT * FROM answers WHERE question_id = ?"; $stmt = $mysqli->prepare($query); $stmt->bind_param('d', $_GET['qid']); $stmt->execute(); $stmt->bind_result($id, $content, $lol); while($stmt->fetch()) { //do sth } 

Básicamente, parece que no importa lo que haga, el segundo mysqli::prepare() siempre devolverá falso, sin embargo mysqli::error está vacío por alguna razón. ¿Alguien puede ver un error aquí?

PD. No es una pregunta duplicada; sí, ya se ha preguntado: statement preparada de MySQLi que devuelve falso pero el autor no se molestó en compartir su solución con todos.

EDITAR: Pensé que debería explicar esto: SOLAMENTE el segundo preparativo devuelve falso, el primero es absolutamente bueno. Lo que es aún más extraño es que si elimino las primeras líneas de código (es decir, la primera preparación), la segunda funcionará sin problemas …

EDIT2: Bueno, todo lo que puedo decir ahora es WTF. Resulta que si elimino la tarea, (no hago $stmt = prepare()...) sino que llamo a la función, $mysqli->error lista de $mysqli->error no está vacía – dice “Comandos fuera de sincronización; no puedes ejecutar este comando ahora “. Si hago la tarea, está vacía …

EDIT3: Cambié a PDO y funciona perfectamente. Hasta que pueda probar lo contrario, asumiré que MySQLi tiene fallas.

Antes del segundo uso de mysqli::prepare() debe liberar el resultado de mysqli o cerrar la statement de mysqli actual :

 ... //do sth with the data $mysqli->free(); // or $stmt->close(); $query = "SELECT * FROM answers WHERE question_id = ?"; $stmt = $mysqli->prepare($query); ... 

¿Ha establecido las credenciales correctas para el acceso a la base de datos? usuario Contraseña….

¿Qué devuelve este código?

print_r($mysqli->error_list);

http://www.php.net/manual/en/mysqli.error-list.php

La consulta SQL se ve bien, pero tal vez tengas un nombre de base de datos o estructura de tabla incorrectos …

Descubrí que fallará silenciosamente (errno = 0, error = “”) cuando el valor de retorno de prepare se asigne a un nombre de variable que anteriormente contenía una instrucción preparada MYSQLi, pero devolverá los mensajes de error correctos si se usa una nueva variable. El hecho de que esto sea posible incluso dice cosas negativas sobre el modelo de ejecución PHP en mi humilde opinión.

Contrariamente a otras respuestas anteriores, puede tener múltiples declaraciones preparadas y usarlas al mismo tiempo, es el antiguo controlador mysql (no mysqli) que no puede caminar y masticar chicle.

Estoy trabajando en un marco existente, pero recomiendo sinceramente cambiar a PDO, que es la manera canónica de hacerlo.