Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQLSTATE[42000]:Syntaxfehler oder Zugriffsverletzung:1064

Dies verursacht den Fehler:

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

Wie Michael Berkowski und Andrewsi in Kommentaren angemerkt haben, können Sie den Wert nicht an :subdomain binden Platzhalter, da er in der Abfrage nicht als solcher angegeben ist, und selbst wenn es sich um PDO-Platzhalter handelt, können diese nur für Werte verwendet werden, nicht für Datenbank-, Tabellen- oder Spaltennamen .

Wenn Sie möchten, dass diese Art von SQL-Abfragen dynamisch erstellt werden, müssen Sie Datenbank-, Tabellen- oder Spaltennamen in spitze Anführungszeichen setzen (falls Ihre Spalten und Namen SQL-reservierte Schlüsselwörter enthalten, die die Abfrage unterbrechen können) und Escape-Werte die platziert sind, aber Sie können MySQLi nicht verwenden dafür, wenn Sie bereits PDO verwenden .

Da PDO nicht mit real_escape_string() kommt Methode, die genau das tun würde, und in der Praxis ist es nicht erforderlich, solche Werte zu maskieren (es sei denn, Sie haben wirklich Spalten mit Namen wie Ye'name was IMHO total dumm ist), also einfacher Filter mit preg_match() oder preg_replace() ist gut genug:

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
}

Nur einige Beispiele für die Verwendung von ' (einfaches Anführungszeichen - Apostroph) gegen " (doppelte Anführungszeichen) Strings 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

Der {} Innerhalb von doppelten Anführungszeichen wird der String für Arrays und den Zugriff auf Objekteigenschaften verwendet und kann um reguläre Variablen herum verwendet werden.
Escapezeichen für $ in doppelten Anführungszeichen erfolgt durch \$ andernfalls wird ein Variablenaufruf angenommen.