更新記録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は商品名です。この状態だと、各項目が複数出てしまいます。
何かこれ以上に足りない情報があれば指摘してください。すぐに記入します。
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> よって、ジャンルがマッチしてなおかつ商品名が無い場合はエラーページに飛ぶという風にした方がいいように感じたのですがいかがでしょうか?
いかがでしょうかと言われても、どういうやり方がいいかどうかはサイトを構築する方の判断なので、どうとも言いかねます。
ただ、私ならそう何度も入力→送信ボタンを押す気にはなりません。入力や送信の手間はできるだけ少ない方が好きです。(問い合わせする方にとってはあまり関係ないのでしょうか・・・。)
ジャンルを選択するページで、各ジャンルの商品の有無は表示できないのでしょうか?(種類はともかく、有無だけでも。)
ともかく、商品がないときはエラーページを出すというのはセレクトフォームに表示させるよりも簡単ですね。
grepなりforeachなりで配列を回して、そのジャンルの商品名の有無をチェックすればいいので。
でも、方法を尋ねる前に、スクリプトの全体の構成をまずきっちり考えた方がいいですよ・・・。
返答ありがとうございます。
>方法を尋ねる前に、スクリプトの全体の構成をまずきっちり考えた方がいい
もう一度考え直してみます。
また、質問自体は解決したわけではないのでポイント無しとさせていただきます。
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になっています。
これでは後でファイル名を扱うときにうまく動作しなくなると思うので、変数に名前をつけるときは気をつけてください。
返答ありがとうございます。
#1さんの返答にも書きましたが、ちょっとスマートではないなと思えてきました。
よって、ジャンルがマッチしてなおかつ商品名が無い場合はエラーページに飛ぶという風にした方がいいように感じたのですがいかがでしょうか?
すでに<option>にログデータを抜き出すことは出来ています。(#1さんへの返答を見ていただけるでしょうか。$dataは書き換えました)
この際の最適な方法があれば教えてください。
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>....";
}
ではいかがなもんでしょ?
もっとキレイにかけると思いますが、アドバイスとして。
この回答への補足
お礼を書きこんだ後に気が付きましたが、foreachを使うよりgrepを使った方が良いようですね。(CGI&Pealポケットリファレンスで確認しました)
foreachを使ったのはお礼にも書きましたがリスト書き出しに使ったのでこっちでも使えるかな?程度でやってました。
この本、サンプルが少々載っているのですがどういう風に動くのか・どう変化させればいいのかが良くわからなくて…
良い方法があれば教えてください。
素早い返答ありがとうございます。
この質問を書き終わった後、ちょっと考えたのですが、これではスマートではないなと思いました。
もし、商品が無い場合はエラーページを出した方が早いのでは?と考えました。
商品があったときはオプションに表示されるのはわかっているので、
<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";
}
}
このようにしたほうが良くは無いでしょうか?
この場合、上記回答方法をそのまま上の方に持っていくことになりそうですけど使用できるでしょうか?
あ、出来るかどうかは回答がもとってくるまでに自分で確認してみます。
出来ないよって時は返答ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- HTML・CSS FC2カートのテンプレートでの商品表示について 1 2023/03/02 18:05
- Visual Basic(VBA) EXCEL関数LOOKUPとFILTERについての質問です 1 2022/12/21 05:53
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- Excel(エクセル) エクセルの表について 3 2023/04/14 18:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ホームページでCGIのフォームを...
-
エクセルで集計したい。
-
apacheでPerl CGIが作動せず、5...
-
CGIって何ですか?簡潔に教えて...
-
CGI.pmはもう古い!?
-
URLがhttp://~.cgiとなってい...
-
cgi-perl の sendmail について
-
ホームページにメールフォーム...
-
VBAで条件から範囲を指定して色...
-
フォームを再送信しますか?
-
入力フォーム(電話番号)
-
プロバイダのスピードは、maps...
-
POSTメソッドの最大容量について
-
3DCG
-
cgi アクセス制限 エラー
-
CGIの記述について教えてくださ...
-
CGIの設置が分かりません・・・
-
ホームページにCGIを設置したの...
-
ホームページにCGIを設置したの...
-
サーバーのエラーでおしえてく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォームを再送信しますか?
-
エクセルで集計したい。
-
apacheでPerl CGIが作動せず、5...
-
ホームページでCGIのフォームを...
-
入力フォーム(電話番号)
-
htmlからパラメータで、cgiに渡...
-
/bin/awk '{print $5}'ってどう...
-
CGIが読み書きするデータファイ...
-
POSTメソッドの最大容量について
-
チェックボックスでのvalue値の...
-
cgi アクセス制限 エラー
-
CGIゲーム設置について
-
サイト訪問者の情報を取得したい
-
CGIって何ですか?簡潔に教えて...
-
cgiからsendmailを送信で文字化け
-
ホームページにメールフォーム...
-
ラズパイでのCGIで、pythonソー...
-
一番簡単なCGI,掲示板の設置教...
-
perlで書いたcgiでsqliteの使い...
-
CGIメールフォームの件名について
おすすめ情報