Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQLSTATE[42000] :erreur de syntaxe ou violation d'accès :1064

C'est ce qui cause l'erreur :

$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);

Comme Michael Berkowski et andrewsi l'ont noté dans les commentaires, vous ne pouvez pas lier la valeur à :subdomain espace réservé puisqu'il n'est pas noté comme tel dans la requête et même s'il s'agit de les espaces réservés PDO ne peuvent être utilisés que pour des valeurs qui ne sont pas des noms de base de données, de table ou de colonne .

Si vous souhaitez créer dynamiquement ce type de requêtes SQL, vous devez mettre les noms de base de données, de table ou de colonne entre guillemets (au cas où vos colonnes et noms contiennent des mots-clés réservés SQL qui peuvent casser la requête) et des valeurs d'échappement qui sont placés, mais vous ne pouvez pas utiliser MySQLi pour cela si vous utilisez déjà PDO .

Puisque PDO ne vient pas avec real_escape_string() méthode qui ferait exactement cela, et en pratique il n'est pas nécessaire d'échapper des valeurs comme ça (sauf si vous avez vraiment des colonnes nommées comme Ye'name ce qui est totalement stupide à mon humble avis), filtre si simple en utilisant preg_match() ou preg_replace() est assez bon :

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
}

Quelques exemples d'utilisation de ' (guillemet simple - apostrophe) contre " (guillemets doubles) chaînes en 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

Le {} La chaîne entre guillemets doubles est utilisée pour les tableaux et l'accès aux propriétés de l'objet et peut être utilisée autour de variables régulières.
Échappement de $ entre guillemets se fait par \$ sinon, il supposera un appel de variable.