Стандартный способ ANSI делать разделители является:
SELECT "field1" ...
и если есть "в имени, дважды его:
SELECT "some""thing" ...
К сожалению, это не работает в MySQL с настройками по умолчанию, потому что MySQL предпочитает думать, что двойные кавычки являются альтернативой одинарным кавычкам для строковых литералов. В этом случае вам нужно использовать обратные образы (как описано Björn) и обратную косую черту.
Чтобы сделать обратную косую черту правильно, вы получите : нужен mysql_real_escape_string, потому что он зависит от набора символов. Но вопрос спорный, потому что ни mysql_real_escape_string, ни addlashes не избегают символа backquote. Если вы можете быть уверены, что в именах столбцов никогда не будет символов, отличных от ASCII, вы можете избежать просто ручного обратного слэша - экранирования символов `и \.
В любом случае, это несовместимо с другими базами данных. Вы можете сказать MySQL, чтобы разрешить синтаксис ANSI, установив опцию конфигурации ANSI_QUOTES. Аналогичным образом, по умолчанию SQL Server также дросселирует по двойным кавычкам; он использует еще один синтаксис, а именно квадратные скобки. Опять же, вы можете настроить его для поддержки синтаксиса ANSI с опцией «quoted_identifier».
Резюме: если вам нужно только совместимость MySQL:
а. использовать обратные кавычки и запретит кавычку, обратную косую черту и пустой символ в именах, потому что избежать их ненадежно
Если вам нужно кросс-DBMS совместимость, либо:
б. используйте двойные кавычки и требуйте, чтобы пользователи MySQL/SQL-Server соответствующим образом изменили конфигурацию. Запретить двойные кавычки в имени (поскольку Oracle не может справиться с ними даже с экранированием). Или,
c. имеют настройку для MySQL vs SQL Server vs Others и создают в зависимости от этого либо синтаксис backquote, square bracket или double-quote. Запретить как двойные кавычки, так и обратную косую черту/backquote/nul.
Это то, на что вы надеетесь, что уровень доступа к данным будет иметь функцию, но PDO этого не делает.
Резюме резюме: произвольные имена столбцов являются проблемой, лучше всего избегать, если вы можете ей помочь.
Сводная информация о резюме: gnnnnnnnnnnnh.
Спасибо за разъяснение дебильная ситуация. Я думаю, что подход для взрослых здесь может состоять в том, чтобы просто вызвать исключение, если имя столбца не совпадает с [a-z0-9_], а не пытается кодировать все возможные дыры. –
А что насчет @Maryam Jeddian? 'str_replace (" \ '", "\' \ '", $ fieldname) 'выглядит разумно. Внутри backticks вам не нужно скрывать косые черты. Я не уверен в нулевых символах. Любые мысли об этом ответе? –
@ Kamil: Хм ... Я мог бы поклясться, что, когда я последний раз проверял, обратные косые черты действительно имели ускользающий эффект в backticks. Все еще происходит что-то странное: попробуйте ввести SELECT \ 'a \\' \ 'b \' FROM sometable; и MySQL довольно запутан. Поэтому я придерживаюсь «не позволяю персонажам вообще». – bobince