2015-11-19 83 views
-1

有什麼辦法可以做到這樣的事情嗎?給$變量一個默認值以使mysql返回所有行?mysql其中列=所有可能的值

SELECT * FROM table WHERE column = ?; 

bind_param('i', $variable); 

它並不像愚蠢的,因爲它的聲音...我需要根據用戶輸入過濾內容,所以如果用戶不填寫輸入/選擇值將ALL(或正確答案)。我不想在prepare()內打印php變量,或者將默認變量設置爲所有可能的值。什麼是正確的方法來做到這一點?

我其實這樣做:

if ($stmt = $mysqli->prepare(' SELECT t1.id, t2.* 
           FROM ' . $table . ' t1 
           INNER JOIN property t2 ON t2.id = t1.id 
           WHERE t2.use = ? 
           ' . $city_cond 
           . $zone_cond . ' 
           LIMIT ?, ?')) 

但是,如果有任何方法與bind_param()和聲明的默認值做到這一點我不希望打印內部prepare()所以我問。

+1

'SELECT * FROM table',它選擇所有列已經 – Andrew

+0

爲什麼不直接使用'SELECT * FROM table'? –

+0

很抱歉,如果解釋不清楚。 bind_param中的變量將包含要過濾的值,但如果用戶沒有填充輸入,變量將具有默認值。 –

回答

2

我使用這樣類似的問題:

$sql = 'SELECT * FROM table WHERE cond1 = ?'; 
$sqlparams = array('cond1'); 
if (!empty($column) && $column != 'ALL') { 
    $sql .= ' AND column = ?'; 
    $sqlparams[] = $column; 
} 
// add more conditions, ORDER BY, LIMIT etc. 
$stmt = $dbh->prepare($sql); 
$stmt->execute($sqlparams); 

差異與mysqli的(未經測試):

- $sqlparams[] = $column; 
+ $sqlparams[] = array('s', $column); 
--- 
-$stmt->execute($sqlparams); 
+foreach ($sqlparams as $sqlparam) { 
+ $stmt->bind_param($sqlparam[0], $sqlparam[1]); 
+} 
+$stmt->execute(); 

也許這可以用命名參數來完成,並始終綁定,需要與否。

另一種方法:

$sql = 'SELECT * FROM table WHERE cond1 = ? AND (1 = ? OR column = ?)'; 
$stmt = $dbh->prepare($sql); 
$stmt->bind_param('i', (empty($column) ? 1 : 0)); 
$stmt->bind_param('s', $column); 
$stmt->execute(); 
+0

您是否正在使用PDO?我不認爲我可以用mysqli做到這一點。 –

+0

@ChazyChaz mysqli支持準備語句 –

+0

但它不支持數組? –

相關問題