Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

LIMIT từ khóa trên MySQL với câu lệnh chuẩn bị

Đây là vấn đề:

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

Trang hướng dẫn cho PDOStatement ::execute () nói (nhấn mạnh của tôi):

Thông số

input_parameters Một mảng giá trị có nhiều phần tử như các tham số liên kết trong câu lệnh SQL đang được thực thi. Tất cả các giá trị được xử lý dưới dạng PDO ::PARAM_STR .

Do đó, các tham số của bạn đang được chèn dưới dạng chuỗi, vì vậy mã SQL cuối cùng trông giống như sau:

LIMIT '0', '10'

Đây là một trường hợp cụ thể trong đó MySQL sẽ không chuyển thành số nhưng gây ra lỗi phân tích cú pháp:

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

Cái gì tài liệu phải nói:

LIMIT mệnh đề có thể được sử dụng để giới hạn số hàng được trả lại bởi SELECT tuyên bố. LIMIT nhận một hoặc hai đối số số, cả hai đều phải là hằng số nguyên không âm, với các ngoại lệ sau:

  • Trong các báo cáo đã chuẩn bị, LIMIT tham số có thể được chỉ định bằng cách sử dụng? các điểm đánh dấu chỗ dành sẵn.

  • Trong các chương trình được lưu trữ, LIMIT các tham số có thể được chỉ định bằng cách sử dụng các tham số quy trình có giá trị số nguyên hoặc các biến cục bộ.

Các lựa chọn của bạn bao gồm:

  • Liên kết từng thông số một để bạn có thể đặt một loại:

    $comments->bindParam(1, $post, PDO::PARAM_STR);
    $comments->bindParam(2, $min, PDO::PARAM_INT);
    $comments->bindParam(3, $min, PDO::PARAM_INT);
    
  • Không chuyển các giá trị đó dưới dạng tham số:

    $query = sprintf('SELECT id, content, date
        FROM comment
        WHERE post = ?
        ORDER BY date DESC
        LIMIT %d, %d', $min, $max);
    
  • Vô hiệu hóa chuẩn bị giả lập (trình điều khiển MySQL có một lỗi / tính năng sẽ làm cho nó trích dẫn các đối số số):

    $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. PDO:Máy chủ MySQL đã biến mất

  2. Làm cách nào để bạn đặt giá trị mặc định cho cột Ngày giờ trong MySQL?

  3. Cách hoạt động của hàm REGEXP_SUBSTR () trong MySQL

  4. Các phương pháp hay nhất trong cơ sở dữ liệu chia tỷ lệ:Phần 1

  5. Cách cài đặt cơ sở dữ liệu MariaDB trong Debian 10