商品をフィルタリングするためのさまざまなオプションをデータベース (cp_leibie) のフィールドに json 形式で保存します
たとえば、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の場合
取り出し時に配列をトラバースします
---------------------------- ----- ----------------------------------
例えば、製品のオプションの 1 つは (適用環境: すべての Office モダン ヨーロピアン スタイル)
$peistr は「適用環境」の ID、$liest は後続のサブオプションの ID です
具体的な方法は掲載しません。
以下の for ループで 2 が減算される理由を考える必要はありません。
以下は、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 これを印刷して見てもらえますか?
还有一个想法是 接收第一次时,符合条件的产品的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了。