mysql其中column =所有可能的值

时间:2015-11-19 18:13:39

标签: php 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 ?, ?'))

但我不想在prepare()内打印,所以我问是否有任何方法可以使用bind_param()并声明默认值。

1 个答案:

答案 0 :(得分: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();