ajax商品筛选功能如何进行判断

WBOY
Release: 2016-06-23 13:06:10
Original
1202 people have browsed it

我把筛选商品的各个选项以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.")";
Copy after login

符合条件的就把对应的商品的id写到条件的in语法里。
假如点击了209的子项,那么id为1和3的id就会加入条件里
问题是接收第一次没问题,当接收第二次的时点击201,应该没有符合条件的数据,但是3个ID的数据他都显示了出来。
应该是循环里的if判断没有写对,不知条件该如何写。或者在其他地方入手能解决


回复讨论(解决方案)

$peistr 這個可以打印出來看看嗎?

$peistr 這個可以打印出來看看嗎?


如果选择了 209的子项
打印$peistr的结果
Array (
[0] => 208
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
)
打印$liestr的结果
Array (
[0] => 209
[1] =>
[2] =>
[3] =>
[4] =>
[5] =>
[6] =>
)
选择了 209的子项之后,再选择30的子项
打印$peistr的结果
Array (
[0] => 208
[1] =>
[2] => 6
[3] =>
[4] =>
[5] =>
[6] =>
)
打印$liestr的结果
Array (
[0] => 209
[1] =>
[2] => 30
[3] =>
[4] =>
[5] =>
[6] =>
)
数组里最后两个,也就是键名是5,6的,是没用的,也就是为什么在for循环里要减2。其实商品筛选里只有5个选项,下面再分子项。

按我这么来选的话符合条件的应该只有id为3的。
我上面写的这个条件
if($liestr[$i]==$dddvalue){/
$strpei2.=$dvalue['id'].",";
}
是把所有的符合条件的都算了进去
也就是208的子项,id为1也有,id为3的也有。所有他把这两个id的数据都查了出来

$peistr 這個可以打印出來看看嗎?



最后一句是“所以他把这两个id的数据都查了出来”

奇怪定位数据组织形式,奇怪的查询构造方式

奇怪定位数据组织形式,奇怪的查询构造方式


这也是一种思路。每个栏目的每个选项的个数都不一样,不能把每个都建一个字段

我想到了一个思路,就是$peistr 的数组接收第一次时,只有一个索引有值。接收第二次时,有两个索引有值。那么就可以判断第一次接收的时候,就判断这一个值。第二次接收的时候,就同时判断两个值。以此类推。但是具体怎么写还没想出来

还有一个想法是 接收第一次时,符合条件的产品的id就会加入条件里。接收第二次时,如果在原来的id里有的话,也就是增加了的话。那么就把该条ID加入条件里

我把判断改了一下

if($liestr[$i]==$dddvalue){ $strpei2.=$dvalue['id'].",";} 
Copy after login
Copy after login


$where.="$liestr[$i]==$dddvalue &&";	if($i==(count($peistr)-2)){		$where= substr($where,0,-2);	}	if($where){		$strpei2.=$dvalue['id'].",";	}
Copy after login
Copy after login

但是这样的话,$where他是一个字符串来放到if里判断的。不能进行判断处理 无论是什么$where都是1。这只是一个思路,你看看吧

我把判断改了一下

if($liestr[$i]==$dddvalue){ $strpei2.=$dvalue['id'].",";} 
Copy after login
Copy after login


$where.="$liestr[$i]==$dddvalue &&";	if($i==(count($peistr)-2)){		$where= substr($where,0,-2);	}	if($where){		$strpei2.=$dvalue['id'].",";	}
Copy after login
Copy after login

但是这样的话,$where他是一个字符串来放到if里判断的。不能进行判断处理  无论是什么$where都是1。这只是一个思路,你看看吧


没错,因为他是以字符串形式连接的,if判断字符串结果就是1。这个方法恐怕行不通

我又想到了一个方法,把子项的id放到一个字段里,用FIND_IN_SET来查询,每查询一次后面就加上 and  FIND_IN_SET ,把接收到的子项id在字段里查询,这样就OK了。

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template