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

BATAS kata kunci di MySQL dengan pernyataan yang disiapkan

Inilah masalahnya:

$comments = $db->prepare($query); 
/* where $db is the PDO object */ 
$comments->execute(array($post, $min, $max));

Halaman manual untuk PDOStatement::execute() mengatakan (penekanan pada saya):

Parameter

input_parameters Array nilai dengan elemen sebanyak parameter terikat dalam pernyataan SQL yang dieksekusi. Semua nilai diperlakukan sebagai PDO::PARAM_STR .

Dengan demikian parameter Anda dimasukkan sebagai string, sehingga kode SQL terakhir terlihat seperti ini:

LIMIT '0', '10'

Ini adalah kasus khusus di mana MySQL tidak akan mentransmisikan ke nomor tetapi memicu kesalahan penguraian:

mysql> SELECT 1 LIMIT 0, 10;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

mysql> SELECT 1 LIMIT '0', '10';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '10'' at line 1

Apa dokumen harus mengatakan:

LIMIT klausa dapat digunakan untuk membatasi jumlah baris yang dikembalikan oleh SELECT penyataan. LIMIT mengambil satu atau dua numerikargumen, yang keduanya harus berupa konstanta bilangan bulat non-negatif, dengan pengecualian berikut:

  • Dalam pernyataan yang disiapkan, LIMIT parameter dapat ditentukan menggunakan ? penanda placeholder.

  • Dalam program yang tersimpan, LIMIT parameter dapat ditentukan menggunakan parameter rutin bernilai integer atau variabel lokal.

Pilihan Anda meliputi:

  • Ikat parameter satu per satu sehingga Anda dapat menetapkan jenis:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Jangan berikan nilai tersebut sebagai parameter:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Nonaktifkan persiapan yang diemulasi (driver MySQL memiliki bug/fitur yang akan membuatnya mengutip argumen numerik):

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    


  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 menghapus catatan duplikat tetapi tetap terbaru

  2. Cara Memeriksa Status Server di MySQL Workbench menggunakan GUI

  3. Apakah database yang berbeda menggunakan kutipan nama yang berbeda?

  4. mysql secara otomatis menyimpan stempel waktu pembuatan catatan

  5. Cara Menambahkan Total Baris di MySQL