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

SQLSTATE[42000]:Syntaksfejl eller adgangsbrud:1064

Dette er, hvad der forårsager fejlen:

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

Som Michael Berkowski og andrewsi bemærkede i kommentarer, kan du ikke binde værdi til :subdomain pladsholder, da det ikke er noteret som det i forespørgslen, og selvom det er PDO-pladsholdere kan kun bruges til værdier, ikke database-, tabel- eller kolonnenavne .

Hvis du vil have den slags SQL-forespørgsler dynamisk oprettet, skal du omslutte database-, tabel- eller kolonnenavne i anførselstegn (hvis dine kolonner og navne indeholder reserverede SQL-nøgleord, der kan bryde forespørgslen) og escape-værdier der er placeret, men du kan ikke bruge MySQLi for det, hvis du allerede bruger PDO .

Da PDO ikke kommer med real_escape_string() metode, som ville gøre netop det, og i praksis er det ikke nødvendigt at undslippe værdier som den (medmindre du virkelig har kolonner navngivet som Ye'name hvilket er totalt dumt IMHO), så simpelt filter ved hjælp af preg_match() eller preg_replace() er god nok:

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
}

Bare et par eksempler på brug af ' (enkelt citat - apostrof) mod " (doble anførselstegn) strenge 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

{} inde i dobbelte anførselstegn streng bruges til arrays og objektegenskabsadgang og kan bruges omkring almindelige variabler.
Escaping $ i dobbelte anførselstegn udføres af \$ ellers vil den antage et variabelt kald.



  1. SQL Union – En omfattende vejledning om UNION-operatøren

  2. Brug af Percona Audit Log Plugin til databasesikkerhed

  3. CHECK CONSTRAINT på flere kolonner

  4. FEJL 1698 (28000):Adgang nægtet for brugeren 'root'@'localhost'