sql >> Databasteknik >  >> RDS >> Mysql

SQLSTATE[42000]:Syntaxfel eller åtkomstöverträdelse:1064

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.



  1. mysql skiftlägeskänslig i utf8_general_ci

  2. MySQL Kontrollera om tabellen finns fel

  3. Hur SQLite Char() fungerar

  4. Oracle Sequence värden är inte beställda