2012-08-30 135 views
3

我使用php + mysql的,我有這樣的表DB:傳遞PHP assoc命令數組鍵和值到MySQL SELECT語句

col1-col2-col3 
A - val1 - str1 
A - val2 - str2 
A - val3 - str3 
B - val4 - str4 
B - val5 - str5 
... 

而且還PHP assoc命令陣列:

$arr = array('A'=>'value1','B'=>'value2', ...); 

然後,我將這個數組傳遞給MySql字符串中的佔位符來完成SELECT語句。

如何選擇第3列的值,其中第1列的值等於數組的鍵和第2列的值分別小於數組值?也許使用某種方式GROUP與兩個選擇,並將它們連接在一起...

結果應該只是滿足要求的所有列3值的列表。

它可以通過某事像這樣做:

$aReturn = array(); 
$sql = "SELECT col3 FROM MyTab WHERE col1 = ? AND col2 < ?d"; 
foreach ($arr as $k=>$v) { 
    $aReturn = array_merge($aReturn, $this->select($sql, $k, $v)); 
} 

如果選擇是方法,這使得選擇DB和返回值的列表最後一列的值,那麼我們就添加列表導致$ aReturn。但在這種情況下,它會查詢幾次, 但有沒有辦法如何做到這一點在之一 SELECT?

+1

...結果應該是這樣的:什麼? – GolezTrol

+0

只是最後一列的值... – NGix

+1

你想如何檢查'val1'是否小於'value1'?兩者都是字符串... – GolezTrol

回答

3

我不認爲這可以用佔位符來完成,因爲查詢的結構不固定 - 在WHERE子句中需要儘可能多的條件,因爲在數組中有元素。以下是未經測試的代碼:

更新:採用事先準備好的聲明

$wheres = array(); 
$types = ''; 
$col1s = array(); 
$params = array(null, null); 
$i = 0; 
foreach ($assoc as $key => $val) { 
    $wheres[] = '(col1 = ? AND col2 < ?)'; 
    $types .= 'ss'; 
    $col1s[$i] = $key; 
    $params[] = &$col1s[$i]; 
    $params[] = &$assoc[$key]; 
    $i++; 
} 
$whereclause = implode(' OR ', $wheres); 
$sql = "SELECT * FROM my_table WHERE $whereclause"; 
$stmt = mysqli_prepare($link, $sql); 
$params[0] = $stmt; 
$params[1] = $types; 
call_user_func_array('mysqli_stmt_bind_params', $params); 
mysqli_stmt_execute($stmt); 
+0

它可以用佔位符完成,沒有理由使用'mysqli_real_escape_string'。你只需要有條件地綁定不同的變量,或者作爲替代,有兩個不同版本的prepare/bind/execute週期。如果你嘗試這樣做,你會陷入困境。 – tadman

+1

你是對的,看到更新的答案。 – Barmar

+0

這看起來好多了。 – tadman