Convertir errores de consulta en excepciones en MySQLi [duplicado]

Resuelto Roman Newaza asked hace 54 años • 3 respuestas

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?

Roman Newaza avatar Jan 01 '70 08:01 Roman Newaza
Aceptado

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.

Your Common Sense avatar Jan 29 '2013 08:01 Your Common Sense

¿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_ERRORsi 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->SQLa $SQLen la excepción reiniciada).

MrWhite avatar Jan 10 '2014 15:01 MrWhite

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();
 }  
st__gen_server avatar Mar 10 '2015 13:03 st__gen_server