PHP的动作非常灵活

PHP的动作非常灵活,php,mysql,sql,iteration,Php,Mysql,Sql,Iteration,好吧,我真的不知道标题是什么,因为对我来说,这里应该没有问题 我正在尝试构建一个SQL查询,唯一的方法是在第一个ID=之后添加一个或多个字符串 因为我不能在中间的ID=X上有一个OR语句,我想我应该做一个简单的事情,只计算到1,然后在1之后的每一次迭代中,简单地把“OR”放在下一个数字之前 这在第二次迭代中效果很好,但在第三次和第四次迭代中,它跳过了数字之间的相加,因此它变成了ID=123或56 43 12 代码是一个更大事物的一部分,因此最后一个}之前的}是anotehr循环的结束

好吧,我真的不知道标题是什么,因为对我来说,这里应该没有问题

我正在尝试构建一个SQL查询,唯一的方法是在第一个ID=之后添加一个或多个字符串

因为我不能在中间的ID=X上有一个OR语句,我想我应该做一个简单的事情,只计算到1,然后在1之后的每一次迭代中,简单地把“OR”放在下一个数字之前

这在第二次迭代中效果很好,但在第三次和第四次迭代中,它跳过了数字之间的相加,因此它变成了ID=123或56 43 12

代码是一个更大事物的一部分,因此最后一个}之前的}是anotehr循环的结束

       $count=0;
      while($resultArr = $result->fetch_array(MYSQLI_NUM)){
          if($count>=1)
          {
              echo "IN COUNT IF<br>";
              $sqlQuery .= " OR ";
          }
          else  $count++;
          echo "COUNT= ". $count . "<br>";
          $sqlQuery .= " {$resultArr[0]} ";
          if (!$result) {
              die('Contact Admin! Invalid SQL query: ' . mysql_error());
          }
      }
   }
   # lägg till sista biten och kolla hur det ska sorteras
   $sqlQuery .= "AND post_status='publish' " . $this->returnSort();
   echo "DEBUG- buildKategoryQuery QUERY= <br>{$sqlQuery}<br>";
   return $sqlQuery;

我相信你想说的是

从id=159或595或187的表中选择*无效SQL;相反,它应该是
从id=159或id=595或id=187的表中选择*


一个较短的语法是使用
IN
操作符:
SELECT*FROM table WHERE id IN(159595187)
我相信您想说的是

从id=159或595或187的表中选择*无效SQL;相反,它应该是
从id=159或id=595或id=187的表中选择*

较短的语法是使用
中的
运算符:
SELECT*FROM table WHERE id IN(159595187)
添加“或”的更简单方法是使用数组:

$parts = array();
while($resultArr = $result->fetch_array(MYSQLI_NUM)) { 
    $parts[] = $resultArr[0];
}

if( !empty( $parts ) ) {
    $sqlQuery .= "(" . implode( " OR ", $parts ) . ")";
}
希望这有帮助

编辑: 关于循环不能按预期工作的原因:您只在else情况下增加$count,而不是在大多数迭代结束的if情况下增加$count…

添加“OR”的更简单方法是使用数组:

$parts = array();
while($resultArr = $result->fetch_array(MYSQLI_NUM)) { 
    $parts[] = $resultArr[0];
}

if( !empty( $parts ) ) {
    $sqlQuery .= "(" . implode( " OR ", $parts ) . ")";
}
希望这有帮助

编辑:
关于循环无法按预期工作的原因:您仅在else情况下增加$count,而不是在大多数迭代结束的if情况下…

在foreach循环的每次迭代期间运行,
$count
也会重置为0。当您试图添加到外部查询并依赖该
$count
变量来确定是否向WHERE子句添加“或”时,这是有问题的

您可以将所有内容组合到一个查询中,而不是运行多个SQL查询:

<?php

function buildKategoryQuery()
{
    // Get valid categories (where the key exists in $this->kategoriArr)  
    $categories = array_filter($this->catMap, function ($value, $key) {
        return $this->kategoriArr[$key];
    }, ARRAY_FILTER_USE_BOTH);

    $sql_category_list = implode(', ', array_unique(array_values($categories))) . ')';
    $sql_sort = $this->returnSort();

    $sqlQuery = <<<SQL
SELECT post_title, guid, post_date, comment_count 
FROM wp_posts 
WHERE ID IN (
    SELECT object_id FROM wp_term_relationships
    WHERE term_taxonomy_id IN ({$sql_category_list})
)
    AND post_status = 'publish' 
{$sql_sort}
SQL;

    return $sqlQuery;
}

$katCommand
在foreach循环的每次迭代期间运行,
$count
也会重置为0。当您试图添加到外部查询并依赖该
$count
变量来确定是否向WHERE子句添加“或”时,这是有问题的

您可以将所有内容组合到一个查询中,而不是运行多个SQL查询:

<?php

function buildKategoryQuery()
{
    // Get valid categories (where the key exists in $this->kategoriArr)  
    $categories = array_filter($this->catMap, function ($value, $key) {
        return $this->kategoriArr[$key];
    }, ARRAY_FILTER_USE_BOTH);

    $sql_category_list = implode(', ', array_unique(array_values($categories))) . ')';
    $sql_sort = $this->returnSort();

    $sqlQuery = <<<SQL
SELECT post_title, guid, post_date, comment_count 
FROM wp_posts 
WHERE ID IN (
    SELECT object_id FROM wp_term_relationships
    WHERE term_taxonomy_id IN ({$sql_category_list})
)
    AND post_status = 'publish' 
{$sql_sort}
SQL;

    return $sqlQuery;
}


我想这会有帮助,但它是否会跳过我的if/else语句第三次迭代?No SELECT*FROM table,其中id=159或595或187不是无效的。对我有用。它本身可能不是无效的,但它不会返回你想要的。为了突出这个问题,您是否只得到行id仅为159、595或187的结果?在
中,其中id=159或595
595
作为布尔表达式计算,它返回true,因为它不是
0
,所以您不会得到错误。。。和所有的行。我想这会有帮助,但wtf会跳过我的if/else语句吗?No SELECT*FROM table,其中id=159、595或187不是无效的。对我有用。它本身可能不是无效的,但它不会返回你想要的。为了突出这个问题,您是否只得到行id仅为159、595或187的结果?在
中,其中id=159或595
595
作为布尔表达式计算,它返回true,因为它不是
0
,所以您不会得到错误。。。和所有行。您介意再添加一点代码吗(特别是,在您将
$count
设置为0的位置上方的几行?还有,为什么在
$count
为0时只增加
$count
?为什么不删除else子句,只需执行
echo“count=”。++$count。“
”
相反?我同意@ChrisForrence,您的
$result
似乎没有给出任何结果,它在外循环中循环,因为我只需要增加它一次,之后每次迭代我都需要在查询中使用OR。因此我需要增加它或将其添加到查询中。在
SELECT object\u id FROM
w中返回多少行p_term_relationships`WHERE term_taxonomy_id=0`?您是否介意再添加一点代码(具体地说,在您将
$count
设置为0的位置上方的几行代码?另外,当
$count
为0时,为什么只增加
$count
?为什么不删除else子句并简单地执行
echo“count=“.+$count.”
“
相反?我同意@ChrisForrence,您的
$result
似乎没有给出任何结果,它在外循环中循环,因为我只需要增加它一次,之后每次迭代我都需要在查询中使用OR。因此我需要增加它或将其添加到查询中。在
SELECT object\u id FROM
w中返回多少行p\u term\u relationships`WHERE term\u taxonomy\u id=0`?@odepax的答案基本上是正确的。我的答案可以帮助您为将来编写PHP代码,但真正的问题是SQL语句本身。您应该接受他的答案为正确答案。@odepax的答案基本上是正确的。我的答案可以帮助您为fu编写PHP代码没错,但真正的问题是SQL语句本身。你应该接受他的答案是正确的。