Dit is de oorzaak van de fout:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Zoals Michael Berkowski en Andrewsi opmerkten in opmerkingen, kun je geen waarde binden aan :subdomain
tijdelijke aanduiding omdat het niet wordt vermeld als dat in de zoekopdracht en zelfs als het is PDO-plaatshouders kunnen alleen worden gebruikt voor waarden, niet voor database-, tabel- of kolomnamen .
Als u dat soort SQL-query's dynamisch wilt laten maken, moet u database-, tabel- of kolomnamen tussen aanhalingstekens plaatsen (in het geval dat uw kolommen en namen door SQL gereserveerde trefwoorden bevatten die de zoekopdracht kunnen breken) en escape-waarden die zijn geplaatst, maar u kunt MySQLi
niet gebruiken daarvoor als u al PDO
gebruikt .
Aangezien PDO niet wordt geleverd met real_escape_string()
methode die precies dat zou doen, en in de praktijk is het niet nodig om dergelijke waarden te escapen (tenzij je echt kolommen hebt met de naam Ye'name
wat totaal stom is IMHO), dus eenvoudig filteren met preg_match()
of preg_replace()
is goed genoeg:
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
}
Slechts enkele voorbeelden van het gebruik van '
(enkel aanhalingsteken - apostrof) tegen "
(dubbele aanhalingstekens) tekenreeksen in 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
De {}
string met dubbele aanhalingstekens wordt gebruikt voor toegang tot arrays en objecteigenschappen en kan worden gebruikt rond reguliere variabelen.
Escaping $
tussen dubbele aanhalingstekens wordt gedaan door \$
anders zal het een variabele aanroep aannemen.