热搜:NVER node 开发 php

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

2024-07-20 16:30:01
ajax商品筛选功能如何进行判断

我把筛选商品的各个选项以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$dddvalue){//把解码后的数据进行遍历,键名是接收到的商品选项的id						if($liestr[$i]==$dddvalue){//子选项的id和json数据里的值一致的话,就把该条数据的id加到条件里							$strpei2.=$dvalue['id'].",";						}					}				}		}				$strpei.=$strpei2.")";

符合条件的就把对应的商品的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'].",";} 


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

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

我把判断改了一下

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'].",";	}

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


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

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