Php MySQL:结合两个重复查询使WHERE子句动态

Php MySQL:结合两个重复查询使WHERE子句动态,php,mysql,sql,pdo,where-clause,Php,Mysql,Sql,Pdo,Where Clause,如何将这两个查询合并为一个查询,这样我就不必一次又一次地重复相同的行了 if(empty($cat_id)) { $sql = " SELECT * FROM root_category_contacts ORDER by cat_order ASC "; $items_category = $connection->fetch_all($sql); } else { $sql = " SELECT * FROM r

如何将这两个查询合并为一个查询,这样我就不必一次又一次地重复相同的行了

if(empty($cat_id))
{
    $sql = "
    SELECT *
    FROM root_category_contacts
    ORDER by cat_order ASC
    ";

    $items_category = $connection->fetch_all($sql);
}
else
{
    $sql = "
    SELECT *
    FROM root_category_contacts
    WHERE root_category_contacts.cat_id != ?
    ORDER by cat_order ASC
    ";

    $items_category = $connection->fetch_all($sql,array($cat_id));
}
当我没有
cat\u id
时,我不需要
WHERE
子句


是否可行?

测试是否可行?为null或等于cat_id。类似于:

根据xdazz的评论进行编辑。假设cat_id>0

$sql = "
SELECT *
FROM root_category_contacts
WHERE root_category_contacts.cat_id != ?
ORDER by cat_order ASC"

if(empty($cat_id)) {
    $cat_id = 0;
}

$items_category = $connection->fetch_all($sql,array($cat_id));

你为什么要一次又一次地重复这些台词?你是说有很多类似的查询存在这个问题,还是说只有一个重复?这会导致错误
#1064-你的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,了解在“==NULL或root\u category\u members.cat\u id!=”附近使用的正确语法第3行的“订单A”应该是
空的
不是
==NULL
:-)现在已修复。明白了!谢谢我可以问一下-这是什么意思
在哪里?是否为空
?当
cat\u id
不为空时,占位符将替换为一个数字。例如,
其中'2'为空
-那么这意味着什么?我不太明白…如果cat_id=2。然后2不为null,因此它将检查OR语句的另一半(
root\u category\u contacts.cat\u id!=2
),如果这是真的,那么它将返回该行。您可能需要稍微调整查询以获得正确的结果。我用这个答案得到了我想要的结果。不需要其他调整。我只是想理解你答案中的疑问。谢谢如果您这样使用动态sql,您将失去他的方法(缓存查询计划、sql注入的保护)的好处。您完全正确。我想得太晚了。(但令我惊讶的是,mysql计划仍然无法缓存包含变量“strings”的查询)。然而,对于sql注入,您的200%正确。
if(empty($cat_id)) $where = "";
else $where = "WHERE root_category_contacts.cat_id != '$cat_id'"

$sql = "
    SELECT *
    FROM root_category_contacts
    $where
    ORDER by cat_order ASC
    ";

$items_category = $connection->fetch_all($sql);