/ / Cómo obtener información de errores de MySQLi en diferentes entornos: php, mysqli, declaración preparada, entorno, informe de errores

Cómo obtener información de errores de MySQLi en diferentes entornos: php, mysqli, declaración preparada, entorno, informe de errores

En mi entorno local / de desarrollo, la consulta de MySQLi está funcionando bien. Sin embargo, cuando lo subo a mi entorno de alojamiento web, recibo este error:

Error grave: llamar 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.

Respuestas

63 para la respuesta № 1

En primer lugar, siempre tenga esta línea antes de que MySQLi se conecte todas sus entornos:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Después de eso todos los errores de MySQL serán transferidos.en las excepciones de PHP. Una excepción no detectada, a su vez, comete un error fatal de PHP. Por lo tanto, en caso de un error de MySQL, obtendrás un error de PHP convencional. Eso instantáneamente te hará consciente de la causa del error. Un seguimiento de la pila te llevará al lugar exacto donde ocurrió el error.

Ten en cuenta que tienes que poder ver. Errores de PHP en general. Y de hecho aquí va la cuestión de los diferentes ambientes:

  • En un sitio en vivo, tiene que echar un vistazo a los registros de errores, por lo que la configuración debe ser

    error_reporting(E_ALL);
    ini_set("display_errors", 0);
    ini_set("log_errors", 1);
    
  • Mientras se encuentre en un servidor de desarrollo local, está bien cometer errores en la pantalla:

    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    

Y una pequeña lista de lo que tú. no debería:

  • Utilizar operador de supresión de errores (@)
  • Utilizar die() o echo o cualquier otra función para imprimir incondicionalmente el mensaje de error en la pantalla. PHP ya puede repetirlo todo, no se requiere asistencia.
  • Probando el resultado de la consulta manualmente (como if($result)) simplemente no tiene sentido. O su consulta falló y ya recibirá la excepción de error, o estuvo bien y no hay nada que probar.
  • Utilice try..catch para repetir el mensaje de error. Una vez más PHP puede hacerlo mejor, mucho mejor.