$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更好的方法。
我该怎么做?
答案 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
的调用。)
或者,您可以使用PDO的prepare
和execute
方法:
$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);
(当然,此解决方案忽略了如何构建查询的其余部分,因为您没有在问题中提供它,因此您也希望参数化其他部分。)