MySQLI_STMT :: $ ERRAGE_LIST ist ein äußerst wichtiges Debugging -Tool, wenn er vorbereitete Anweisungen mithilfe der MySQLI -Erweiterung von PHP ausführt. Es bietet einem Array mit allen Fehlermeldungen, anstatt nur den letzten Fehler wie $ stmt-> Fehler zurückzugeben. Diese Eigenschaft ist besonders kritisch, wenn während einer Ausführung oder Vorbereitung mehrere Fehler gleichzeitig ausgelöst werden.
Wenn Entwickler jedoch mehrere Fehler ausgesetzt sind, die von $ stmt-> error_list zurückgegeben werden, sind sie häufig verwirrt: Wie sollten diese Fehlerinformationen effektiv extrahiert, verarbeitet und angezeigt werden, um das Problem genau zu lokalisieren, ohne die Fehlerbehandlungslogik zu verwirren?
In diesem Artikel werden die Strategien der multiplen Fehlerbehandlung aus den folgenden Aspekten erörtert:
$ stmt-> error_list gibt ein Array zurück. Jedes Element ist ein assoziatives Array, das die folgenden Schlüssel enthält:
Errno : Fehlercode (Ganzzahl)
SQLState : SQLState Fehlerkennung (String)
Fehler : Fehlermeldung (String)
Eine typische Struktur ist wie folgt:
<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>
Dies bedeutet, dass Sie jeden Fehler separat beurteilen und umgehen müssen, anstatt davon auszugehen, dass nur ein Fehler vorhanden ist.
Um eine wiederholte Verarbeitungslogik bei jeder SQL -Ausführung zu vermeiden, wird empfohlen, beispielsweise die Fehlerbehandlung in eine Funktion einzubeziehen:
<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>
Auf diese Weise können Sie einfach jedes Mal anrufen , wenn execute () oder vorbereiten () fehlschlägt:
<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>
Nicht alle Fehler sind gleich wichtig. Es wird empfohlen, nach Errno zu klassifizieren, wie z. B.:
Logische Fehler (z. B. leere Daten, eindeutiger Schlüsselkonflikt) : Sie können Feedback für den Benutzer sein oder als Geschäftsausnahme aufgezeichnet werden.
Syntaxfehler oder Datenbankfehler (z. B. SQL -Rechtschreibfehler, fehlende Verbindungen) : Die Anforderung sollte sofort aufgerufen oder abgebrochen werden.
Sie können eine einfache Zuordnungstabelle verwenden, um den Schweregrad zu bestimmen:
<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">"Schwerwiegender Datenbankfehler: <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">"Normaler Fehler: <span class="hljs-subst">{$error['error']}</span></span></span><span>");
}
}
</span></span>
Eine Sache, die Entwickler leicht zu ignorieren sind, ist, dass das Versagen von Prepet () auch mehrere Fehler erzeugen kann. Es kann nicht nach dem Rückgabewert von Falsch beurteilt werden. Es muss auch ERROR_LIST aufrufen:
<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>
Während der Entwicklungsphase wird empfohlen, Fehlerprotokolle für die Browser- oder Entwicklungskonsole auszugeben. In einer Produktionsumgebung sollten nur Protokolle ohne Anzeige aufgezeichnet werden:
<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 :: $ ERRAGE_LIST ist ein zurückhaltendes, aber leistungsstarkes Tool zur Fehlerbehebung. Wenn Sie komplexe SQL -Operationen ausführen, eine große Anzahl von Parametern binden oder mehrere Datentabellen verbinden, gibt es häufig mehr als einen Fehler. Das korrekte Parsen und Klassifizieren dieser Fehler hilft nicht nur, Fehler schnell zu beheben, sondern auch die Robustheit des Systems zu verbessern.
Hör auf, $ stmt-> fehler - Master error_list vollständig zu betrachten. Sie werden feststellen, dass das Debugging SQL die Effizienz um mehr als ein Level verbessern kann.
Verwandte Tags:
mysqli_stmt