2012-08-13 124 views
5

我必須使用IN運算符從數據庫中選擇一些行。我想用準備好的陳述來做。這是我的代碼:MySQLi準備語句與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)) { 
    ... 
} 
?> 

但是,雖然所有的數據都存在於數據庫中,但什麼都不返回。

還有一個:如果我直接通過$in_statement查詢並執行它,數據將被返回。所以問題出現在準備上。

我一直在谷歌尋找這個問題,但它並不成功。我的代碼有什麼問題?
感謝您的幫助!

+3

你不能在你的IN子句中使用單個參數。它需要是: '在哪裏姓氏在(?,?,?,?)' – andrewsi 2012-08-13 17:01:58

+1

好吧,非常感謝!)它似乎有點麻煩。 – kpotehin 2012-08-13 17:04:28

回答

4

我最近爲我的問題找到了解決方案。也許這不是最好的辦法,但它很好!證明我錯了:)

<?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

準備語句是爲了避免究竟你試圖讓它做:)

爲了得到這個工作,你必須申請這一步是什麼:

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

它正確的琴絃映射爲每個$lastnames項目上的數據庫轉義函數。完成後,將該值直接插入查詢中,即不使用綁定參數。

+0

謝謝,傑克,但我找到了通過準備好的語句來做這個查詢的方法。我使用call_user_func_array(數組($ data_res,'bind_param'),$ arParams);而不是常規的bind_param。 $ arParams完全包含變量類型和這些變量) – kpotehin 2012-08-15 10:50:34

+0

剛剛發佈我的代碼作爲答案) – kpotehin 2012-08-15 11:13:18

+2

@ kpotehin當然,如果你真的必須(ab)使用準備好的語句,你當然可以:)親自我看不到好處,除非它必須在一個php執行中運行多次 – 2012-08-15 11:38:29