php - try - ¿Cómo hacer que mysqli genere excepciones usando MYSQLI_REPORT_STRICT?
tipos de excepciones en php (2)
Hay una función en mysqli, llamada mysqli_report()
, que parece una contraparte para el método setAttribute()
PDO con sus constantes ERRMODE_*
. El manual dice :
MYSQLI_REPORT_STRICT
Throw mysqli_sql_exception for errors instead of warnings
Por lo tanto, teniendo en cuenta PDO::ERRMODE_EXCEPTION
, probé este código
mysqli_report(MYSQLI_REPORT_STRICT);
$mysqli->query("foo");
pero, para mi decepción, no produjo ninguna excepción ni advertencia en absoluto.
Entonces, aquí va la pregunta: ¿hay alguna manera de decirle a mysqli que MYSQLI_REPORT_ALL
excepciones sin usar MYSQLI_REPORT_ALL
?
Eso no es un error, esa es una característica. ;)
PHP no informa los errores de mysqli o PDO de forma predeterminada porque esa información es muy sensible, mostrarla a un usuario es una excelente manera de aprender cómo inyectar datos maliciosos.
MYSQLI_REPORT_ERROR le dice que active los errores y MYSQLI_REPORT_STRICT le dice que convierta esos errores en Excepciones. Esto le dará un informe completo del mensaje de error, así que nunca lo haga en entornos de producción.
Usando el símbolo Pipe | le permite establecer constantes múltiples en la mayoría de los métodos y funciones de PHP. PDO, mysqli, filter_var, etc. todos usan el conducto para establecer múltiples argumentos opcionales del mismo tipo, o una "disyunción de banderas en modo bit" para usar el término sofisticado para él. El argumento de la matriz de la persona perezosa.
Después de algunas investigaciones, finalmente aprendí que el parámetro de la función es una máscara de bits, y uno tiene que combinar varios valores para obtener el resultado deseado. La combinación final no es demasiado lógica, pero funciona según lo previsto, lanzando una excepción en un error de consulta mientras se ignoran las advertencias.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
producirá el resultado deseado:
Error fatal: excepción no detectada ''mysqli_sql_exception'' con el mensaje ''Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ''foo'' en la línea 1 ''