【问题标题】:PHP - add new WHERE clause to SQL statement within foreach loopPHP - 在 foreach 循环中向 SQL 语句添加新的 WHERE 子句
【发布时间】:2018-05-03 11:52:44
【问题描述】:

我有一个复选框过滤器,可以“选中”多个选项。一旦它们被检查,它们就会存储在一个 JavaScript 数组中,并通过 ajax 传递给 php 文件。从那里,我尝试执行一个 foreach 循环来获取数组中的每个元素,并为每个元素的 SQL 语句添加一个新的 where 条件,然后运行查询。

JavaScript

var vendors = [];

function filterResults($this)
{
  var vendor = $($this).attr('data-id');
  if($($this).prop('checked'))
  {
    var action = 'add';
    vendors.push(vendor);
  }
  else
  {
    var action = 'remove';
    var index = vendors.indexOf(vendor);
    if(index >= 0)
    {
        vendors.splice(index, 1);
    }
}

运行的 PHP 脚本 (filter-results.php)

if(is_array($_POST['vendors']))
{
   $collaterals = $vendor->updateResults($_POST['vendors']);
   var_dump($collaterals);

   foreach($collaterals as $col)
   {
     include '../parts/item.php';
   }
}

包含 foreach 循环的 PHP 函数

public function updateResults($vendors)
{
    try
    {   
        $items = array();
        $sql = "SELECT * FROM collaterals WHERE ";
        foreach ($vendors as $ven)
        {
            echo $ven;
            $sql .= "vendor = ".$ven." OR ";
        }

        $stmt = $this->db->prepare($sql);
        $stmt->execute();

        while($row = $stmt->fetchObject())
        {
            $items[] = $row;
        }

        return $items;

    }
    catch(Exception $e)
    {
        $e->getMessage();
    }
}

PHP 函数中的“echo”正常工作,但 var_dump() 变为“NULL”,这意味着 SQL 语句中某处存在错误。

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: php sql ajax foreach where


    【解决方案1】:

    您可以在没有foreach 循环的情况下运行此查询,如下所示

     $sql = "SELECT * FROM collaterals WHERE vendor IN ('".implode("','",$vendors)."')";
    

    【讨论】:

    • 非常感谢。所有答案都非常有帮助!
    【解决方案2】:

    您的查询看起来像

    SELECT * FROM collaterals WHERE vendor = x OR vendor = x OR
    

    您必须删除最后一个 OR。 另外我建议使用带有 implode() php 函数的 IN 子句。

    【讨论】:

      【解决方案3】:

      它将产生“SELECT * FROM 抵押品 WHERE vendor = 1 OR vendor = 2 OR”

      改用“Select * FROMlaterals where vendor in(1,2,3)”,

      【讨论】:

        【解决方案4】:

        问题:

        1. 您正在使用vendor = item1 OR vendor = item2 OR(注意挂起的 OR)
        2. 使用IN可以达到同样的效果
        3. 您应该使用准备好的语句

        这样做:

        $items = array();
        $sql = "SELECT * FROM collaterals WHERE vendor IN (".
             implode(",",array_fill(0, count($vendors), "?")) 
        .")";
        // $sql would look like e.g. SELECT * FROM collaterals WHERE vendor IN (?,?,?)
        $stmt = $this->db->prepare($sql);
        $stmt->execute($vendors);
        

        注意:所有$vendors在上述代码中都将被视为字符串,如果您需要将它们绑定为不同的类型,您应该在每个数组条目上调用bindParambindValue

        【讨论】:

          猜你喜欢
          • 2017-05-22
          • 1970-01-01
          • 1970-01-01
          • 2014-10-14
          • 1970-01-01
          • 1970-01-01
          • 2019-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多