Bei der Verwendung von PHP -Erweiterung von PHP für die Datenbankprogrammierung stoßen Entwickler manchmal auf eine verwirrende Situation: MySQLI :: STMT_INIT () initialisiert erfolgreich das Anweisungsobjekt, fehlschlägt jedoch in der nachfolgenden Prepet () -Methode. Diese Situation scheint unlogisch zu sein, aber tatsächlich beinhaltet sie mehrere Gründe. Dieser Artikel wird ausführlich die gemeinsamen Ursachen und Lösungen für dieses Problem analysieren.
MySQLI :: STMT_INIT () wird verwendet, um ein leeres MySQLI_STMT -Objekt zu erstellen. Es führt keine Interaktion mit der Datenbank durch, bereitet sich jedoch nur auf nachfolgende SQL -Operationen vor. Die Methode Prepe () sendet SQL -Anweisungen zur Vorkompilierung an den Datenbankserver. Wenn die Syntax falsch ist oder die Datenbankkonfiguration falsch ist, gibt Preped () false zurück.
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->stmt_init(); // Initialisierung erfolgreich
if ($stmt->prepare("SELECT * FROM users WHERE id = ?")) {
echo "Prepare Erfolg";
} else {
echo "Prepare scheitern: " . $stmt->error;
}
Dies ist einer der häufigsten Gründe. Obwohl STMT_INIT () erfolgreich ist, verweigert MySQL, wenn ein Syntaxfehler in der SQL in Preped () bestanden hat, die Vorkompilierung ab, was zu einem Misserfolg von Prepet () führt.
Beispielfehler SQL:
SELECT FROM users WHERE id = ?
Der richtige Weg, es zu schreiben, sollte sein:
SELECT * FROM users WHERE id = ?
Die vorbereitete Erklärung von MySQL unterstützt nicht alle Arten von SQL -Anweisungen. Erstellen Sie beispielsweise Tabellen- , Drop- , Alter- und andere Anweisungen nicht vor Prepe () . Wenn Sie dies tun, wird Prepe () auch einen Fehler zurückgeben.
Wenn auf eine in SQL nicht vorhandene Tabelle oder ein Feld vorhanden ist, ist jedoch kein Syntaxfehler, aber der Server kann auch die Kompilierung ablehnen, wodurch Vorbereitung () einen Fehler meldet.
$stmt->prepare("SELECT age FROM userz WHERE id = ?"); // Falscher Tabellenname 'userz'
Wenn die Verbindung getrennt oder ungültig wurde, wenn das MySQLI -Objekt aufgerufen wird, obwohl stmt_init () möglicherweise nicht sofort fehlerhaft ist, fehlschlägt sich vor () , sobald sie versucht, mit dem Server zu interagieren.
Datenbankbenutzer haben möglicherweise keine ausgewählten Berechtigungen für bestimmte Tabellen, was dazu führt, dass Vorverarbeitungsanweisungen nicht auf die Zieldatentabelle zugreifen und so bei der Vorbereitung fehlschlagen () .
Wenn der Tabellenname, der Spaltenname usw. MySQL -reservierte Wörter verwenden, aber nicht in Backticks ( ` ) verpackt sind, kann er auch als Syntaxfehler bei Prepet () erkannt werden.
$stmt->prepare("SELECT select FROM users WHERE id = ?"); // Fehlerbeispiel,'select' Es ist reserviert
Wechsel zu:
$stmt->prepare("SELECT `select` FROM users WHERE id = ?");
Druckenfehlermeldung Die Verwendung von $ stmt-> fehler oder $ mysqli-> Fehler zum Anzeigen spezifischer Fehlerinformationen ist der erste Schritt zur Fehlerbehebung.
Fehlerbericht einschalten
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Protokollierung Fehlgeschlagene SQL und Fehler können an einer Protokolldatei für eine einfache Entwicklung und Testphasenanalyse protokolliert werden.
Angenommen, wir haben den folgenden Link besucht, um Formulardaten einzureichen:
https://m66.net/form/submit.php
Die Formularverarbeitungslogik lautet wie folgt:
$mysqli = new mysqli("localhost", "user", "pass", "db");
$mysqli->set_charset("utf8mb4");
$stmt = $mysqli->stmt_init();
if (!$stmt->prepare("INSERT INTO user_data (name, email) VALUES (?, ?)")) {
error_log("Prepare scheitern: " . $stmt->error); // Aufzeichnungsfehler
die("Das System ist vorübergehend nicht verfügbar");
}
$stmt->bind_param("ss", $_POST['name'], $_POST['email']);
$stmt->execute();
Wenn die Tabelle user_data nicht vorhanden ist oder der Feldname falsch geschrieben ist, verursacht Preped () einen Fehler, obwohl stmt_init () erfolgreich ist.
MySQLI :: STMT_INIT () ist nur ein Konstruktor von Aussageobjekten, und sein Erfolg bedeutet nicht, dass SQL selbst legal oder ausführbar ist. Reale Syntax- und Logiküberprüfungen treten während der Prepe () -Phase auf. Das Verständnis dies in Kombination mit Fehlermeldungen und guten Debugging -Gewohnheiten kann eine schnellere Lage und die Lösung von Problemen ermöglichen.
Wenn Sie während des Debuggens weiterhin auf auf auf unlösbare Probleme stoßen, können Sie versuchen, SQL an den Datenbank -Client (z. B. PhpMyAdmin oder die Befehlszeile) zu bringen, um sie separat zu testen oder einen Administrator mit Datenbankberechtigungen zu kontaktieren, um Unterstützung zu erhalten.