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.
php
mysqli
prepared-statement
environment
error-reporting
siopaoman
fuente
fuente
$mysqli
variable?SELECT
consulta. ¿Revisaste eso?Respuestas:
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:
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_reporting
debe establecerse enE_ALL
valor;log_errors
debe establecerse en 1 (también es conveniente tener registros en una PC de desarrollo)display_errors
debe establecerse en 1En un servidor de producción
error_reporting
debe establecerse enE_ALL
valor;log_errors
debe establecerse en 1display_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: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.
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
@
)! Hace que un programador no pueda leer el mensaje de error y, por lo tanto, no pueda corregir el error.die()
niecho
ninguna 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.if($result)
). Con las excepciones de error habilitadas, tal condición será inútil.try..catch
operador 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.
fuente