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.