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é.