mysqli_fetch_assoc () espera errores de parámetro / llamada a una función miembro bind_param (). ¿Cómo obtener el error real de mysql y solucionarlo?


109

En mi entorno local / de desarrollo, la consulta de MySQLi funciona correctamente. Sin embargo, cuando lo cargo en mi entorno de alojamiento web, aparece este error:

Error fatal: 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.


¿Podemos ver dónde está iniciando la $mysqlivariable?
Rikesh

Puede ser que su usuario de MySQL no tenga los privilegios para realizar una SELECTconsulta. ¿Revisaste eso?
Amal Murali

Lo que me viene a la mente es que no hay mysqli disponible o que proporcionó credenciales incorrectas para conectarse a MySQL.
NB

@YourCommonSense: con el título anterior, era más sencillo encontrar esta pregunta como referencia duplicada.
Paul Spiegel

@Paul sí, esta también es mi mayor preocupación. Cambié el título por el bien de la búsqueda de Google y el reconocimiento general, ya que para el usuario promedio de PHP la conexión entre su código y diferentes entornos no está clara. Pero desde entonces también me está costando encontrarlo. Termina por tenerlo en marcadores. Si puede proponer un título reconocible pero relevante, sería genial
su sentido común

Respuestas:


123

A veces, su código MySQLi produce un error como mysqli_fetch_assoc() expects parameter..., Call to a member function bind_param()...o 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 tiene un mensaje de error que explica el motivo . Desafortunadamente, de forma predeterminada, estos errores no se transfieren a PHP, y todo lo que tiene es un mensaje de error críptico mencionado anteriormente. Por lo tanto, es muy importante configurar PHP y MySQLi para informarle de los errores de MySQL. Y una vez que reciba el mensaje de error, solucionarlo será pan comido.

¿Cómo obtener el mensaje de error en MySQLi?

En primer lugar, tenga siempre 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 las excepciones de PHP. La excepción no detectada, a su vez, produce 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 un seguimiento de la pila lo llevará al lugar exacto donde ocurrió el error.

Cómo configurar PHP en diferentes entornos

Aquí hay una parte esencial de mi artículo sobre informes de errores de PHP :
Informar errores en un servidor de desarrollo y en vivo deben ser diferentes. En un servidor de desarrollo, es conveniente que los errores se muestren en pantalla, pero en un servidor en vivo los mensajes de error deben registrarse en su lugar, para que pueda encontrarlos en el registro de errores más tarde.

Por lo tanto, debe establecer las opciones de configuración correspondientes a los siguientes valores:

  • En un servidor de desarrollo

    • error_reportingdebe establecerse en E_ALLvalor;
    • log_errors debe establecerse en 1 (también es conveniente tener registros en una PC de desarrollo)
    • display_errors debe establecerse en 1
  • En un servidor de producción

    • error_reportingdebe establecerse en E_ALLvalor;
    • log_errors debe establecerse en 1
    • display_errors debe establecerse en 0

¿Cómo se usa realmente?

Basta con retirar cualquier código que comprueba el error de forma manual , a todos aquellos or die(), if ($result)y tales. Simplemente escriba el código de interacción de su base de datos de inmediato:

$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();

de nuevo, sin condiciones alrededor . Si ocurre un error, se tratará como cualquier otro error en su código. Por ejemplo, en una PC de desarrollo, simplemente aparecerá en la pantalla, mientras que en un sitio en vivo se registrará para un programador, mientras que para la conveniencia del usuario podría usar un controlador de errores (pero esa es una historia diferente que está fuera de tema para MySQLi, pero puede leerlo en el artículo vinculado anteriormente).

¿Qué hacer con el mensaje de error que aparece?

Primero que nada tienes 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 utiliza funciones o clases, es posible que deba seguir el seguimiento de la pila para localizar la consulta del problema.

Después de recibir el mensaje de error, debe leerlo y comprenderlo. Suena demasiado obvio, si no condescendiente, pero los alumnos a menudo pasan por alto el hecho de que el mensaje de error no es solo una señal de alarma, sino que en realidad contiene una explicación detallada del problema . Y todo lo que necesita es leer el mensaje de error y solucionar el problema.

  • Digamos, si dice que una tabla en particular no existe, tiene que revisar la ortografía, errores tipográficos, 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 SQL, entonces debe examinar su SQL. Y el lugar del problema está justo antes de la parte de consulta citada en el mensaje de error.

Si no comprende el mensaje de error, intente buscarlo en Google. Y cuando examine 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 lo ayudará a comprender el problema y le permitirá solucionarlo usted mismo.

También debe confiar en el mensaje de error. Si dice que el número de tokens no coincide con el número de variables vinculadas, entonces es así. Lo mismo ocurre con las tablas o columnas ausentes. Si tiene la opción, ya sea que sea su propio error o que el mensaje de error sea incorrecto, siga siempre el primero. Una vez más, suena condescendiente, pero cientos de preguntas en este mismo sitio demuestran que este consejo es extremadamente útil.

Una lista de cosas que nunca debe hacer con respecto a los informes de errores

  • ¡Nunca use un operador de supresión de errores ( @)! Hace que un programador no pueda leer el mensaje de error y, por lo tanto, no pueda corregir el error.
  • No utilice die()ni echoninguna otra función para imprimir el mensaje de error en la pantalla de forma incondicional. PHP puede informar errores por sí mismo y hacerlo de la manera correcta depende del entorno, así que déjelo para PHP.
  • No agregue una condición para probar el resultado de la consulta manualmente (como if($result)). Con las excepciones de error habilitadas, tal condición será inútil.
  • No utilice el try..catchoperador para repetir el mensaje de error. Este operador debe usarse para realizar algún manejo de errores, como una reversión de transacciones. Pero nunca lo use solo para informar errores; como aprendimos anteriormente, PHP ya puede hacerlo, de la manera correcta.

PD:
A veces no hay error, pero tampoco resultados. Entonces significa que no hay datos en la base de datos que coincidan con sus criterios . En este caso, debe admitir este hecho, incluso si puede jurar que los datos y los criterios son correctos. Ellos no son. Tienes que volver a comprobarlos. Tengo un artículo que puede ayudar en este asunto, Cómo depurar interacciones de bases de datos . Aunque está escrito para PDO, el principio es el mismo. Simplemente siga estas instrucciones paso a paso y resuelva su problema o tenga una pregunta que pueda responder para Stack Overflow.


@AdamWinter usando @ siempre es incorrecto, y en este caso particular es diez veces mayor. Los mensajes de error en su programa son lo mismo que un dolor en su cuerpo. Te dice que algo anda mal, como que tu pierna está rota. Y tienes que arreglar la pierna, no solo tomar un analgésico y seguir. IGUAL QUE AQUÍ. PHP le dice que no hay ninguna variable que espere. Así que tienes que arreglar el formulario o lo que sea, para que esta variable esté disponible. No solo escriba un código para evitar un error.
Tu sentido común
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.