Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:使用IF语句生成SQL很困难_Php_Mysql_If Statement_Mysqli - Fatal编程技术网

PHP:使用IF语句生成SQL很困难

PHP:使用IF语句生成SQL很困难,php,mysql,if-statement,mysqli,Php,Mysql,If Statement,Mysqli,我在使用IF语句“选择”一些要运行的MySQL代码时遇到了问题。这是我的密码: if ($numRows == 0 && count($terms) == 3) { $query2 .= " AND ( i.ING = '" . join("' OR i.ING = '", $terms) . "')". $queryType ." GROUP BY r.recipeID HAVING COUNT(DISTINCT i.ING ) = 2)"; $term

我在使用IF语句“选择”一些要运行的MySQL代码时遇到了问题。这是我的密码:

if ($numRows == 0 && count($terms) == 3) {
    $query2 .= " AND ( i.ING = '" . join("' OR i.ING = '", $terms) . "')". $queryType ." GROUP BY r.recipeID
    HAVING COUNT(DISTINCT i.ING ) = 2)";
    $termCount = 2;

}

if ($numRows == 0 && $termCount == 2) {
    $query2 .= " AND ( i.ING = '" . join("' OR i.ING = '", $terms) . "')". $queryType ." GROUP BY r.recipeID
HAVING COUNT(DISTINCT i.ING ) = 1)";
这将产生:

    AND ( i.ING = 'wonton wrappers' OR i.ING = 'grape jelly' OR i.ING = 'lard') GROUP BY r.recipeID HAVING COUNT(DISTINCT i.ING ) = 2) 
AND ( i.ING = 'wonton wrappers' OR i.ING = 'grape jelly' OR i.ING = 'lard') GROUP BY r.recipeID HAVING COUNT(DISTINCT i.ING ) = 1)
然而,我只希望第二行是我将要使用的查询的一部分;但是因为第一个if语句也总是true,所以它也输出该行

因此,我想根据这两种说法得出的结果是:

AND ( i.ING = 'wonton wrappers' OR i.ING = 'grape jelly' OR i.ING = 'lard') GROUP BY r.recipeID HAVING COUNT(DISTINCT i.ING ) = 1)
这可能是因为我已经看了太久,没有注意到这是否是我忽略的最简单的事情

有什么想法吗


谢谢。

在您的第一次IF声明中;如果为真(并且输入该语句),则将$termCount设置为2。第二个IF语句依赖于$termCount==2。所以现在如果$numRows是0,那么这两条语句都将始终为真。找到另一种方法来触发第二个IF语句;或者简单地从第一个IF语句中删除$termCount=2

假设这是唯一有效的代码,我认为最好的办法是简单地将
IF($numRows==0&&$termCount==2)
替换为
elseif($numRows==0&$termCount==2)
。(基本上,将其设置为else-if子句以排除重复的可能性)

使用if-else,并形成您的语句,使查询只在逻辑上应该分配给$query的地方进行分配。

我建议如下拆分逻辑:

if ($numRows == 0) {
  $query2 .= " AND ( i.ING = '" . join("' OR i.ING = '", $terms) . "')$queryType GROUP BY r.recipeID";

  $query2 .= " HAVING COUNT(DISTINCT i.ING) = " . (count($terms) == 3 ? 2 : 1);
}

利用分支基本相同这一事实。

我注意到在
if
语句中,第一次使用
count($terms)
,第二次使用
$termcCount
,也许可以尝试将它们更改为相同的值?在分配
$termCount=2时,很明显会得到这个输出
在第一个条件中,并在第二个条件中检查相同项,这将始终为真。为什么
term_count
设置为2?这不是对您的问题的回答,但您可以将sql中的或部分简化为:
输入('wonton wrappers'、'grape jelly'、'lard')