web-dev-qa-db-fra.com

mysqli ou mourir, faut-il mourir?

Si j'utilise un peu de code comme ceci: 

$update_result = mysqli_query( $link , $sql_update_login ) or die ('Unable to execute query. '. mysqli_error($link));

Doit-il mourir ou pouvez-vous poser une autre requête par la suite? Comme une fonction prédéterminée qui écrit un journal de l'erreur dans une autre table? Tel que:

$update_result = mysqli_query( $link , $sql_update_login ) or function('$query, $error);

Quelles sont les autres options après 'ou'? Je ne l'ai pas trouvé dans la documentation, tout indice est apprécié.

15
Maelish

Doit-il mourir

Bien au contraire, il ne devrait pas die() jamais.
PHP est un langage de mauvaise hérédité. Très mauvaise hérédité. Et or die() avec le message d'erreur étant l'un des pires éléments:

  • die émet un message d'erreur, révélant des éléments internes du système à un attaquant potentiel
  • il confond des utilisateurs innocents avec des messages étranges et ne leur laisse aucune interface sur laquelle travailler; ils risqueraient donc tout simplement de décrocher.
  • il tue le script au milieu, ce qui peut provoquer une conception déchirée (ou aucune conception du tout) affichée (c'est-à-dire un rendu incomplet de la page demandée par l'utilisateur)
  • tuer le script irrécupérablement. Alors que l'exception peut être capturée et gérée avec élégance
  • die() ne vous donne aucune indication sur le lieu où une erreur s'est produite. Et dans une application relativement grosse, ce sera assez pénible à trouver.

Donc, n'utilisez jamais die() avec les erreurs mysql, même pour le débogage temporaire: il y a de meilleures façons. 

Pour votre requête, vous n'avez que 2 choix:

  • si vous allez utiliser mysqli_query() jusqu'au bout dans votre code d'application (ce qui est faux mais sur StackOverflow, on ne vous apprendra jamais autrement), vous pouvez utiliser trigger_error() au lieu de die. Il générera une erreur conventionnelle PHP et sera automatiquement enregistré, en fonction des paramètres de PHP.

    $result = mysqli_query($link , $sql) or trigger_error($link->error."[ $sql]");
    
  • si vous allez utiliser mysqli_query() dans le cadre de la bibliothèque d'abstraction, vous devez lancer une nouvelle exception, car vous aurez besoin d'une trace de pile (toujours fournie avec exception) pour avoir une idée de l'emplacement de cette erreur. 

Cependant, vous ne pouvez pas utiliser new Exception avec l'opérateur OR. Alors, le code devient un peu plus long:

$result = mysqli_query($link , $sql);
if (!$result) {
    throw new Exception(mysqli_error($link)."[ $sql]");
}

Ce qui n'est pas un gros problème car vous devrez l'écrire une seule fois.

Update. Comme il s'est avéré, mysqli est capable de générer des exceptions lui-même , ce qui peut nous éviter d'écrire le code de traitement manuellement: 

$result = mysqli_query($link, $sql);

Ce code lève une exception en cas d'erreur et vous serez donc toujours informé sans code supplémentaire. Cependant, dans les exemples précédents, une requête SQL a été ajoutée au message d'erreur, ce qui peut être très utile. Vous pouvez donc vous en tenir aux méthodes susmentionnées.

Une note importante

une fonction prédéterminée qui écrit un journal de l'erreur dans une autre table?

C'est apparemment une mauvaise idée. Surtout si vous voulez écrire un message d'erreur sur le même support qui a échoué lors de la tentative précédente.
Les erreurs doivent être consignées dans le média le plus robuste - un journal en texte brut. Il suffit donc de configurer votre PHP pour écrire des journaux d’erreur et les vérifier régulièrement.

55
Your Common Sense

or est juste un opérateur (très similaire à ||).

La syntaxe or die() fonctionne car or court-circuite, ce qui signifie que si la première instruction est vraie, True or X sera toujours vrai, donc X n'est pas évalué et votre script n'est pas die.

5
Blender

Oui, vous pouvez fournir une fonction différente après le (ou) . J'ai testé les éléments suivants:

mysqli_query($sel_db,'what!') or some_func(mysqli_error($sel_db));

function some_func($str) {
    die("ERROR: ".$str);
}
1
kalaero

Il n'est pas nécessaire que ce soit spécifiquement die(), mais cela doit empêcher le script de s'interrompre en appelant exit() ou die(), ou de déclencher une exception. Sinon, le script continuera avec la valeur de retour de cette fonction (qui est probablement nulle ou une sorte de courrier indésirable) dans $update_result, ce qui causera presque certainement des problèmes.

0
duskwuff