Oto przyczyna błędu:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Jak zauważyli Michael Berkowski i andrewsi w komentarzach, nie można powiązać wartości z :subdomain symbol zastępczy, ponieważ nie jest to odnotowane w zapytaniu, a nawet jeśli jest, elementy zastępcze PDO mogą być używane tylko dla wartości, a nie nazw baz danych, tabel lub kolumn .
Jeśli chcesz, aby tego rodzaju zapytania SQL były tworzone dynamicznie, musisz zawrzeć nazwy baz danych, tabel lub kolumn w cudzysłowie z zaznaczeniem (w przypadku, gdy Twoje kolumny i nazwy zawierają zastrzeżone słowa kluczowe SQL, które mogą przerwać zapytanie) i wartości specjalne które są umieszczone, ale nie możesz użyć MySQLi w tym celu, jeśli już używasz PDO .
Ponieważ PDO nie jest dostarczane z real_escape_string() metoda, która właśnie to zrobi, aw praktyce nie ma potrzeby zmiany znaczenia wartości w ten sposób (chyba że naprawdę masz kolumny o nazwach takich jak Ye'name co jest całkowicie głupim IMHO), więc prosty filtr za pomocą preg_match() lub preg_replace() jest wystarczająco dobry:
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
}
Tylko kilka przykładów użycia ' (pojedynczy cytat - apostrof) przeciwko " (podwójne cudzysłowy) ciągi w 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
{} Wewnątrz podwójnych cudzysłowów ciąg znaków jest używany do tablic i dostępu do właściwości obiektu i może być używany wokół zwykłych zmiennych.
Uciekanie $ w podwójnych cudzysłowach wykonuje \$ w przeciwnym razie przyjmie zmienne wywołanie.