Det här är vad som orsakar felet:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Som Michael Berkowski och andrewsi noterade i kommentarerna kan du inte binda värde till :subdomain
platshållare eftersom det inte är noterat som det i frågan och även om det är PDO-platshållare kan endast användas för värden, inte databas-, tabell- eller kolumnnamn .
Om du vill skapa den typen av SQL-frågor dynamiskt måste du omsluta databas-, tabell- eller kolumnnamn med citattecken (om dina kolumner och namn innehåller reserverade SQL-sökord som kan bryta frågan) och escape-värden som är placerade, men du kan inte använda MySQLi
för det om du redan använder PDO
.
Eftersom PDO inte kommer med real_escape_string()
metod som skulle göra just det, och i praktiken behövs den inte för att undvika sådana värden (såvida du inte verkligen har kolumner som heter Ye'name
vilket är helt dumt IMHO), så enkelt filter med preg_match()
eller preg_replace()
är tillräckligt bra:
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
}
Bara några exempel på hur du använder '
(enkelt citat - apostrof) mot "
(dubbla citattecken) strängar 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
{}
Strängen inuti dubbla citattecken används för arrayer och objektegenskapsåtkomst och kan användas runt vanliga variabler.
Escaping $
i dubbla citattecken görs av \$
annars kommer den att anta ett variabelt anrop.