Convertir errores de consulta en excepciones en MySQLi [duplicado]
Estoy intentando convertir los errores de consulta de MySQLi en excepciones, pero no pude: mysqli_sql_exception se genera solo si no se pudo conectar la base de datos.
Utilicé mysqli_report(MYSQLI_REPORT_STRICT)
funciones procedimentales de MySQLi integradas en una clase contenedora personalizada.
Código anterior:
public function mysqlQuery($SQL) {
$this->Result = mysqli_query($this->DBlink, $SQL);
if($this->Result === false)
throw new MySQLiQueryException($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink));
return $this->Result;
}
Pregunta: ¿Es normal que no se emitan advertencias ni excepciones cuando la consulta falla, por lo que tengo que verificar si mysqli_query() devolvió falso?
Hace algún tiempo logré solucionar este asunto. Como se señaló en la otra respuesta ,
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
es una forma correcta de decirle a mysqli que lance excepciones.
Solo asegúrese de no incluir todas las consultas en un try-catch . Esta es una idea errónea muy común de que tan pronto como comienzas a usar excepciones debes comenzar a lanzar intentos y capturas a izquierda y derecha. Por el contrario, try-catch debe utilizarse con cautela. Si bien el 99% de sus errores no deben manejarse in situ, sino mediante un controlador de errores en todo el sitio. Puede leer más sobre el tema en mi artículo sobre informes de errores de PHP.
¿Tengo que comprobar si mysqli_query() devolvió falso?
No.
Debería poder hacer lo que necesita e indicarle al controlador mysqli que genere excepciones en errores de SQL, pero deberá habilitarlo MYSQLI_REPORT_ERROR
si aún no lo está...
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
mysqli_query()
Ahora debería generar excepciones en caso de error. No es necesario verificar el valor de retorno en busca de fallas (lo cual no sucederá de todos modos porque se genera una excepción).
public function mysqlQuery($SQL) {
try {
$this->Result = mysqli_query($this->DBlink, $SQL);
} catch (mysqli_sql_exception $e) {
throw new MySQLiQueryException($SQL, $e->getMessage(), $e->getCode());
}
return $this->Result;
}
(NB: cambié $this->SQL
a $SQL
en la excepción reiniciada).
Sé que es un poco tarde, pero por el bien de la posteridad. Considero que MYSQLI_REPORT_STRICT es demasiado restrictivo, ciertas excepciones no se generan y, por lo tanto, no pueden ser manejadas por el bloque catch.
mysqli_report(MYSQLI_REPORT_ALL); // Traps all mysqli error
try {
$mysqli = new mysqli('localhost','user,'pwd','db');
/* I don't need to explicitly throw an exception as this is being
done automatically */
} catch(Exception $e) {
echo $e->getMessage();
}