Il modo standard ANSI per eseguire un identificatore delimitato è:
SELECT "field1" ...
e se c'è un " nel nome, raddoppialo:
SELECT "some""thing" ...
Sfortunatamente questo non funziona in MySQL con le impostazioni predefinite, perché MySQL preferisce pensare che le virgolette doppie siano un'alternativa alle virgolette singole per le stringhe letterali. In questo caso devi usare i backtick (come indicato da Björn) e l'escape della barra rovesciata.
Per eseguire correttamente l'escape della barra rovesciata, dovresti bisogno di mysql_real_escape_string, perché dipende dal set di caratteri. Ma il punto è discutibile, perché né mysql_real_escape_string né addlashes sfuggono al carattere backquote . Se puoi essere sicuro che non ci saranno mai caratteri non ASCII nei nomi delle colonne, puoi farla franca utilizzando manualmente l'escape della barra rovesciata dei caratteri ` e \.
In ogni caso, questo non è compatibile con altri database. Puoi dire a MySQL di consentire la sintassi ANSI impostando l'opzione di configurazione ANSI_QUOTES. Allo stesso modo, per impostazione predefinita, anche SQL Server si blocca con le virgolette doppie; utilizza ancora un'altra sintassi, vale a dire parentesi quadre. Anche in questo caso, puoi configurarlo per supportare la sintassi ANSI con l'opzione 'quoted_identifier'.
Riepilogo:se hai solo bisogno della compatibilità con MySQL:
un. usa le virgolette inverse e non consentire le virgolette, la barra rovesciata e il carattere nullo nei nomi perché l'escape non è affidabile
Se hai bisogno della compatibilità tra DBMS, puoi:
b. utilizzare le virgolette doppie e richiedere agli utenti MySQL/SQL Server di modificare la configurazione in modo appropriato. Non consentire i caratteri con virgolette doppie nel nome (poiché Oracle non può gestirli nemmeno con l'escape). Oppure,
c. avere un'impostazione per MySQL rispetto a SQL Server e altri e produrre la sintassi tra virgolette, parentesi quadre o virgolette a seconda di ciò. Non consentire sia le doppie virgolette che la barra rovesciata/backquote/nul.
Questo è qualcosa per cui speri che il livello di accesso ai dati abbia una funzione, ma PDO no.
Riepilogo del riepilogo:i nomi arbitrari delle colonne sono un problema, è meglio evitarlo se puoi evitarlo.
Riepilogo del riassunto del riassunto:gnnnnnnnnnnnh.