PHP - 在foreach循环中向SQL语句添加新的WHERE子句

时间:2017-11-20 09:44:42

标签: php sql ajax foreach where

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

的JavaScript

$referred = $_GET['referredby'];

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

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);
    }
}

包含foreach循环的PHP函数

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

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

PHP函数中的'echo'正在运行,但是var_dump()正在变为'NULL',这意味着SQL语句中的某个地方出现了错误。

非常感谢任何帮助。谢谢!

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您的查询看起来像

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

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

答案 2 :(得分:0)

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

使用"选择* FROM抵押品,其中供应商在(1,2,3)"相反,

答案 3 :(得分:0)

问题:

  1. 您正在使用vendor = item1 OR vendor = item2 OR(请注意挂起的OR)
  2. 使用IN可获得相同的结果
  3. 你应该使用预备陈述
  4. 这样做:

    $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 < / p>