PHP:从数组foreach构建查询

时间:2010-10-04 14:29:16

标签: php

$test=$_POST['Cities'];
 foreach ($test as $t){
 $query .= " AND u.bostadsort = \'".$t."\'";
 }

我有我的

<select size="6" name="Cities[]" multiple="multiple">
    <option value="">All</option>
    <option value="1">C1</option>
    <option value="2">C2</option>
    <option value="3">S3</option>
    <option value="4">S4</option>
    <option value="5">S5</option>
</select>

但它根本不对。

我要做的是当你选择城市时(在搜索表单中),它会将所有值放入一个数组中。

现在我想让它像这样写,如果你选择2,4,5

AND u.bostadsort = '2' OR u.bostadsort = '4' OR u.bostadsort = '5'

(也许你可以更容易做到这一点,但这是我所知道的唯一方式,使用“OR”)

所以,如果你选择了超过1,那么它应该是OR,而不是我得到的AND。

也许我是以错误的方式完成的,并且有一种比foreach更好的方法。

我该怎么做?

1 个答案:

答案 0 :(得分:4)

您可以改用IN,这样可以提供多个值:

if (is_array($_POST['Cities']))
{
  // If multiple values were selected, handle them
  $cities = array();
  foreach ($_POST['Cities'] as $city)
  {
    if (!empty($city))
    {
      $cities[] = mysql_real_escape_string($city);
    }
  }
}
elseif (!empty($_POST['Cities']))
{
  // ... or was a single, non-empty value passed in?
  $cities = array(mysql_real_escape_string($_POST['Cities']));
}

if (count($cities))
{
  $query .= " AND u.bostadsort IN ('" . join("', '", $cities) . "')";
}

请注意,在查询中使用它之前,我通过mysql_real_escape_string传递每个值;这样做是为了防止SQL injection。如果您不使用MySQL,则其他RDBMS具有类似的功能。

请参阅http://www.ideone.com/UVXuu以获取示例(ideone似乎没有启用mysql,因此删除了对mysql_real_escape_string的调用。)

或者,您可以使用PDOprepareexecute方法:

$cities = $_POST['Cities'];
if (count($cities))
{
  $query .= " AND u.bostadsort IN (?" . str_repeat(', ?', count($cities) - 1) . ")";
}

// $db is a PDO object
$stmt = $db->prepare($query);
$stmt->execute($cities);

(当然,此解决方案忽略了如何构建查询的其余部分,因为您没有在问题中提供它,因此您也希望参数化其他部分。)