Warum schlägt diese PDO-Anweisung stillschweigend fehl?

Lesezeit: 4 Minuten

Warum schlagt diese PDO Anweisung stillschweigend fehl
Rifthy

Dies ist meine PHP-SQL-Anweisung, die während des Var-Dumps false zurückgibt

$sql = $dbh->prepare('INSERT INTO users(full_name, e_mail, username, password) VALUES (:fullname, :email, :username, :password)');
$result = $sql->execute(array(
                    ':fullname' => $_GET['fullname'], 
                    ':email' => $_GET['email'], 
                    ':username' => $_GET['username'],
                    ':password' => $password_hash));

Warum schlagt diese PDO Anweisung stillschweigend fehl
Ihr gesunder Menschenverstand

Manchmal erzeugt Ihr PDO-Code einen Fehler wie Call to a member function execute() oder ähnliches. Oder sogar ohne Fehler, aber die Abfrage funktioniert trotzdem nicht. Dies bedeutet, dass Ihre Abfrage nicht ausgeführt werden konnte.

Jedes Mal, wenn eine Abfrage fehlschlägt, gibt MySQL eine Fehlermeldung aus erklärt den Grund. Leider werden solche Fehler standardmäßig nicht an PHP übertragen, und Sie haben nur eine Stille oder eine oben erwähnte kryptische Fehlermeldung. Daher ist es sehr wichtig, PHP und PDO so zu konfigurieren, dass sie Ihnen MySQL-Fehler melden. Und sobald Sie die Fehlermeldung erhalten, ist es ein Kinderspiel, das Problem zu beheben.

Um detaillierte Informationen über das Problem zu erhalten, fügen Sie entweder die folgende Zeile direkt nach dem Verbinden in Ihren Code ein

$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

(wo $dbh ist der Name Ihrer PDO-Instanzvariable) oder – besser – fügen Sie diesen Parameter als ein hinzu Anschlussmöglichkeit. Danach werden alle Datenbankfehler in PDO-Ausnahmen übersetzt, die, wenn sie in Ruhe gelassen würden, sich wie normale PHP-Fehler verhalten würden.

Nachdem Sie die Fehlermeldung erhalten haben, müssen Sie sie lesen und verstehen. Es klingt zu offensichtlich, aber Lernende übersehen das oft Bedeutung der Fehlermeldung. Meistens erklärt es das Problem jedoch ziemlich einfach:

  • Sagen Sie, wenn es heißt, dass eine bestimmte Tabelle nicht existiert, müssen Sie Rechtschreibung, Tippfehler und Groß- und Kleinschreibung überprüfen. Außerdem müssen Sie sicherstellen, dass sich Ihr PHP-Skript mit einer korrekten Datenbank verbindet
  • Oder, wenn es sagt, dass es einen Fehler in der SQL-Syntax gibt, dann müssen Sie Ihr SQL untersuchen. Und die Problemstelle ist richtig Vor der in der Fehlermeldung genannte Abfrageteil.

Musst du auch Vertrauen die Fehlermeldung. Wenn es heißt, dass die Anzahl der Token nicht mit der Anzahl der gebundenen Variablen übereinstimmt, dann ist es so ist damit. Gleiches gilt für fehlende Tabellen oder Spalten. Vor die Wahl gestellt, ob es Ihr eigener Fehler ist oder die Fehlermeldung falsch ist, bleiben Sie immer bei ersterem. Auch hier klingt es herablassend, aber Hunderte von Fragen auf dieser Website beweisen, dass dieser Rat äußerst nützlich ist.


Beachten Sie, dass Sie, um PDO-Fehler sehen zu können, in der Lage sein müssen, PHP-Fehler im Allgemeinen zu sehen. Dazu müssen Sie PHP abhängig von der Site-Umgebung konfigurieren:

  • auf einen Entwicklung Server ist es sehr praktisch, Fehler direkt auf dem Bildschirm zu haben, für die die Anzeige von Fehlern eingeschaltet werden muss:

      error_reporting(E_ALL);
      ini_set('display_errors',1);
    
  • während auf a lebend Website, alle Fehler müssen sein protokolliert, aber nie angezeigt an den Client. Konfigurieren Sie dazu PHP folgendermaßen:

      error_reporting(E_ALL);
      ini_set('display_errors', 0);
      ini_set('log_errors', 1);
    

Beachten Sie, dass error_reporting sollte eingestellt werden E_ALL die ganze Zeit.

Beachten Sie auch, dass trotz der verbreiteten Täuschung, Für die Fehlerberichterstattung muss kein Try-Catch verwendet werden. PHP wird Ihnen bereits PDO-Fehler melden, und zwar in einer viel besseren Form. Eine nicht abgefangene Ausnahme ist sehr gut für die Entwicklung, aber wenn Sie eine angepasste Fehlerseite anzeigen möchten, verwenden Sie trotzdem nicht try catch dafür, sondern setzen Sie einfach a benutzerdefinierte Fehlerbehandlung. Kurz gesagt, Sie müssen PDO-Fehler nicht als etwas Besonderes behandeln, sondern als jeden anderen Fehler in Ihrem Code betrachten.

PS

Manchmal gibt es keinen Fehler, aber auch keine Ergebnisse. Dann heißt es, Es gibt keine Daten, die Ihren Kriterien entsprechen. Diese Tatsache muss man also zugeben, auch wenn man beschwören kann, dass die Daten und Kriterien in Ordnung sind. Sie sind nicht. Sie müssen sie noch einmal überprüfen. Ich habe eine kurze Antwort, die Ihnen helfen würde, das Übereinstimmungsproblem zu lokalisieren, da Sie Probleme mit übereinstimmenden Zeilen in der Datenbank mit PDO haben. Folgen Sie einfach dieser Anleitung und dem verlinkten Tutorial Schritt für Schritt und haben Sie entweder Ihr Problem gelöst oder eine beantwortbare Frage für Stack Overflow.

  • Wie beantwortet das die OP-Frage?

    – NaijaProgrammierer

    18. September 2015 um 9:25 Uhr

  • @NaijaProgrammer id nicht, aber es könnte ihn / sie dazu bringen, die Antwort basierend auf der von “Your Common Sense” vorgeschlagenen Fehlerberichterstattung zu finden.

    – DTH

    18. September 2015 um 10:16 Uhr

  • @Ihr gesunder Menschenverstand: ein neuer bei mir, dasselbe Problem. Ursache war die Einstellung der ATTR_EMULATE_PREPARES Option in den Optionen beim Erstellen des PDO-Objekts. Unterbrechungen in der Produktion (php 7.2.8), Arbeiten in dev (php 7.2.34) !!! Es ist die Einstellung der Option (nicht der Wert der eingestellten Option), die in einigen Fällen einen zufälligen Fehler verursacht hat.

    – YvesLeBorg

    22. Dezember 2020 um 14:10 Uhr


994260cookie-checkWarum schlägt diese PDO-Anweisung stillschweigend fehl?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy