La forma estándar ANSI de hacer un identificador delimitado es:
SELECT "field1" ...
y si hay un " en el nombre, duplícalo:
SELECT "some""thing" ...
Desafortunadamente, esto no funciona en MySQL con la configuración predeterminada, porque MySQL prefiere pensar que las comillas dobles son una alternativa a las comillas simples para los literales de cadena. En este caso, debe usar backticks (como lo describe Björn) y backslash-escaping.
Para realizar el escape de barra invertida correctamente, debería necesita mysql_real_escape_string, porque depende del juego de caracteres. Pero el punto es discutible, porque ni mysql_real_escape_string ni addedlashes escapan del carácter de comillas invertidas . Si puede estar seguro de que nunca habrá caracteres que no sean ASCII en los nombres de las columnas, puede salirse con la suya simplemente eliminando manualmente la barra invertida de los caracteres ` y \.
De cualquier manera, esto no es compatible con otras bases de datos. Puede decirle a MySQL que permita la sintaxis ANSI configurando la opción de configuración ANSI_QUOTES. Del mismo modo, SQL Server también se ahoga con comillas dobles de forma predeterminada; utiliza otra sintaxis, a saber, corchetes. Nuevamente, puede configurarlo para admitir la sintaxis ANSI con la opción 'identificador_citado'.
Resumen:si solo necesita compatibilidad con MySQL:
una. use comillas inversas y no permita la comilla inversa, la barra invertida y el carácter nulo en los nombres porque escapar de ellos no es confiable
Si necesita compatibilidad entre DBMS, ya sea:
b. use comillas dobles y requiera que los usuarios de MySQL/SQL-Server cambien la configuración apropiadamente. No permitir caracteres de comillas dobles en el nombre (ya que Oracle no puede manejarlos ni siquiera con escape). O,
C. tenga una configuración para MySQL vs SQL Server vs Others, y produzca la sintaxis de comillas inversas, corchetes o comillas dobles dependiendo de eso. Deshabilitar las comillas dobles y la barra invertida/comillas invertidas/nul.
Esto es algo para lo que esperaría que la capa de acceso a datos tuviera una función, pero PDO no la tiene.
Resumen del resumen:los nombres de columna arbitrarios son un problema, es mejor evitarlo si puede evitarlo.
Resumen del resumen del resumen:gnnnnnnnnnnnh.