この投稿の最終編集者は q5975166 2014-07-07 19:49:42 製品をフィルタリングするためのさまざまなオプションをデータベースのフィールドに保存しました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
を取り出す場合、配列
をトラバースします。 -----------------------------
たとえば、製品のオプションの 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."' ";<br /> $dqcp = $Db->FetchAll($strpei);//这是执行sql语句的方法<br /> $strpei.="and id in(";<br /> $strpei2="";<br /> foreach($dqcp as $dkey=>$dvalue){//遍历所有商品<br /> $darr=json_decode(urldecode($dvalue['cp_leibie']),true);//把json数据进行解码<br /> for($i=0;$i<count($peistr)-2;$i++){//把接收到的商品选项的id循环出来<br /> foreach($darr[$peistr[$i]] as $dddkey=>$dddvalue){//把解码后的数据进行遍历,键名是接收到的商品选项的id<br /> if($liestr[$i]==$dddvalue){//子选项的id和json数据里的值一致的话,就把该条数据的id加到条件里<br /> $strpei2.=$dvalue['id'].",";<br /> }<br /> }<br /> }<br /> }<br /> <br /> $strpei.=$strpei2.")";
ログイン後にコピー
条件が満たされる場合、対応する製品の ID を条件の in 構文に書き込みます。
209の小項目をクリックすると、ID1と3のIDが条件に追加されます
問題は、初回受信はOKですが、201をクリックすると、 2回目以降は条件を満たしていないはずですが、3つのIDのデータが表示されます。
ループ内のif判定が正しく書かれていないはずなのですが、条件の書き方が分かりません。または、他の場所から入手して問題を解決することもできます
-----解決策--------------------------- -----
少し変更したと判断します
if($liestr[$i]==$dddvalue){<br /> $strpei2.=$dvalue['id'].",";<br />}
ログイン後にコピー
<br />$where.="$liestr[$i]==$dddvalue &&";<br /> if($i==(count($peistr)-2)){<br /> $where= substr($where,0,-2);<br /> }<br /> if($where){<br /> $strpei2.=$dvalue['id'].",";<br /> }<br />
ログイン後にコピー
ただし、この場合、$where は判定対象の文字列ですもしの場合。 $whereが何であっても判定処理はできません。これは単なるアイデアです。見てください