2012-08-13 43 views
5

Tôi phải chọn một số hàng từ cơ sở dữ liệu bằng cách sử dụng toán tử IN. Tôi muốn làm điều đó bằng cách sử dụng tuyên bố chuẩn bị. Đây là mã của tôi:Các câu lệnh chuẩn bị MySQLi với toán tử IN

<?php 
$lastnames = array('braun', 'piorkowski', 'mason', 'nash'); 
$in_statement = '"' . implode('", "', $lastnames) . '"'; //"braun", "piorkowski", "mason", "nash" 

$data_res = $_DB->prepare('SELECT `id`, `name`, `age` FROM `users` WHERE `lastname` IN (?)'); 
$data_res->bind_param('s', $in_statement); 
$data_res->execute(); 
$result = $data_res->get_result(); 
while ($data = $result->fetch_array(MYSQLI_ASSOC)) { 
    ... 
} 
?> 

Nhưng trả về không có gì mặc dù tất cả dữ liệu tồn tại trong cơ sở dữ liệu.

Và một điều nữa: nếu tôi vượt qua $in_statement trực tiếp để truy vấn và thực thi nó, dữ liệu sẽ được trả lại. Vì vậy, vấn đề xuất hiện khi chuẩn bị.

Tôi đang tìm kiếm câu hỏi trong Google nhưng không thành công. Có gì sai với mã của tôi?
Cảm ơn sự giúp đỡ!

+3

Bạn không thể sử dụng một tham số duy nhất cho mệnh đề IN của mình. Nó cần phải là: 'WHERE lastName IN (?,?,?,?)' – andrewsi

+1

Được rồi, cảm ơn rất nhiều!) Có vẻ hơi cồng kềnh. – kpotehin

Trả lời

4

Gần đây tôi đã tìm thấy giải pháp cho câu hỏi của mình. Có lẽ nó không phải là cách tốt nhất để làm điều đó, nhưng nó hoạt động tốt đẹp! Chứng minh cho tôi sai :)

<?php 
$lastnames = array('braun', 'piorkowski', 'mason', 'nash'); 
$arParams = array(); 

foreach($lastnames as $key => $value) //recreate an array with parameters explicitly passing every parameter by reference 
    $arParams[] = &$lastnames[$key]; 

$count_params = count($arParams); 

$int = str_repeat('i',$count_params); //add type for each variable (i,d,s,b); you can also determine type of the variable automatically (is_int, is_float, is_string) in loop, but i don't need it 
array_unshift($arParams,$int); 

$q = array_fill(0,$count_params,'?'); //form string of question marks for statement 
$params = implode(',',$q); 

$data_res = $_DB->prepare('SELECT `id`, `name`, `age` FROM `users` WHERE `lastname` IN ('.$params.')'); 
call_user_func_array(array($data_res, 'bind_param'), $arParams); 
$data_res->execute(); 
$result = $data_res->get_result(); 
while ($data = $result->fetch_array(MYSQLI_ASSOC)) { 
    ... 
} 

$result->free(); 
$data_res->close(); 
?> 
2

báo cáo chuẩn bị có nghĩa là để tránh chính xác những gì bạn đang cố gắng để làm cho nó làm :)

Để có được điều này để làm việc bạn phải áp dụng bước này:

$escaped_lastnames = join(',', array_map(array($_DB, 'real_escape_string'), $lastnames)); 

Nó bản đồ chuỗi thích hợp chức năng thoát cho cơ sở dữ liệu của bạn trên mỗi mục của $lastnames. Khi hoàn tất, bạn chèn giá trị này thẳng vào truy vấn, nghĩa là không sử dụng tham số bị ràng buộc.

+0

Cảm ơn, Jack, nhưng tôi đã tìm ra cách để thực hiện truy vấn này thông qua câu lệnh đã chuẩn bị. Tôi đang sử dụng call_user_func_array (mảng ($ data_res, 'bind_param'), $ arParams); thay vì thường xuyên bind_param. $ arParams chứa các loại biến và các biến này chính xác) – kpotehin

+0

Chỉ cần đăng mã của tôi là câu trả lời) – kpotehin

+2

@kpotehin chắc chắn, nếu bạn thực sự phải (ab) sử dụng báo cáo chuẩn bị cho điều này, bạn có thể tất nhiên :) cá nhân tôi không thấy lợi ích, trừ khi nó phải chạy nhiều lần trong một thực thi php –

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