2009-04-21 40 views
12

Tôi đang chuyển một số mã cũ sang giao diện msqli mới bằng cách sử dụng các câu lệnh đã chuẩn bị, tôi đang gặp rắc rối với các câu lệnh SQL có chứa mệnh đề IN. Tôi sẽ chỉ bình thường làm điều này:Làm thế nào để bạn sử dụng các mệnh đề IN với các câu lệnh chuẩn bị mysqli

$ids = '123,535,345,567,878' 
$sql = "SELECT * FROM table WHERE id IN ($ids)"; 
$res = mysql_query($sql); 

Chuyển đổi này để mysqli và chuẩn bị phát biểu Tôi đã thử một số giải pháp:

$ids = '123,535,345,567,878' 
$ids = implode($ids,','); 
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?)); 
$result->bind_param("i", $ids); 
$result->execute(); 

ở trên không và tính toán số phần tử trong mảng và làm thay đổi số lượng dấu hỏi trong chuỗi SQL và gọi bind_parm cho mỗi phần tử trong mảng cũng không thành công. Chỉ cần sử dụng chuỗi phân cách bằng dấu phẩy cũng không thành công.

Tôi không thể tìm thấy tài liệu hay về Google về vấn đề này, vì vậy bạn đã giải quyết được vấn đề như thế nào?

+0

có thể trùng lặp của [? PreparedStatement TRÊN lựa chọn thay thế khoản] (https://stackoverflow.com/questions/178479/preparedstatement -in-khoản-lựa chọn thay thế) – bfavaretto

Trả lời

6

Nhìn vào câu trả lời cho một câu hỏi tương tự đã được hỏi ở đây trước (mẫu mã thứ hai):

I have an array of integers, how do I use each one in a mysql query (in php)?

Nó nắm tới:

  • tạo chuỗi SQL với đúng số lượng dấu hỏi
  • sử dụng call_user_func_array() để liên kết mảng của bạn với chuỗi truy vấn
+0

all_user_func_array() đã làm thủ thuật Cảm ơn –

9

Không thể liên kết danh sách độ dài biến đổi với một biến giới hạn đơn lẻ.

Tương tự như vậy, nếu bạn đã để ràng buộc chuỗi $ids bạn sẽ thực sự kết thúc với:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878') 

(Lưu ý các dấu ngoặc kép quanh danh sách các ID).

Tạo truy vấn của riêng bạn với số lượng dấu hỏi đúng và thông số ràng buộc phải thực sự hoạt động - bạn có thể cần phải thử lại và báo cáo về lỗi thực tế.

Ngoài ra, đây có thể là một trong những trường hợp không may là cần thiết để tự tay tạo SQL của riêng bạn và không sử dụng các tham số ràng buộc.

-1

Tôi nghĩ điểm chuẩn bị phát biểu rất trong tình huống này bạn chỉ có thể làm:

$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ? WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'"); 
foreach ($usernames as $username) 
{ 
    $stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username); 
    $stmt->execute(); 
} 
$stmt->close(); 
+0

Câu trả lời của bạn giống như một câu hỏi tôi tin tưởng. Ngoài ra, vấn đề sẽ là trong các câu lệnh IN nó sẽ thoát khỏi nhiều giá trị dưới dạng một chuỗi. –

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