2015-05-22 15 views
8
$sql = "SELECT sql_calc_found_rows * FROM members". 
     " ORDER BY username LIMIT :startRow, :numRows"; 

try { 
    $st = $conn->prepare($sql); 
    $st->bindParam(":startRow", $startRow, PDO::PARAM_INT); 
    $st->bindParam(":numRows", $numRows, PDO::PARAM_INT); 
    $st->execute(); 
} catch (PDOException $e) { 
    die("Query failed: " . $e->getMessage()); 
} 

Ở đây tôi nhận được lỗi:PHP PDO lỗi khi sử dụng placeholders trong LIMIT khoản của một truy vấn MySQL

Query failed: SQLSTATE[42000]: Syntax error or access violation: 1064 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 ''5'' at line 1.

Các LIMIT :startRow, :numRows có vấn đề trong :numRows.

Tôi đã thử cả hai $st->bindParam$st->bindValue, cả hai đều không hoạt động.

+0

Bạn có thể thử để loại bỏ trống thứ giữa ': startRow,: numRows' – Jens

+0

giá trị của $ trật tự? –

+1

SELECT sql_calc_found_rows * FROM ?? cái gì thế này? –

Trả lời

-2

Tôi đã giải quyết. Tôi đã nhập trình giữ chỗ :numRows.

$numRows=(int)$numRows; $sql = 'SELECT sql_calc_found_rows * FROM ' . TBL_MEMBERS .'ORDER BY'. $order .'LIMIT :startRow,:numRows'; try { $st = $conn->prepare($sql); $st->bindValue(":startRow", $startRow, PDO::PARAM_INT); $st->bindValue(":numRows", $numRows, PDO::PARAM_INT); $st->execute();

Và nó hoạt động. Tôi cũng nhận thấy rằng ' nên được sử dụng thay vì ".

0

Tôi nghĩ rằng vấn đề là với TBL_MEMBERS Tôi cho rằng đây là chế độ xem (bỏ chọn). Vì vậy, nếu bạn có bảng sản phẩm ví dụ và bạn muốn thực hiện sau tuyên bố:

select sql_calc_found_rows * from select id, code, name, slug, info from products order by code 

bạn sẽ nhận được lỗi sau:

SQL Error (1064): 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 'select id, code, name, slug, info from products order by code' at line 1

Nhưng nếu bạn thay đổi truy vấn để:

select sql_calc_found_rows * from (select id, code, name, slug, info from products) v order by code 

tính năng này sẽ hoạt động.

Để tóm tắt, TBL_MEMBERS là một cái nhìn mà phải được đặt trong ngoặc đơn và trao bí danh (i dụ bí danh của tôi là 'v')

+0

'TBL_MEMBERS' là một định nghĩa. 'define (" TBL_MEMBERS "," members ");' Tôi không nghĩ đó là vấn đề. –

0

Tôi khuyên bạn nên nhìn vào nội dung truy vấn SQL gì PDO thực sự tạo ra. Bạn có thể làm điều này với sự giúp đỡ của general query log của MySQL.

lẽ Hầu hết, các loại chính thức của $startRow và/hoặc $numRows là chuỗi, không phải số nguyên, và kết quả truy vấn do đó là một cái gì đó giống như LIMIT '0', '5' (lỗi cú pháp) thay vì LIMIT 0, 5 (đúng).

Điều này, ngay cả với PDO::PARAM_INT, khi loại chính thức của tham số không phải là số nguyên (is_int trả về false), PDO kết thúc tốt đẹp trong dấu ngoặc kép. Vì vậy, bạn phải bỏ tham số để số nguyên trước khi ràng buộc họ (ví dụ sử dụng intval):

$st->bindParam(":startRow", intval(trim($startRow)), PDO::PARAM_INT); 
$st->bindParam(":numRows", intval(trim($numRows)), PDO::PARAM_INT); 
Các vấn đề liên quan