情景描述:想做一个有关房产的网页的搜索限定。
前台表单是,多种复选框,checkbox类型的。之间的关系是逻辑or的关系。
比如<input type="checkbox" value="type_id" name="type" />这个是一个房屋类型的设置,对应的value是一个房屋类型的表,如下表名:type
字段1,type_id:1,type_name:多层
字段1,type_id:2,type_name:高层
字段1,type_id:3,type_name:小高层类似上面的条件还有很多比如房屋样式表啊之类的,
当然我还有一个house的主表,因为对应的house_type是checkbox存的,一般都是字符串,eg(1@3),表示这个楼盘包括多层和小高层。那么请问我在做这个查询分类的时候如何写我的sql条件。如何查询有多层或者小高层类型的?
如果是select框的时候,我可以这样写
select * from house where house_type in (1,2)&......这里的(1,2)是我前台勾选的checkbox,而我的存的应该是单一的值,1或者2,不会出现字符串的拼接。现在问题就是house_type是字符串类型的,如何写这样的一个查询条件?sql语句?
前台表单是,多种复选框,checkbox类型的。之间的关系是逻辑or的关系。
比如<input type="checkbox" value="type_id" name="type" />这个是一个房屋类型的设置,对应的value是一个房屋类型的表,如下表名:type
字段1,type_id:1,type_name:多层
字段1,type_id:2,type_name:高层
字段1,type_id:3,type_name:小高层类似上面的条件还有很多比如房屋样式表啊之类的,
当然我还有一个house的主表,因为对应的house_type是checkbox存的,一般都是字符串,eg(1@3),表示这个楼盘包括多层和小高层。那么请问我在做这个查询分类的时候如何写我的sql条件。如何查询有多层或者小高层类型的?
如果是select框的时候,我可以这样写
select * from house where house_type in (1,2)&......这里的(1,2)是我前台勾选的checkbox,而我的存的应该是单一的值,1或者2,不会出现字符串的拼接。现在问题就是house_type是字符串类型的,如何写这样的一个查询条件?sql语句?
<input type="checkbox" value="type_id" name="type" />
改成:
<input type="checkbox" value="type_id1" name="type_id[]" />
<input type="checkbox" value="type_id2" name="type_id[]" />
....
这样post之后传递过来的就是一个数组
$type_id_str='';
$query=" 1 ";
if(!empty($_POST['type_id']))
{
$type_id_str=implode(',',$_POST['type_id']);
$query.=" AND house_type in (".$type_id_str.")";
}
$sql="select * from house where ".$query;
我看懂你的了,你对$_POST[type_id]进行处理,使之和我的house_type类型匹配。然后在用in来进行组合但是你忽略了一个重要的问题,好像。当前台勾选 高层,小高层 的时候,用户希望得到的结果是,具有小高层or(这个or很关键)或者高层的楼盘。反观数据库的设计,如果楼盘A中的house_type是1@2@3,应该在前台用户满足用户勾选(小高层,高层)的这个条件。可是按照你的sql语句,明显,“1@2@3”是不能和“2@3”匹配的,所以查询不到想要的结果。问题主要存在我的这个house_type中。。他是一个字符串怎么办
house_id house_type
1001 1
1001 3
然后select a.house_id,a.house_type,b.house_type from map a left join map b on a.house_id=b.house_id
where a.house_type = 1 and b.house_type = 3
貌似比lz的还麻烦。。
直接定义一个type_id为4的,typename为多层+小高层,不知可行不。
这倒是一个可以解决的方法,可问题是,这样的checkbox,太多,都这样一对多,是不是略显麻烦,house主表,映射表,type信息表
看来还是要用like进行sql中where语句的堆叠了我试下。。
<table>
<tr>
<td>物业类型;</td>
<td><?php foreach ($info_type as $value_type) echo "<input type='checkbox' value='".$value_type[wuyeid]."' name='cb_type[]'>".$value_type[name];?></td>
</tr>
<tr>
<td><input type="submit" name="search" value="search"></td>
</tr>
</table>
</form>
php代码$info_type=$this->house_type->select();
if($_POST[search]){
//var_dump($_POST);
foreach ($_POST[cb_type] as $v_type) $str_type.=$v_type."@";
// var_dump($str_type);
$where.="wuyelx LIKE '%$str_type%'";
//这里显然是不行的,因为"1@2"和"2@3"也是不匹配的。但是按道理,结果应该有这个楼盘的。
$result=$this->house_db->listinfo($where);
// var_dump($result);
//这是在phpcms中改得一部分。
}
include template('house', 'house_search');