2012-04-04 26 views
15
SELECT id, content, date 
FROM comment 
WHERE post = ? 
ORDER BY date DESC 
LIMIT ?, ? 

Với PDO (Tôi đang sử dụng MAMP 2.0.5 có Apache 2.2.21, PHP lên đến 5.3.6 và MySQL 5.5.9) đã chuẩn bị tuyên bố điều này không làm việc, nếu tôi thay đổi truy vấn vớiLIMIT từ khóa trên MySQL với tuyên bố đã chuẩn bị

LIMIT 0, 10 

hoạt động.

Tôi thấy trong các lỗi của MySQL rằng đây là lỗi trong phiên bản trước nhưng tôi không thể hiểu được nếu điều này vẫn còn được sửa.

Nếu điều này vẫn còn là một vấn đề, có một cách để chọn một loạt các hàng theo một cách khác?

mã:

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

Làm cách nào để bạn ràng buộc các tham số của mình? – alexn

+0

Làm việc xung quanh sẽ được đúc các giá trị mà bạn đang thay thế vào mệnh đề 'LIMIT' thành' (int) 'và chỉ định chúng theo nghĩa đen trong truy vấn. Đây là một bước khử trùng không thể phá vỡ theo cách nó phá vỡ bất cứ điều gì, bất kỳ chuỗi nào không phải là một biểu diễn số nguyên hợp lệ sẽ dẫn đến '0'. Trường hợp xấu nhất, bạn sẽ không nhận được kết quả nào. – DaveRandom

+0

$ comments = $ db-> chuẩn bị ($ truy vấn);/* trong đó $ db là đối tượng PDO */$ comments-> execute (mảng ($ post, $ min, $ max)); – genesisxyz

Trả lời

34

Dưới đây là các vấn đề:

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

Các trang hướng dẫn cho PDOStatement::execute() nói (tôi nhấn mạnh):

Parameters

input_parameters An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR.

Do đó thông số của bạn đang nhận được chèn như dây đàn , 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 biệt nơi MySQL sẽ không đúc để số nhưng gây ra một 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 

docs phải nói:

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants, with these exceptions:

  • Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.

  • Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables.

Lựa chọn của bạn bao gồm:

  • Thông số liên kết s từng người một, do đó bạn có thể thiết lập một kiểu:

    $comments->bindParam(1, $post, PDO::PARAM_STR); 
    $comments->bindParam(2, $min, PDO::PARAM_INT); 
    $comments->bindParam(3, $min, PDO::PARAM_INT); 
    
  • Không vượt qua những giá trị như các thông số:

    $query = sprintf('SELECT id, content, date 
        FROM comment 
        WHERE post = ? 
        ORDER BY date DESC 
        LIMIT %d, %d', $min, $max); 
    
  • Disable mô phỏng chuẩn bị (driver MySQL có một lỗi/tính năng mà sẽ làm cho nó trích lập luận số):

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

điều này thực sự là nguyên nhân nhưng nhìn thấy mã sẽ không giúp được :) –

+3

Vâng, mã được ghi đè xD –

+0

xin lỗi vì không đăng mã nhưng giờ mọi thứ đã rõ ràng, cảm ơn! :) – genesisxyz

3
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

sẽ giải quyết vấn đề này.

+0

công trình này! Tôi phải xem điều này làm gì chính xác, nhưng bây giờ là hoàn hảo – genesisxyz

+8

câu trả lời khác minh họa cách nó hoạt động. PDO chỉ mô phỏng các chuẩn bị theo mặc định, và khi bạn ràng buộc các biến của bạn một cách âm thầm, mà không cần thiết lập kiểu, PDO xử lý chúng như các chuỗi theo mặc định. Các chuỗi trong SQL phải được trích dẫn và thoát - do đó bạn có các trích dẫn trong mệnh đề LIMIT của bạn và một lỗi cú pháp. Trong khi các câu lệnh chuẩn bị gốc được sử dụng, một cơ sở dữ liệu có thể sắp xếp mọi thứ. –

Các vấn đề liên quan