2011-08-12 28 views
11

Mã của tôi:thông số Binding cho WHERE tại khoản với PDO

$myArray = implode($myArray, ','); 
$sth = $dbh->prepare('SELECT foo FROM bar WHERE ids IN (:ids)'); 
$sth->bindParam(':ids', $myArray); 
$sth->execute(); 
$result = $sth->fetch(); 
echo $sth->rowCount(); 

Luôn hiển thị số lượng 1, nhưng khi tôi bỏ qua parametrization và chỉ cần thêm biến bản thân trong đó diễn ra, tôi nhận được một con số chính xác. Những gì đang xảy ra ở đây?

Trả lời

12

Bạn không thể ràng buộc tham số cho mệnh đề IN như thế. Chuỗi $ myArray sẽ chỉ được tính là một giá trị, như thể bạn đã làm điều này:

SELECT foo FROM bar WHERE ids IN ('1,2,3') 

Mặc dù có ba giá trị phân cách bằng dấu phẩy, cơ sở dữ liệu chỉ đọc chúng bằng một giá trị chuỗi.

Bạn cần chèn thủ công danh sách IN vào truy vấn, cách học cũ.

'SELECT foo FROM bar WHERE ids IN (' . $myArray .')' 

Rất tiếc, không có cách nào khác. Ít nhất là bây giờ.

+7

Nghiêm túc? Các câu lệnh chuẩn bị không thể xử lý điều đó? Làm thế nào què là:/ – hoppa

+0

hãy cẩn thận của tiêm sql. – Dani

+5

@hoppa: họ có thể xử lý nó như thế này: 'id IN (: id1,: id2,: id3 ...)', bạn nhận được mẫu. Bạn tốt hơn với phương pháp oldschool. – Maerlyn

6

Tôi biết câu hỏi này là cũ, nhưng công trình này cho tôi:

$arrayOfValues = array(1,2,3,4,5); 
$questionMarks = join(",", array_pad(array(), count($arrayOfValues), "?")); 
$stmt = $dbh->prepare("update some_table set end_date = today where value_no in ($questionMarks)"); 
$stmt->execute($arrayOfValues); 
0

Tại sao không bạn sử dụng giải pháp này?

https://stackoverflow.com/a/39353278/1834212

Nó phân tích một mảng các giá trị đó là những cặp placeholders ràng buộc và các yếu tố của nó, trong trường hợp của một TRÊN bạn chỉ cần ăn một Array, và sau đó nó sẽ phân tích mảng và sửa đổi chuỗi cho bạn bằng cách sử dụng tên liên kết được tạo khi đang di chuyển và sau đó cấp các giá trị đó của mảng

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