Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQLSTATE[42000]:Kesalahan sintaks atau pelanggaran akses:1064

Inilah yang menyebabkan kesalahan:

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

Seperti yang dicatat Michael Berkowski dan andrewsi dalam komentar, Anda tidak dapat mengikat nilai ke :subdomain placeholder karena tidak dicatat seperti itu dalam kueri dan bahkan jika placeholder PDO hanya dapat digunakan untuk nilai, bukan nama database, tabel, atau kolom .

Jika Anda ingin membuat kueri SQL semacam itu dibuat secara dinamis, Anda perlu menyertakan nama database, tabel, atau kolom dalam tanda kutip backtick (jika kolom dan nama Anda berisi kata kunci yang dicadangkan SQL yang dapat merusak kueri) dan escape values yang ditempatkan, tetapi Anda tidak dapat menggunakan MySQLi untuk itu jika sudah menggunakan PDO .

Karena PDO tidak datang dengan real_escape_string() metode yang akan melakukan hal itu, dan dalam praktiknya tidak diperlukan untuk menghindari nilai seperti itu (kecuali jika Anda benar-benar memiliki kolom bernama seperti Ye'name yang benar-benar bodoh IMHO), filter sangat sederhana menggunakan preg_match() atau preg_replace() cukup baik:

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
}

Beberapa contoh penggunaan ' (kutipan tunggal - apostrof) terhadap " (tanda kutip ganda) string di 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

{} di dalam tanda kutip ganda string digunakan untuk array dan akses properti objek dan dapat digunakan di sekitar variabel biasa.
Escaping $ dalam tanda kutip ganda dilakukan oleh \$ jika tidak, itu akan mengasumsikan panggilan variabel.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. buat batasan tabel di mysql

  2. Bagaimana saya bisa mempercepat kueri MySQL dengan klausa WHERE pada dua kolom?

  3. Bagaimana cara membuat beberapa kueri kolom WHERE IN di pembuat kueri Doctrine?

  4. Mysql mengonversi int ke MAC

  5. MySQL LOAD DATA dengan data multiline