¿Qué hacer con los problemas de mysqli? Errores como mysqli_fetch_array(): el argumento n.° 1 debe ser del tipo mysqli_result y demás
En mi entorno local/de desarrollo, la consulta MySQLi funciona bien. Sin embargo, cuando lo subo a mi entorno de alojamiento web, aparece este error:
Error grave: llamada a una función miembro bind_param() en un no objeto en...
Aquí está el código:
global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param('i', $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);
Para verificar mi consulta, intenté ejecutar la consulta a través del panel de control phpMyAdmin y el resultado es correcto.
TL;DR
- Tenga siempre
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
en su código de conexión mysqli y siempre verifique los errores de PHP . - Reemplace siempre cada variable PHP en la consulta SQL con un signo de interrogación y ejecute la consulta utilizando una declaración preparada . Ayudará a evitar errores de sintaxis de todo tipo.
Explicación
A veces su código mysqli produce un error como mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given...
o Call to a member function bind_param()...
similar. O incluso sin ningún error, pero la consulta no funciona igual. Significa que su consulta no se pudo ejecutar.
Cada vez que falla una consulta, MySQL muestra un mensaje de error que explica el motivo . En las versiones anteriores de PHP, dichos errores no se transferían a PHP y todo lo que obtendría es un mensaje de error críptico mencionado anteriormente. Por lo tanto, es muy importante configurar PHP y mysqli para informarle los errores de MySQL. Y una vez que reciba el mensaje de error, podrá corregir el error.
Cómo obtener el mensaje de error en mysqli
En primer lugar, siempre tenga esta línea antes de que mysqli se conecte en todos sus entornos:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Después de eso, todos los errores de MySQL se transferirán a excepciones de PHP. Una excepción no detectada, a su vez, genera un error fatal de PHP. Por lo tanto, en caso de un error de MySQL, obtendrá un error de PHP convencional. Eso le informará instantáneamente de la causa del error. Y el seguimiento de la pila le llevará al lugar exacto donde ocurrió el error.
Cómo obtener el mensaje de error de PHP
En el servidor de desarrollo, asegúrese de que los errores se muestren en pantalla, mientras que en un servidor en vivo verifique los registros de errores. Consulte mi artículo sobre informes de errores de PHP para obtener más detalles.
Tenga en cuenta que en caso de una llamada AJAX, en un servidor de desarrollo abra DevTools (F12) y luego la pestaña Red. Luego inicie la solicitud cuyo resultado desea ver y aparecerá en la pestaña Red. Haga clic en él y luego en la pestaña Respuesta. Allí verá el resultado exacto. En un servidor en vivo, verifique el registro de errores.
Qué hacer con el mensaje de error que aparece
En primer lugar hay que localizar la consulta del problema. El mensaje de error contiene el nombre del archivo y el número de línea del lugar exacto donde ocurrió el error. Para el código simple eso es suficiente, pero si su código usa funciones o clases, es posible que deba seguir el seguimiento de la pila para ubicar la consulta del problema.
Después de recibir el mensaje de error, debe leerlo y comprenderlo. Suena demasiado obvio, si no condescendiente, pero los estudiantes a menudo pasan por alto el hecho de que el mensaje de error no es sólo una señal de alarma, sino que en realidad contiene una explicación detallada del problema . Y todo lo que necesitas es leer el mensaje de error y solucionar el problema.
- Digamos que si dice que una tabla en particular no existe, debe revisar la ortografía, los errores tipográficos y las mayúsculas y minúsculas. También debe asegurarse de que su script PHP se conecte a una base de datos correcta.
- O, si dice que hay un error en la sintaxis de SQL, entonces debe examinar su SQL. Y el punto del problema está justo antes de la parte de la consulta citada en el mensaje de error.
Si no comprende el mensaje de error, intente buscarlo en Google. Y cuando explore los resultados, limítese a las respuestas que expliquen el error en lugar de dar la solución sin rodeos. Es posible que una solución no funcione en su caso particular, pero la explicación le ayudará a comprender el problema y le permitirá solucionarlo usted mismo.
También debes confiar en el mensaje de error. Si dice que la cantidad de tokens no coincide con la cantidad de variables vinculadas, entonces es así . Lo mismo ocurre con las tablas o columnas ausentes. Si tiene la opción, ya sea su propio error o el mensaje de error es incorrecto, opte siempre por lo primero. Nuevamente suena condescendiente, pero cientos de preguntas en este mismo sitio demuestran que este consejo es extremadamente útil.
Depuración básica
En caso de que su consulta aparentemente no funcione, puede deberse a cuatro motivos siguientes:
- Hubo un error durante la ejecución. Ya explicado arriba.
- El SQL no se ejecutó en absoluto debido a una lógica de programa incorrecta. Agregue una salida de depuración temporal para asegurarse de que el código llegue al punto donde se ejecuta la consulta.
- El SQL se ejecutó exitosamente pero el resultado se ve en la base de datos incorrecta . Compruébalo dos veces
- Los datos de entrada no coinciden con los de la base de datos. Aquí te dejamos algunas recomendaciones sobre cómo comprobarlo.