Dette er, hvad der forårsager fejlen:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Som Michael Berkowski og andrewsi bemærkede i kommentarer, kan du ikke binde værdi til :subdomain
pladsholder, da det ikke er noteret som det i forespørgslen, og selvom det er PDO-pladsholdere kan kun bruges til værdier, ikke database-, tabel- eller kolonnenavne .
Hvis du vil have den slags SQL-forespørgsler dynamisk oprettet, skal du omslutte database-, tabel- eller kolonnenavne i anførselstegn (hvis dine kolonner og navne indeholder reserverede SQL-nøgleord, der kan bryde forespørgslen) og escape-værdier der er placeret, men du kan ikke bruge MySQLi
for det, hvis du allerede bruger PDO
.
Da PDO ikke kommer med real_escape_string()
metode, som ville gøre netop det, og i praksis er det ikke nødvendigt at undslippe værdier som den (medmindre du virkelig har kolonner navngivet som Ye'name
hvilket er totalt dumt IMHO), så simpelt filter ved hjælp af preg_match()
eller preg_replace()
er god nok:
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
}
Bare et par eksempler på brug af '
(enkelt citat - apostrof) mod "
(doble anførselstegn) strenge i 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
Escaping $
i dobbelte anførselstegn udføres af \$
ellers vil den antage et variabelt kald.