Ето какво причинява грешката:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Както Майкъл Берковски и Андрюси отбелязаха в коментари, не можете да свържете стойност към :subdomain
заместител, тъй като не е отбелязан като този в заявката и дори да е PDO заместителите могат да се използват само за стойности, а не за имена на база данни, таблици или колони .
Ако искате този вид SQL заявки да се създават динамично, трябва да оградите имена на база данни, таблици или колони в обратни кавички (в случай че вашите колони и имена съдържат SQL запазени ключови думи, които могат да нарушат заявката) и escape стойности които са поставени, но не можете да използвате MySQLi
за това, ако вече използвате PDO
.
Тъй като PDO не идва с real_escape_string()
метод, който би направил точно това и на практика не е необходимо да избягвате стойности като този (освен ако наистина имате колони с имена като Ye'name
което е напълно глупаво IMHO), толкова прост филтриране с помощта на preg_match()
или preg_replace()
е достатъчно добър:
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
}
Само няколко примера за използване на '
(единични кавички - апостроф) срещу "
(двойни кавички) низове в 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
{}
низът в двойни кавички се използва за достъп до масиви и свойства на обект и може да се използва около обикновени променливи.
Ескейпиране на $
в двойни кавички се извършва от \$
в противен случай ще приеме извикване на променлива.