我想在MySQL中创建一个具有可选值的查询。指定值时,将使用该值过滤查询,此时值不是返回所有行。这是个主意:
public function doQuery($item = 'ANY_VALUE') {
$query = "SELECT * FROM table WHERE item = ?";
db->fetchAll($query,array($item))
...
}
doQuery(); // Returns everything
doQuery($item='item1'); // Returns only rows where item = 'item1'
是否有一种简单的方法可以在不创建两个查询字符串的情况下执行此操作,具体取决于$ item的值?
答案 0 :(得分:19)
据我所知,没有这样的“任何”占位符。
如果你可以使用LIKE,你可以
SELECT * FROM table WHERE item LIKE '%'
如果您可以附加条件,则可以使item
子句无效,如下所示:
SELECT * FROM table WHERE item = ? OR 1=1
(但在你的例子中不起作用,因为你将“item”作为参数传递)
这是我能看到的所有选项 - 最简单的方法是使用两个查询,在第二个查询中完全删除WHERE
子句。
这可能会奏效,但从数据库的角度来看,我不确定这是不是一个好主意。
public function doQuery($item = 'ANY_VALUE') {
$query = "SELECT * FROM table WHERE item = ? OR 1 = ?";
db->fetchAll($query,array($item, ($item == 'ANY_VALUE' ? 1 : 0))
...
}
答案 1 :(得分:3)
更好的方法是首先从您需要打扰的参数生成sql查询,然后执行。
function doQuery($params) {
$query = 'SELECT * FROM mytable ';
if (is_array($params) // or whatever your condition ) {
$query .= 'WHERE item = ' . $params[0];
}
$query .= ' ;';
// execute generated query
execute($query);
}
答案 2 :(得分:0)
不给出不同的查询字符串就无法获得不同的结果。
使用$q = "... WHERE item = '$item'"
确实会根据$ item的值创建不同的查询字符串,因此与使用没有什么不同
$q = "..." . ($item=='ANY_VALUE' ? something : s_th_else);
。
说我看到了两个或三个选项:
function doQuery($item = "%") { $query = "SELECT ... WHERE item LIKE '$item'"; ...}
function doQuery($item = NULL) { $query = "SELECT ..."; if ($item !== NULL) $query .= " WHERE item = '$item' "; ...}
(在这里我使用NULL来允许任何其他字符串或数值作为有效的“非空”参数;如果您还希望允许搜索NULL(不带引号),则必须选择另一个“不可能”的默认值,例如[]
,无论如何,您都必须使用不带单引号的独特查询,但是在一般情况下这非常重要),甚至:function doQuery($item = NULL) { if($item === NULL) $query = "SELECT ..."; else $query = "SELECT ... WHERE item = '$item' "; ...}
,它可以输入更多内容,但可能更快,因为它可以避免额外的字符串操作(第一部分和第二部分的串联)。我认为第二个和第三个选项比第一个更好。您应该解释为什么要避免这些更好的解决方案。
PS:请始终注意不要忘记SQL中的引号,甚至要避免在取决于用户输入的参数中正确转义任何特殊字符(引号,...),以避免SQL injections。您可能渴望找到最短的解决方案(就我而言),但是忽略这些方面是不行的:这不是有效的解决方案,因此它不是最短的解决方案!
答案 3 :(得分:-2)
使用一个查询真的没有理由这样做。运行没有WHERE子句的查询会明确表示您要返回所有行。使用WHERE子句运行它会明确表示您要过滤行。