Bei der Verwendung von PHP -Erweiterung von PHP für Datenbankvorgänge ist Preped () ein wichtiger Schritt, insbesondere in Szenarien, in denen Vorverarbeitungsanweisungen zur Verbesserung der Sicherheit und Leistung verwendet werden. Einige Entwickler werden jedoch auf ein verwirrendes Problem stoßen: SQL -Anweisungen werden vollständig korrekt geschrieben, melden jedoch beim Aufrufen von Preped () jedoch immer noch einen Fehler. Dieser Artikel kombiniert die MySQLI :: STMT_INIT -Funktion, um die gemeinsamen Ursachen und Fehlerbehebungsmethoden dieses Problems zu untersuchen.
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}
$stmt = $mysqli->stmt_init();
$sql = "SELECT * FROM users WHERE id = ?";
if (!$stmt->prepare($sql)) {
die("Die Vorverarbeitung schlug fehl: " . $stmt->error);
}
Auch wenn die SQL -Syntax korrekt ist, gibt die obige Prepet () manchmal False zurück und löst eine Fehlermeldung aus. Im Folgenden analysieren wir die möglichen Gründe nach Artikeln.
Obwohl SQL -Anweisungen syntaktisch korrekt sind, schlägt Prepe () in einigen MySQL -Versionen fehl, wenn eine Tabelle oder eine Spalte, die in der Datenbank nicht vorhanden ist, verwiesen wird. Zum Beispiel:
SELECT * FROM userz WHERE id = ?
Wenn die UserZ -Tabelle nicht vorhanden ist, meldet Preped () immer noch einen Fehler, selbst wenn die Syntax korrekt ist.
Lösung: Überprüfen Sie, ob der Tabellenname und der Feldname in SQL tatsächlich in der Datenbank vorhanden sind.
MySQL -Benutzer haben möglicherweise nicht die Berechtigungen, die für die Ausführung bestimmter Aussagen erforderlich sind, z. B. ausgewählt , einfügen usw. Obwohl die Syntax in Ordnung ist, werden die Vorbereitungen () die Vorbereitung () fehlschlagen.
Lösung: Stellen Sie sicher, dass der Datenbankbenutzer entsprechende Betriebsberechtigungen für die Zieltabelle verfügt.
Wenn sich die Erklärung auf eine Ansicht bezieht und die Logik in dieser Ansicht Probleme hat oder von Objekten mit begrenzten Berechtigungen abhängt, kann sie auch zu Vorbereitung () Fehlern führen.
Lösung: Überprüfen Sie die beteiligten Ansichten oder Auslöser, um sicherzustellen, dass ihre Logik und Berechtigungen korrekt sind.
Nach der Initialisierung des Anweisungsobjekts mit $ mysqli-> stmt_init () ist die Datenbankverbindung möglicherweise abgelaufen, versucht jedoch dennoch , Preped () auszuführen.
Lösung: Verwenden Sie $ mysqli-> ping (), um zu prüfen, ob die Verbindung immer noch gültig ist und bei Bedarf wieder angeschlossen wird.
MySQL Prepe () unterstützt keine Zeichenfolgen, die mehrere Aussagen enthalten, z. B.:
$sql = "SELECT * FROM users WHERE id = ?; DROP TABLE users;";
Obwohl Syntax in SQL zulässig ist, akzeptiert Preped () nur eine einzige Aussage.
Problemumgehung: Stellen Sie sicher, dass nur eine Anweisung in der SQL -Zeichenfolge enthalten ist.
Um dieses Problem zu debuggen, können Sie zusätzlich zum Anzeigen von $ STMT-> Fehler $ MySQLI-> Fehler oder den Ausnahmemodus für detailliertere Fehlerinformationen aktivieren:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Dies macht einen Fehler als Ausnahme und hilft beim Debuggen.
Vermeiden Sie hartcodierte Tabellen- und Spaltennamen und versuchen Sie, Konstanten oder Ormen zu verwenden.
Vermeiden Sie den direkten Aufbau von SQL -Zeichenfolgen auf der Grundlage externer Eingaben und verhindern Sie die Injektion und semantische Fehler.
Schalten Sie SQL -Protokolle in der Bereitstellungsumgebung ein, um Ausführungsdetails zu verfolgen.