Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spaltennamen in PDO-Anweisungen maskieren

Die ANSI-Standardmethode für einen durch Trennzeichen getrennten Bezeichner ist:

SELECT "field1" ...

und wenn es ein " im Namen gibt, verdoppeln Sie es:

SELECT "some""thing" ...

Leider funktioniert dies in MySQL mit den Standardeinstellungen nicht, da MySQL lieber doppelte Anführungszeichen als Alternative zu einfachen Anführungszeichen für String-Literale betrachtet. In diesem Fall müssen Sie Backticks (wie von Björn beschrieben) und Backslash-Escape verwenden.

Um den Backslash korrekt zu maskieren, würden Sie brauchen mysql_real_escape_string, weil es zeichensatzabhängig ist. Aber der Punkt ist strittig, weil weder mysql_real_escape_string noch addlashes das Backquote-Zeichen maskieren . Wenn Sie sicher sein können, dass die Spaltennamen niemals Nicht-ASCII-Zeichen enthalten, können Sie die `- und \-Zeichen einfach manuell mit Backslash-Escapezeichen versehen.

In beiden Fällen ist dies nicht mit anderen Datenbanken kompatibel. Sie können MySQL anweisen, die ANSI-Syntax zuzulassen, indem Sie die Konfigurationsoption ANSI_QUOTES setzen. In ähnlicher Weise verschluckt sich SQL Server standardmäßig auch an doppelten Anführungszeichen; es verwendet noch eine andere Syntax, nämlich eckige Klammern. Auch hier können Sie es mit der Option „quoted_identifier“ so konfigurieren, dass es die ANSI-Syntax unterstützt.

Zusammenfassung:Wenn Sie nur MySQL-Kompatibilität benötigen:

a. Verwenden Sie Backquotes und verbieten Sie Backquotes, Backslashes und Nullzeichen in Namen, da es unzuverlässig ist, sie zu maskieren

Wenn Sie DBMS-übergreifende Kompatibilität benötigen, entweder:

b. Verwenden Sie doppelte Anführungszeichen und fordern Sie MySQL/SQL-Server-Benutzer auf, die Konfiguration entsprechend zu ändern. Doppelte Anführungszeichen im Namen nicht zulassen (da Oracle sie nicht verarbeiten kann, auch nicht mit Escapezeichen). Oder,

c. haben eine Einstellung für MySQL vs SQL Server vs Others und erzeugen abhängig davon entweder die Syntax Backquote, eckige Klammern oder doppelte Anführungszeichen. Sowohl doppelte Anführungszeichen als auch Backslash/Backquote/nul verbieten.

Dies ist etwas, von dem Sie hoffen würden, dass die Datenzugriffsschicht eine Funktion dafür hat, aber PDO hat keine.

Zusammenfassung der Zusammenfassung:Willkürliche Spaltennamen sind ein Problem, das man am besten vermeidet, wenn man sich dagegen wehren kann.

Zusammenfassung der Zusammenfassung der Zusammenfassung:gnnnnnnnnnnnh.