sql >> Databáze >  >> RDS >> Mysql

SQLSTATE[42000]:Chyba syntaxe nebo narušení přístupu:1064

Toto je příčina chyby:

$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);

Jak uvedli Michael Berkowski a andrewsi v komentářích, nemůžete svázat hodnotu s :subdomain zástupný symbol, protože není uveden jako v dotazu a i když je zástupné symboly PDO lze použít pouze pro hodnoty, nikoli pro názvy databází, tabulek nebo sloupců .

Pokud chcete mít tento druh SQL dotazů vytvářen dynamicky, musíte uzavřet názvy databáze, tabulky nebo sloupce do uvozovek (v případě, že vaše sloupce a názvy obsahují vyhrazená klíčová slova SQL, která mohou narušit dotaz) a unikající hodnoty které jsou umístěny, ale nemůžete použít MySQLi pokud již používáte PDO .

Protože PDO nepřichází s real_escape_string() metoda, která by dělala právě to, a v praxi není potřeba takové hodnoty escapovat (pokud opravdu nemáte sloupce pojmenované jako Ye'name což je IMHO úplně hloupé), takže jednoduchý filtr pomocí preg_match() nebo preg_replace() je dost dobrý:

if (preg_match('/^[\w_]+$/i', $this->subdomain)) {
    // note the ` (backtick), and using " (double quotes):
    $this->data->query("CREATE TABLE `{$this->subdomain}`"); 
} else {
    // throw exception or error, do not continue with creating table
}

Několik příkladů použití ' (jednoduchá uvozovka - apostrof) proti " (dvojité uvozovky) řetězce v PHP:

$a = 1;
$b = 2;
echo '$a + $b'; // outputs: $a + $b
echo "$a + $b"; // outputs: 1 + 2
$c = array(5, 10);
echo '\$c[0] = {$c[0]}'; // outputs: \$c[0] = {$c[0]}
echo "\$c[0] = {$c[0]}"; // outputs: $c[0] = 5

{} řetězec uvnitř dvojitých uvozovek se používá pro přístup k polím a vlastnostem objektu a lze jej použít kolem běžných proměnných.
Escapování $ ve dvojitých uvozovkách se provádí pomocí \$ jinak bude předpokládat volání proměnné.



  1. MySQL dotaz - spojte 3 tabulky dohromady, seskupte je podle jednoho sloupce a počítejte pro další 2

  2. Vynutit omezení cizího klíče na sloupce stejné tabulky

  3. Jaký je rozdíl ve výkonu v implementacích relačního dělení MySQL (IN AND namísto IN OR)?

  4. Prohlášení FORALL s vázanou doložkou VALUES-OF v databázi Oracle