2015-11-19 131 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

但它不支持数组? –