Mysql
 sql >> база данни >  >> RDS >> Mysql

SQLSTATE[42000]:Синтактична грешка или нарушение на достъпа:1064

Ето какво причинява грешката:

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

Както Майкъл Берковски и Андрюси отбелязаха в коментари, не можете да свържете стойност към :subdomain заместител, тъй като не е отбелязан като този в заявката и дори да е PDO заместителите могат да се използват само за стойности, а не за имена на база данни, таблици или колони .

Ако искате този вид SQL заявки да се създават динамично, трябва да оградите имена на база данни, таблици или колони в обратни кавички (в случай че вашите колони и имена съдържат SQL запазени ключови думи, които могат да нарушат заявката) и escape стойности които са поставени, но не можете да използвате MySQLi за това, ако вече използвате PDO .

Тъй като PDO не идва с real_escape_string() метод, който би направил точно това и на практика не е необходимо да избягвате стойности като този (освен ако наистина имате колони с имена като Ye'name което е напълно глупаво IMHO), толкова прост филтриране с помощта на preg_match() или preg_replace() е достатъчно добър:

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
}

Само няколко примера за използване на ' (единични кавички - апостроф) срещу " (двойни кавички) низове в 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

{} низът в двойни кавички се използва за достъп до масиви и свойства на обект и може да се използва около обикновени променливи.
Ескейпиране на $ в двойни кавички се извършва от \$ в противен случай ще приеме извикване на променлива.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво е значението на въпросителния знак в MySQL в колона WHERE =??

  2. Въвеждане на нова колона за сумата от предходния месец

  3. Връзка едно към много между AspNetUsers (идентичност) и персонализирана таблица

  4. Търсене в mysqli таблица с формуляр и показване на резултати

  5. Размерът на таблицата влияе ли върху производителността на INSERT?