Mysqli_stmt :: $ error_list est un outil de débogage extrêmement important lors de l'exécution des instructions préparées à l'aide de l'extension MySQLI de PHP. Il fournit un tableau avec tous les messages d'erreur au lieu de renvoyer simplement la dernière erreur comme $ stmt-> erreur . Cette propriété est particulièrement critique lorsque plusieurs erreurs sont déclenchées en même temps lors d'une exécution ou d'une préparation.
Cependant, lorsque les développeurs sont confrontés à plusieurs erreurs renvoyées par $ stmt-> error_list , ils sont souvent confus: comment ces informations d'erreur doivent-elles être extraites, traitées et affichées afin de localiser avec précision le problème sans confondre la logique de gestion des erreurs?
Cet article discutera des stratégies de la gestion des erreurs multiples des aspects suivants:
$ stmt-> error_list renvoie un tableau, chaque élément est un tableau associatif, contenant les clés suivantes:
errno : code d'erreur (entier)
SQLSTATE : SQLState Error Identifier (String)
Erreur : message d'erreur (chaîne)
Une structure typique est la suivante:
<span><span>[
[
</span><span><span class="hljs-string">'errno'</span></span><span> => </span><span><span class="hljs-number">1064</span></span><span>,
</span><span><span class="hljs-string">'sqlstate'</span></span><span> => </span><span><span class="hljs-string">'42000'</span></span><span>,
</span><span><span class="hljs-string">'error'</span></span><span> => </span><span><span class="hljs-string">'You have an error in your SQL syntax; check the manual...'</span></span><span>
],
[
</span><span><span class="hljs-string">'errno'</span></span><span> => </span><span><span class="hljs-number">1048</span></span><span>,
</span><span><span class="hljs-string">'sqlstate'</span></span><span> => </span><span><span class="hljs-string">'23000'</span></span><span>,
</span><span><span class="hljs-string">'error'</span></span><span> => </span><span><span class="hljs-string">'Column \'name\' cannot be null'</span></span><span>
]
]
</span></span>
Cela signifie que vous devez juger et gérer chaque erreur séparément, plutôt que de supposer qu'il n'y a qu'une seule erreur.
Pour éviter la logique de traitement répétée à chaque exécution SQL, il est recommandé d'encapsuler la gestion des erreurs dans une fonction, par exemple:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">handle_stmt_errors</span></span><span>(</span><span><span class="hljs-params">mysqli_stmt <span class="hljs-variable">$stmt</span></span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"[SQL Error] Code: <span class="hljs-subst">{$error['errno']}</span></span></span><span> | SQLSTATE: </span><span><span class="hljs-subst">{$error['sqlstate']}</span></span><span> | Message: </span><span><span class="hljs-subst">{$error['error']}</span></span><span>");
}
}
</span></span>
De cette façon, vous pouvez simplement appeler à chaque fois que l'exécution () ou préparer () échoue:
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>()) {
</span><span><span class="hljs-title function_ invoke__">handle_stmt_errors</span></span><span>(</span><span><span class="hljs-variable">$stmt</span></span><span>);
}
</span></span>
Toutes les erreurs ne sont pas tout aussi importantes. Il est recommandé de classer selon Errno , comme:
Erreurs logiques (telles que les données vides, le conflit clé unique) : peut être une rétroaction à l'utilisateur ou enregistré comme exception commerciale.
Erreurs de syntaxe ou défaillances de la base de données (telles que les erreurs d'orthographe SQL, les connexions manquantes) : la demande doit être appelée immédiatement ou abandonnée.
Vous pouvez utiliser une table de mappage simple pour déterminer la gravité:
<span><span><span class="hljs-variable">$criticalErrors</span></span><span> = [</span><span><span class="hljs-number">1064</span></span><span>, </span><span><span class="hljs-number">2006</span></span><span>, </span><span><span class="hljs-number">2013</span></span><span>];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$error</span></span><span>[</span><span><span class="hljs-string">'errno'</span></span><span>], </span><span><span class="hljs-variable">$criticalErrors</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">trigger_error</span></span><span>(</span><span><span class="hljs-string">"Erreur de base de données sérieuse: <span class="hljs-subst">{$error['error']}</span></span></span><span>", E_USER_ERROR);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Erreur normale: <span class="hljs-subst">{$error['error']}</span></span></span><span>");
}
}
</span></span>
Une chose que les développeurs sont faciles à ignorer, c'est que l'échec de Préparer () peut également générer plusieurs erreurs. Il ne peut pas être jugé par la valeur de retour de False. Il doit également appeler Error_List :
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$stmt</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Prepare Error: <span class="hljs-subst">{$error['error']}</span></span></span><span>");
}
}
</span></span>
Pendant la phase de développement, il est recommandé de produire des journaux d'erreur au navigateur ou à la console de développement, tandis que dans un environnement de production, seuls les journaux doivent être enregistrés sans afficher:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">log_stmt_errors</span></span><span>(</span><span><span class="hljs-params">mysqli_stmt <span class="hljs-variable">$stmt</span></span></span><span>, </span><span><span class="hljs-variable">$display</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>->error_list </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$error</span></span><span>) {
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"[Error <span class="hljs-subst">{$error['errno']}</span></span></span><span>] </span><span><span class="hljs-subst">{$error['error']}</span></span><span> (SQLSTATE: </span><span><span class="hljs-subst">{$error['sqlstate']}</span></span><span>)";
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$display</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<div class=\"sql-error\"><span class="hljs-subst">$message</span></span></span><span></div>";
}
}
}
</span></span>
mysqli_stmt :: $ error_list est un outil de dépannage d'erreur discret mais puissant. Lorsque vous effectuez des opérations SQL complexes, liant un grand nombre de paramètres ou connectant plusieurs tables de données, il y a souvent plus d'une erreur. Analyser correctement et classer ces erreurs aidera non seulement à corriger rapidement les bogues, mais aussi à améliorer la robustesse du système.
Arrêtez de regarder $ stmt-> Erreur - Master Error_List complètement, vous constaterez que le débogage SQL peut améliorer l'efficacité de plus d'un niveau.
Étiquettes associées:
mysqli_stmt