Standardní způsob ANSI pro vytvoření odděleného identifikátoru je:
SELECT "field1" ...
a pokud je v názvu ", zdvojnásobte jej:
SELECT "some""thing" ...
Bohužel to nefunguje v MySQL s výchozím nastavením, protože MySQL si raději myslí, že dvojité uvozovky jsou alternativou k jednoduchým uvozovkám pro řetězcové literály. V tomto případě musíte použít backticks (jak nastínil Björn) a zpětné lomítko.
Chcete-li správně escapovat zpětné lomítko, udělali byste potřebovat mysql_real_escape_string, protože je závislý na znakové sadě. Pointa je ale sporná, protože ani mysql_real_escape_string ani addlashes neuniknou znaku backquote . Pokud si můžete být jisti, že v názvech sloupců nikdy nebudou jiné znaky než ASCII, můžete se zbavit ručního escapování zpětného lomítka u znaků ` a \.
V každém případě to není kompatibilní s jinými databázemi. Můžete říci MySQL, aby povolila syntaxi ANSI, nastavením možnosti konfigurace ANSI_QUOTES. Podobně se SQL Server ve výchozím nastavení také dusí dvojitými uvozovkami; používá ještě další syntaxi, konkrétně hranaté závorky. Opět jej můžete nakonfigurovat tak, aby podporoval syntaxi ANSI s možností ‘quoted_identifier’.
Shrnutí:pokud potřebujete pouze kompatibilitu s MySQL:
A. používejte zpětné uvozovky a zakažte v názvech zpětné uvozovky, zpětné lomítko a nul, protože jejich escapování je nespolehlivé
Pokud potřebujete kompatibilitu mezi DBMS, buď:
b. používat dvojité uvozovky a vyžadovat, aby uživatelé serveru MySQL/SQL-Server náležitě změnili konfiguraci. Zakázat dvojité uvozovky v názvu (protože Oracle je nezvládne ani escape). Nebo,
C. mít nastavení pro MySQL vs SQL Server vs Others a v závislosti na tom vytvořit buď zadní uvozovky, hranaté závorky nebo dvojité uvozovky. Zakázat dvojité uvozovky i zpětné lomítko/zpětnou uvozovku/nulu.
To je něco, co byste doufali, že vrstva pro přístup k datům bude mít funkci, ale PDO ne.
Shrnutí shrnutí:Problémem jsou libovolné názvy sloupců, kterým je nejlepší se vyhnout, pokud si s tím můžete pomoci.
Shrnutí shrnutí souhrnu:gnnnnnnnnnnnnh.