Frage

BITTE DIE FRAGE AUFMERKSAM LESEN. Es ist nicht üblich albern „mein Code funktioniert nicht !!!“ Frage.

Wenn ich diesen Code ausführen mit beabsichtigten Fehler

try {
  $sth = $dbh->prepare("SELECT id FROM users WHERE name INN(?,?) ");
  $sth->execute(array("I'm","d'Artagnan"));
} catch (PDOException $e) {
    echo $e->getMessage();
}

ich diese Fehlermeldung

Sie haben einen Fehler in der SQL-Syntax ... in der Nähe von 'INN (' I \ 'm', 'd \' Artagnan ')' in Zeile 1

Aber ich dachte jahrelang, dass Abfrage und Daten an den Server separat gesendet werden und nie stören. So habe ich ein paar Fragen (obwohl ich jemand Zweifel eine Antwort bekam ...)

  1. Woher bekommt er eine so bekannte String-Darstellung - zitiert und entkam? Ist es vor allem gemacht wird, um einen Fehler zu melden, oder ist es ein Teil der tatsächlichen Abfrage?
  2. Wie funktioniert es in real? Gibt es einen Platzhalter mit Daten ersetzen oder nicht?
  3. Gibt es eine Möglichkeit ganze Abfrage zu bekommen, nicht nur wenig davon, für Debugging-Zwecke?

Aktualisieren

mysqli funktioniert es wie erwartet: ein Fehler wirft, sagt near 'INN(?,?)'

War es hilfreich?

Lösung

versuchen Sie,

$dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

;)

Andere Tipps

Ich bin nicht sicher über alle Details, aber ich werde auf Antwort versuchen.

  1. Das Zitat geschieht auf der Datenbankseite. Die Datenbank entkommt und saniert werden alle Werte (siehe Punkt 2) es empfängt, so dass sie richtig interpretiert wird. Sobald der Fehler ausgelöst wird, druckt die Datenbank (in diesem Fall MySQL), um die Abfrage versucht zu laufen. Dies wäre nicht so hilfreich sein, wenn es nur den vorbereiteten Teil zeigt.

  2. Nein, tut es nicht. Bei Vorbereitungszeit wird die Abfrage auf der Server-Seite zusammengestellt. Wenn eine Abfrage mit Werten ausgeführt wird, werden nur die Werte übertragen werden. Das ist so ziemlich das gleiche wie der Aufruf PREPARE und direkt auf die Datenbank EXECUTE auf.

  3. Dies ist abhängig von der Datenbank Sie verwenden. MySQL zum Beispiel können alle Abfragen in einer Protokolldatei log (my.cnf Einstellungen für das überprüfen). Sie können aber auch debugDumpParams () auf PHP Seite verwenden.

Ich hoffe, dass dies ein wenig hilfreich war.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top