web-dev-qa-db-fra.com

Conversion des erreurs de requête en exceptions dans MySQLi

J'essaie de transformer les erreurs de requête MySQLi en Exceptions, mais je ne pourrais pas - mysqli_sql_exception n'est levé que si la connexion à la base de données a échoué.

J'ai utilisé mysqli_report(MYSQLI_REPORT_STRICT) et les fonctions procédurales MySQLi intégrées à la classe de wrapper personnalisée.

Ancien code:

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;

}

Question: Est-ce normal? Aucun avertissement ni aucune exception ne sont générés lorsque la requête échoue. Je dois donc vérifier si mysqli_query () a renvoyé la valeur false.

20
Roman Newaza

Il y a quelque temps, j'ai réussi à régler ce problème. Comme il a été souligné dans la autre réponse ,

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

est une façon correcte de dire à mysqli de lancer des exceptions.

Cependant, si vous enveloppez les fonctions de mysqli dans votre propre wrapper (comme tout le monde le devrait!) - cela ne fait pas trop de différence. De toute façon, vous devrez ajouter un code pour vérifier le succès - que ce soit if ou catch. Cependant, le nombre d'appels sera très limité, cela ne causera donc pas trop de problèmes.

Mais tous ces gens qui "passent" de mysql à mysqli en raison de tout cet engouement pour le mouvement (en laissant la même approche et en ayant mysqli fonctionnant dans tout le code), bénéficieront de ce paramètre de manière spectaculaire (s'ils ne suivent pas la habitude commune d’envelopper chaque appel de fonction dans try-catch, ce qui serait inutile).

22
Your Common Sense

dois-je vérifier si mysqli_query () a renvoyé la valeur false?

Non.

Vous devriez être capable de faire ce dont vous avez besoin et de charger le pilote mysqli de générer des exceptions sur les erreurs SQL, mais vous devrez activer MYSQLI_REPORT_ERROR s'il ne l'est pas déjà ....

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)

mysqli_query() devrait maintenant lancer des exceptions en cas d'erreur. Vous n'avez pas besoin de vérifier la valeur de retour pour échec (ce qui ne se produira de toute façon pas car une exception est levée).

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: j'ai changé $this->SQL en $SQL dans l'exception relancée.)

19
MrWhite

Je sais qu'il est un peu trop tard, mais pour des raisons de postérité. Je trouve que MYSQLI_REPORT_STRICT est trop restrictif. Certaines exceptions ne sont pas levées et ne peuvent donc pas être gérées par le bloc 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();
 }  
0
kodepet