In PHP ist die MySQLI- Erweiterung ein sehr häufiges Datenbankzugriffstool, das objektorientierte und prozessorientierte Schnittstellen bietet. Die MySQLI_STMT -Klasse wird verwendet, um SQL -Anweisungen vorzubereiten und auszuführen. Es gibt auch viele Eigenschaften für den Umgang mit Fehlern wie MySQLI_STMT :: $ ERROR .
Bei der Ausführung von Multi-Statements unterscheidet sich das Verhalten von MySQLI_STMT :: $ ERROR jedoch von dem einer einzelnen Anweisung. In diesem Artikel werden wir untersuchen, warum MySQLI_STMT :: $ ERROR in der Ausführung von Multi-Statements und wie mit diesen Einschränkungen umgegangen wird.
In MySQL werden Multi-Statements als Multi-Statements bezeichnet, die in einer einzelnen Abfrageanforderung ausgeführt werden. Bei Verwendung von MySQLI-Erweiterung können Sie Multi-Statements über die Funktion mySQLI_Multi_query () ausführen. Mit dieser Funktion können Sie mehrere SQL -Abfragen senden und einzeln in derselben Verbindung verarbeiten.
$query = "SELECT * FROM users; SELECT * FROM orders;";
if (mysqli_multi_query($connection, $query)) {
do {
// Verarbeiten Sie die Ergebnisse jeder Abfrage
if ($result = mysqli_store_result($connection)) {
while ($row = mysqli_fetch_assoc($result)) {
// Ausgabe von Abfragenergebnissen
}
mysqli_free_result($result);
}
} while (mysqli_next_result($connection));
}
Bei Verwendung der Eigenschaft von MySQLI_STMT :: $ IRREA wird die Fehlermeldung bei der Ausführung der Anweisung zurückgegeben. Diese Eigenschaft spiegelt normalerweise den Fehler der letzten Abfrage wider, wenn eine einzige Anweisung ausgeführt wird. Bei der Ausführung von Multi-Statements ist das Verhalten von MySQLI_STMT :: $ ERROR jedoch unterschiedlich.
Bei der Ausführung von Multi-Statements wird die Funktion mySQLI_Multi_query () mehrere Abfragen gleichzeitig verarbeiten, was bedeutet, dass die Fehlerinformationen der Abfrage nicht direkt in mysqli_stmt :: $ error , aber von mysqli_multi_query () oder mySQLI_NEXT_RESULT_RESSULT () verwaltet werden. Daher ist es unmöglich, die Fehlerinformationen aller Abfragen direkt über MySQLI_stmt :: $ error zu erhalten.
Dies liegt daran, dass Abfrage mit mehreren Statements keine einzige Abfrageoperation ist, sondern eine Kombination aus mehreren Abfragen. Wenn mehrere Aussagen ausgeführt werden, verarbeitet MySQL jede Abfrage nacheinander und kann sogar Fehler zwischen verschiedenen Abfragen auftreten. In diesem Fall kann MySQLI_STMT :: $ ERROR die Fehlermeldung für jede Abfrage nicht genau widerspiegeln.
Die spezifischen Gründe sind wie folgt:
Fehlerbehebung auf Anweisungsebene: Bei der Ausführung von Mehrfachbekenntnissen werden die Fehler in jeder SQL-Anweisung von MySQLi_Multi_query () und seinen zugehörigen Funktionen (wie MySQLi_Next_Result () ) erfasst und verarbeitet.
Fehlertrennung: Während des Ausführungsprozesses mit mehreren Statements wird das Ausführungsergebnis jeder Anweisung isoliert, sodass die Fehlermeldung vom Ausführungsstatus jeder Anweisung getrennt ist. Dies bedeutet, dass Sie nicht alle Anweisungsfehler mit einer einzelnen MySQLI_stmt :: $ -IRM -Eigenschaft aufnehmen können.
Transaktionskonsistenz: Wenn Sie Transaktionen (z. B. Starttransaktion und Commit ) verwenden, um mehrere Anweisungen auszuführen, und in einer der Abfragen ein Fehler auftritt, rollt die Transaktion automatisch zurück. Die Fehlererfassung wird jedoch weiterhin von MySQLi_Multi_query () und Transaktionsmechanismen verwaltet, nicht von mySQLI_STMT .
Obwohl MySQLI_STMT :: $ ERROR nicht direkt Fehlerinformationen in der Ausführung von mehreren Statements liefern kann, können Sie für jede Abfrage trotzdem Fehlerinformationen auf andere Weise erhalten. Eine übliche Praxis besteht darin, die Funktion mysqli_multi_query () zu verwenden, um MySQLi_Next_Result () und mySQLi_error () zu kombinieren.
Hier ist ein Beispiel:
$query = "SELECT * FROM users; SELECT * FROM non_existing_table;";
if (mysqli_multi_query($connection, $query)) {
do {
// Überprüfen Sie die Ergebnisse der aktuellen Abfrage
if ($result = mysqli_store_result($connection)) {
while ($row = mysqli_fetch_assoc($result)) {
// Prozessabfragenergebnisse
}
mysqli_free_result($result);
}
// Überprüfen Sie, ob in der aktuellen Abfrage Fehler vorliegt
if (mysqli_error($connection)) {
echo "Abfragefehler: " . mysqli_error($connection);
}
} while (mysqli_next_result($connection));
}
In diesem Beispiel erhalten wir nach Ausführung jeder Abfrage die Fehlerinformationen für jede Abfrage über MySQLI_Error ($ Connection) .
Zusammenfassend ist die Einschränkung der MySQLi_stmt :: $-Fehler in der Ausführung von Multi-Statements hauptsächlich darauf zurückzuführen, dass Abfrage mit mehreren Staaten eine Kombination mehrerer unabhängiger Abfragen ist, während mySQLI_STMT :: $ ERROR nur die Fehler der aktuellen Anweisung widerspiegeln kann. Bei der Ausführung mehrerer Aussagen müssen Sie Funktionen wie MySQLI_Multi_Query () , MySQLI_Next_Result () und MySQLI_Error () verwenden, um die Ergebnisse und Fehler der Abfrage nacheinander zu verarbeiten.
Wenn Sie angemessene Fehler in Multi-Statement-Abfragen abwickeln, können Sie die Ausführung jeder Abfrage genauer erfassen und damit die Robustheit des Programms verbessern und die Effizienz debuggen.