Mysql
 sql >> Database >  >> RDS >> Mysql

SQLSTATE[42000]:Errore di sintassi o violazione di accesso:1064

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.