¿Qué hacer con los problemas de mysqli? Errores como mysqli_fetch_array(): el argumento #1 debe ser del tipo mysqli_result y tal

10 minutos de lectura

avatar de usuario
siopaoman

En mi entorno local/de desarrollo, la consulta de MySQLi funciona bien. 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, traté de ejecutar la consulta a través del panel de control phpMyAdmin y el resultado está bien.

  • Podría ser que su usuario de MySQL carezca de los privilegios para hacer una SELECT consulta. ¿Comprobaste eso?

    – Amal Murali

    26/03/2014 a las 13:30

avatar de usuario
Tu sentido común

TL;DR

  1. Siempre tengo mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); en su código de conexión mysqli y siempre verifique los errores de PHP.
  2. Siempre reemplace cada variable de PHP en la consulta SQL con un signo de interrogación y ejecute la consulta usando 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..., Call to a member function bind_param()... o similar. O incluso sin ningún error, pero la consulta no funciona de todos modos. Significa que su consulta no se pudo ejecutar.

Cada vez que una consulta falla, MySQL tiene un mensaje de error que explica el motivo. En las versiones anteriores de PHP, estos errores no se transfirieron 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 de los errores de MySQL. Y una vez que reciba el mensaje de error, arreglarlo será pan comido.

Cómo obtener el mensaje de error en MySQLi

En primer lugar, siempre tenga esta línea antes de que MySQLi se conecte todos tus 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. 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 lo hará consciente instantáneamente de la causa del error. Y el seguimiento de la pila lo llevará al lugar exacto donde ocurrió el error.

Cómo obtener el mensaje de error de PHP

Aquí hay una esencia de mi artículo sobre Informe de errores de PHP: La notificación de errores en un servidor de desarrollo y en vivo debe ser diferente. En el servidor de desarrollo, es conveniente que los errores se muestren en la 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 adelante.

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

  • En un servidor de desarrollo

  • error_reporting debe establecerse en E_ALL valor;

  • 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_reporting debe establecerse en E_ALL valor;

  • log_errors debe establecerse en 1

  • display_errors debe establecerse en 0

Después de eso, cuando falla la consulta de MySQL, obtendrá un error de PHP que explica el motivo. En un servidor en vivo, para obtener el mensaje de error, deberá verificar el registro de errores.

Cómo usarlo realmente

Simplemente elimine cualquier código que verifique el error manualmentetodos aquellos or die(), if ($result), try..catch y tal. Simplemente escriba su código de interacción con la base de datos de inmediato:

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

Otra vez, sin ninguna condición alrededor. Si ocurre un error, será tratado 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 el 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 leer sobre esto en el artículo vinculado anteriormente).

Qué hacer con el mensaje de error que recibe

En primer lugar, debe ubicar 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 las rastro de 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, debe verificar 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 lugar del problema es correcto antes de la parte de consulta citada en el mensaje de error.

Si no entiende el mensaje de error, intente buscarlo en Google. Y cuando explore los resultados, apéguese a las respuestas que explique 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 tienes que confianza el mensaje de error Si dice que la cantidad de tokens no coincide con la cantidad de variables vinculadas, entonces es asi que. Lo mismo ocurre con las tablas o columnas ausentes. Dada la elección, ya sea que se trate de un error propio o que el mensaje de error sea incorrecto, apéguese siempre a lo 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 la notificación de errores

  • Nunca utilice 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() o echo o cualquier otra función para imprimir el mensaje de error en la pantalla incondicionalmente. PHP puede informar errores por sí mismo y hacerlo de la manera correcta dependiendo 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 use el try..catch operador para hacer eco del mensaje de error. Este operador debe usarse para realizar algún manejo de errores, como una reversión de transacción. 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, 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 revisarlos de nuevo.

Tengo un artículo que puede ayudar en este asunto, Cómo depurar las interacciones de la base de datos. Aunque está escrito para DOP, el principio es el mismo. Simplemente siga esas instrucciones paso a paso y resuelva su problema o tenga una pregunta respondible para Stack Overflow.

  • @AdamWinter usando @ siempre está mal, y en este caso particular es diez veces mayor. Los mensajes de error para su programa son lo mismo que un dolor para su cuerpo. Te dice que algo anda mal, como si tu pierna estuviera rota. Y hay que arreglar la pierna no solo tomar un analgésico y seguir. AQUÍ IGUAL. PHP le dice que no hay ninguna variable que espera. Por lo tanto, debe corregir el formulario o lo que sea, para que esta variable esté disponible. No basta con escribir un código para evitar un error.

    – Tu sentido común

    25 mayo 2020 a las 22:10

  • En su mayor parte, estoy de acuerdo, sin embargo, ‘Tu sentido común’ no estoy de acuerdo con “No solo escribir código para evitar un error”. de manera descontrolada, algunos errores que no puede corregir en el código del servidor EG DB han desaparecido, solo tiene que administrar el error y eludirlo para producir un resultado válido.

    – Barkermn01

    9 de septiembre de 2020 a las 14:44

  • @ Barkermn01 esa es una preocupación suya adecuada, pero está sacando conclusiones equivocadas de ella. Por supuesto, su aplicación debería producir un resultado válido (que, en caso de un error “Mysql ha desaparecido”, debería ser una página de error genérica 500). Pero tienes que entender que un resultado tan válido no es una preocupación de su código de base de datos. Su código relacionado con la base de datos debería funcionar con una base de datos. Mientras que mostrar la página de error debería ser una preocupación de un código diferente. Mira aquí: phpdelusions.net/articles/error_reporting

    – Tu sentido común

    9 sep 2020 a las 14:50


  • Entiendo que eran solo cosas como ‘Pero nunca lo use solo para informar errores’, de alguna manera excluye bases de código completamente objetivas, EG mi MVC si mis modelos encuentran un error, necesitan manejar el error y luego volver a lanzarlo para que mi controlador donde se envuelve el uso del modelo puede tratar el error y presentar el error, en este caso, estoy usando una API, por lo que el error y toda la información de rastreo se envían a la llamada API si provienen de nuestro sistema remoto (Verificación de origen ) ya que muchas cosas web se dosifican ahora PHP backend REACT o Angular Front end

    – Barkermn01

    10 de septiembre de 2020 a las 1:10


  • “Excepción no detectada, a su vez, hace un error fatal de PHP” ¿Causar un error fatal es una buena idea en un servidor de PRODUCCIÓN (para errores de mysql)? ¿No hay algunas situaciones en las que el error indica un problema que su secuencia de comandos debe solucionar y continuar como pueda; por ejemplo, ¿informar al usuario que no puede darle esa información en este momento, mientras alerta a un operador para que investigue? EDITAR Ya veo, cuando sea necesario, intente … atrape los errores de mysql (que ha convertido en errores de php).

    – El fabricante de herramientas Steve

    10 de julio de 2021 a las 12:32


¿Ha sido útil esta solución?