• 締切済み

リストにデータがあれば1回だけ表示…

更新記録CGIを改造して新商品入荷情報CGIとして利用しています。 お客様からメールでの問い合わせを受けるときに"どの商品についてか"というのを明確にしたいと考えています。 さらにちょっと改造して、もしこのジャンルの商品があった場合は「商品ありますよ」を一番上に表示して下にリストを(商品リストを抜き出して<select>で表示させる方法はわかりました)、無ければ「今は無いですよ」だけを表示させたいです。 少ない知識で作ってみましたが、うまく出来ません。 open (FILE,"$data"); @file = <FILE>; close FILE; foreach $data (@file) { chomp; ($contents, $name) = (split(/<>/, $data)); if ($contents eq $in{'id'} && $name eq "" ){ print "<OPTION value=\"無商品\">現在購入できる商品はありません</OPTION>\n"; }else{ print "<OPTION value=\"未選択\">商品名を選択してください</OPTION>\n"; } } IDはジャンル名でnameは商品名です。この状態だと、各項目が複数出てしまいます。 何かこれ以上に足りない情報があれば指摘してください。すぐに記入します。 よろしくお願いします。

みんなの回答

回答No.3

> よって、ジャンルがマッチしてなおかつ商品名が無い場合はエラーページに飛ぶという風にした方がいいように感じたのですがいかがでしょうか? いかがでしょうかと言われても、どういうやり方がいいかどうかはサイトを構築する方の判断なので、どうとも言いかねます。 ただ、私ならそう何度も入力→送信ボタンを押す気にはなりません。入力や送信の手間はできるだけ少ない方が好きです。(問い合わせする方にとってはあまり関係ないのでしょうか・・・。) ジャンルを選択するページで、各ジャンルの商品の有無は表示できないのでしょうか?(種類はともかく、有無だけでも。) ともかく、商品がないときはエラーページを出すというのはセレクトフォームに表示させるよりも簡単ですね。 grepなりforeachなりで配列を回して、そのジャンルの商品名の有無をチェックすればいいので。 でも、方法を尋ねる前に、スクリプトの全体の構成をまずきっちり考えた方がいいですよ・・・。

master-3rd
質問者

お礼

返答ありがとうございます。 >方法を尋ねる前に、スクリプトの全体の構成をまずきっちり考えた方がいい もう一度考え直してみます。 また、質問自体は解決したわけではないのでポイント無しとさせていただきます。

すると、全ての回答が全文表示されます。
回答No.2

データは、各行に、 ジャンル名<>商品名 という形で入っているんですよね? 既にジャンルは選択されてるんですよね?(選択されたジャンルがサーバーに送信された後の表示が、問題になっているんですよね?) 今のままの記述だと、データファイル内に同じジャンル名が複数あった場合に対応できません。選択されたジャンルに商品名が入ってないものがあれば「無商品」かもしれませんが、その後の行に選択されたジャンルがあって、しかも商品名があれば「未選択」となるわけです。 一番最初に商品の有無を表示したいなら、表示の前に選択されたジャンルの商品を抜き出して別配列に入れるといいと思います。 open (FILE,"$data") || die; while (<FILE>){ ($contents, $name) = (split(/<>/, $_)); ($contents eq $in{'id'}) && push(@syouhin,$name); } close (FILE); print "<select name=\"syouhin\">\n"; if (@syouhin){ print "<option value=\"未選択\">商品名を選択してください</OPTION>\n"; foreach (@syouhin){ chomp; print "<option value=\"$_\">$_</option>\n"; } } else {print "<OPTION value=\"無商品\">現在購入できる商品はありません</OPTION>\n"; } print "</select>\n"; こんな感じでしょうか。動作確認はしていませんが・・・。 もし、同じ画面上で、訪問者が選択したジャンルに応じて動的にセレクトフォームの内容を変更したいということでしたら、それはCGIではなく、JavaScriptなどで行うことです。 なお、蛇足ながら・・・ ファイル名を表す変数名が$dataで、@fileに読み込んだデータを取り出すときの変数名も$dataになっています。 これでは後でファイル名を扱うときにうまく動作しなくなると思うので、変数に名前をつけるときは気をつけてください。

master-3rd
質問者

お礼

返答ありがとうございます。 #1さんの返答にも書きましたが、ちょっとスマートではないなと思えてきました。 よって、ジャンルがマッチしてなおかつ商品名が無い場合はエラーページに飛ぶという風にした方がいいように感じたのですがいかがでしょうか? すでに<option>にログデータを抜き出すことは出来ています。(#1さんへの返答を見ていただけるでしょうか。$dataは書き換えました) この際の最適な方法があれば教えてください。

すると、全ての回答が全文表示されます。
  • the845t
  • ベストアンサー率33% (246/743)
回答No.1

つまり、配列中の内容からキーワードに該当するものを検索し、 あれば~~。無ければ~~。としたいわけですよね? ならば、grepを使って@fileから抜き出したり、 foreachでいくならば、 foreach (@file){ ($contents, $name) = split(/<>/,$_); if($contents eq $in{'id'}){ print "<option>...."; $check = 0; break; }else{ $check = 1; } } if($check){ print "<option>...."; } ではいかがなもんでしょ? もっとキレイにかけると思いますが、アドバイスとして。

master-3rd
質問者

お礼

素早い返答ありがとうございます。 この質問を書き終わった後、ちょっと考えたのですが、これではスマートではないなと思いました。 もし、商品が無い場合はエラーページを出した方が早いのでは?と考えました。 商品があったときはオプションに表示されるのはわかっているので、 <SELECT name="brand_name"> <OPTION value="未選択">商品を選択してください</OPTION> _html_ open (FILE,"$ddata"); @file = <FILE>; close FILE; foreach $data (@file) { chomp; ($contents, $name) = (split(/<>/, $data)); if ($contents eq $in{'id'}){ print "<OPTION value=\"$name\">$name</OPTION>\n"; } } このようにしたほうが良くは無いでしょうか? この場合、上記回答方法をそのまま上の方に持っていくことになりそうですけど使用できるでしょうか? あ、出来るかどうかは回答がもとってくるまでに自分で確認してみます。 出来ないよって時は返答ください。

master-3rd
質問者

補足

お礼を書きこんだ後に気が付きましたが、foreachを使うよりgrepを使った方が良いようですね。(CGI&Pealポケットリファレンスで確認しました) foreachを使ったのはお礼にも書きましたがリスト書き出しに使ったのでこっちでも使えるかな?程度でやってました。 この本、サンプルが少々載っているのですがどういう風に動くのか・どう変化させればいいのかが良くわからなくて… 良い方法があれば教えてください。

すると、全ての回答が全文表示されます。