我有一个列名为“类别”的表。在 PHP 中,我使用 sql prepare 语句来选择属于指定类别的所有记录。我用 category=? 然后添加具有类别值的变量。这工作正常。
但是,如何在同一个查询中选择所有类别?
我尝试使用 null 和 '' 作为类别值,但这不起作用。为另一个查询复制整个代码部分可能会创建 spagetti 代码,因此我想知道是否有更好的选择。在那儿?
谢谢!
基于@JamesMarks 提供的内容,使用类似的查询会更简单
$query = "SELECT * FROM table WHERE category = ? OR 1 = ?;"
然后将您的 $category 传递给第一个参数,并将 1 或 0 作为第二个参数。如果通过 1,则第二项变为1 = 1
。这总是正确的,所以整个表达式总是正确的。如果您传递 0,那么第二项是并且始终为假,但只有在匹配1 = 0
时整个表达式才会为真。category = $category
这比为“任何类别”指定特殊值 0 更简单、更好。
另一种解决方案是动态构建查询:
$where = array();
if ($category) {
$where[] = "category = ?";
$params[] = $category;
}
... perhaps add more terms to $where conditionally ...
$query = "SELECT * FROM table";
if ($where) {
$query .= " WHERE " . implode(" AND ", $where);
}
假设您有一个自动生成的 ID(AUTO_INCREMENT 或 IDENTITY,取决于您的数据库引擎),您可以使用类似于以下的 WHERE 子句。
$query = "SELECT * FROM table WHERE category = $category OR $category = 0;"
当您想要“所有类别”时,只需将值 0 传递给您的 $category 变量。
如果您不想传递 $category 的值,而是希望能够传递空白 $category,则可以在构建查询字符串之前将 $category 设置为 0:
$category = ( empty($category) ? "0" : $category ); $query = "SELECT * FROM table WHERE category = $category OR $category = 0;";
...或者您可以在一行上重写,如下所示。
$query = "SELECT * FROM table WHERE category = $category OR" 。(空($category)?“0”:$category)。" = 0;"