我把筛选商品的各个选项以json的形式存入数据库的一个字段(cp_leibie)
比如我存了3条
他们的选项就是
{"208":["209"],"5":["182"],"6":["30"],"27":["36"],"28":["34"]} 假如该条数据id为1
{"92":["201","202","204"],"93":["137","138","139"],"94":["143","144"]}假如该条数据id为2
{"208":["209"],"5":["182"],"6":["29"],"27":["35"],"28":["33"]}假如该条数据id为3
取出的时候以数组遍历
-----------------------------------------------------------------
比如商品中其中一个选项是 (适用环境: 全部 办公室 现代 欧式 )
那么$peistr是“适用环境”的id,$liestr是后面的子选项的id,
具体怎么接收的就不贴出来了,
下面for循环里为什么减二也不用考虑了。
下面是ajax提交过去的查询语句:
$strpei="select `id`,`name`,`huiyuanjia`,`cpimg`,`shichangjia`,cp_leibie from `".$db_prefix."chanpin` where `ifxianshi`=1 and `cpfl`='".$sid."' "; $dqcp = $Db->FetchAll($strpei);//这是执行sql语句的方法 $strpei.="and id in("; $strpei2=""; foreach($dqcp as $dkey=>$dvalue){//遍历所有商品 $darr=json_decode(urldecode($dvalue['cp_leibie']),true);//把json数据进行解码 for($i=0;$i<count($peistr)-2;$i++){//把接收到的商品选项的id循环出来 foreach($darr[$peistr[$i]] as $dddkey=>$dddvalue){//把解码后的数据进行遍历,键名是接收到的商品选项的id if($liestr[$i]==$dddvalue){//子选项的id和json数据里的值一致的话,就把该条数据的id加到条件里 $strpei2.=$dvalue['id'].","; } } } } $strpei.=$strpei2.")";
$peistr 這個可以打印出來看看嗎?
$peistr 這個可以打印出來看看嗎?
$peistr 這個可以打印出來看看嗎?
奇怪定位数据组织形式,奇怪的查询构造方式
奇怪定位数据组织形式,奇怪的查询构造方式
我想到了一个思路,就是$peistr 的数组接收第一次时,只有一个索引有值。接收第二次时,有两个索引有值。那么就可以判断第一次接收的时候,就判断这一个值。第二次接收的时候,就同时判断两个值。以此类推。但是具体怎么写还没想出来
还有一个想法是 接收第一次时,符合条件的产品的id就会加入条件里。接收第二次时,如果在原来的id里有的话,也就是增加了的话。那么就把该条ID加入条件里
我把判断改了一下
if($liestr[$i]==$dddvalue){ $strpei2.=$dvalue['id'].",";}
$where.="$liestr[$i]==$dddvalue &&"; if($i==(count($peistr)-2)){ $where= substr($where,0,-2); } if($where){ $strpei2.=$dvalue['id'].","; }
我把判断改了一下
if($liestr[$i]==$dddvalue){ $strpei2.=$dvalue['id'].",";}
$where.="$liestr[$i]==$dddvalue &&"; if($i==(count($peistr)-2)){ $where= substr($where,0,-2); } if($where){ $strpei2.=$dvalue['id'].","; }
我又想到了一个方法,把子项的id放到一个字段里,用FIND_IN_SET来查询,每查询一次后面就加上 and FIND_IN_SET ,把接收到的子项id在字段里查询,这样就OK了。