Ajaxプロダクトフィルタリング機能の判定方法

WBOY
リリース: 2016-06-23 13:06:10
オリジナル
1202 人が閲覧しました

商品をフィルタリングするためのさまざまなオプションをデータベース (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.")";
ログイン後にコピー

条件が満たされる場合、対応する製品の ID を条件の in 構文に書き込みます。
209のサブ項目をクリックすると、ID1と3のIDが条件に追加されます
問題は、初回受信時は問題ないのですが、2回目受信時に201をクリックすると、条件に合うデータはないはずですが、3つのIDのデータが表示されました。
ループ内のif判定が正しく書かれていないはずで、条件の書き方がわかりません。あるいは、他の場所で解決できます


ディスカッション (解決策) に返信

$peistr これを印刷して見てもらえますか?

$peistr これを印刷して見てもらえますか?


209のサブ項目が選択されている場合
$peistr の結果を出力
Array (
[0] => 208
[1] =>
[2] =>
[3] =>
[4] =>
[5] => ;
[3] =>
[4] =>
配列 (
[0] => 208
[1] ] =>[2] =>6
[4] =>
[6] =>
)配列 (
[0] => 209
[1] =>
[2] => 30
[3] =>
[4 ] =>
[5] =>
[6] =>
)
配列の最後の 2 つ、つまりキー名 5 と 6 は役に立たないため、for ループで 2 を引いた値が使用されます。実際、製品フィルターには 5 つのオプションしかなく、サブ項目は以下にリストされています。

私のやり方で選ぶと条件を満たすのはID3のものだけになります。
上で書いた条件
if($liest[$i]==$dddvalue){/
$strpei2.=$dvalue['id'].","
}
は、満たすすべての条件を組み合わせるというものです。条件は全て入っています
つまり、208のサブアイテムには、ID 1のものもありますし、ID 3のものもあります。彼はこれら 2 つの ID のデータをすべて見つけました



$peistr これを印刷して見てもらえますか?


最後の文は「So he check out the data of these two IDs」です

奇妙な測位データ編成形式、奇妙なクエリ構築方法


奇妙な測位データ編成形式、奇妙なクエリ構築方法

これも考え方。各列の各オプションの番号は異なり、それぞれにフィールドを作成することはできません

私は、$peistr の配列を初めて受け取ったときに、1 つのインデックスのみが値を持つというアイデアを思いつきました。 2 回目に受信すると、2 つのインデックスに値が含まれます。そうすれば、この値を初めて受信したときに判断できます。 2回目受信時は2つの値を同時に判定します。等々。でも、まだ書き方が分かりません

还有一个想法是 接收第一次时,符合条件的产品的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了。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート