Questa è la causa dell'errore:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
Come hanno notato Michael Berkowski e andrewsi nei commenti, non puoi associare il valore a :subdomain
segnaposto poiché non è indicato come quello nella query e anche se è I segnaposto PDO possono essere utilizzati solo per valori non per nomi di database, tabelle o colonne .
Se vuoi avere quel tipo di query SQL create dinamicamente devi racchiudere i nomi di database, tabelle o colonne tra virgolette a ritroso (nel caso in cui le colonne e i nomi contengano parole chiave riservate SQL che potrebbero interrompere la query) e valori di escape che sono stati inseriti, ma non puoi usare MySQLi
per questo se stai già utilizzando PDO
.
Poiché PDO non viene fornito con real_escape_string()
metodo che farebbe proprio questo, e in pratica non è necessario sfuggire a valori del genere (a meno che tu non abbia davvero colonne denominate come Ye'name
che è totalmente stupido IMHO), quindi filtra semplicemente usando preg_match()
o preg_replace()
è abbastanza buono:
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
}
Solo alcuni esempi di utilizzo di '
(virgoletta singola - apostrofo) contro "
(virgolette doppie) stringhe 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
Il {}
all'interno di virgolette la stringa viene utilizzata per gli array e l'accesso alle proprietà degli oggetti e può essere utilizzata attorno a variabili regolari.
Escape $
tra virgolette è fatto da \$
altrimenti assumerà una chiamata variabile.