• 締切済み

リストにデータがあれば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は商品名です。この状態だと、各項目が複数出てしまいます。 何かこれ以上に足りない情報があれば指摘してください。すぐに記入します。 よろしくお願いします。

  • CGI
  • 回答数3
  • ありがとう数3

みんなの回答

回答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を使ったのはお礼にも書きましたがリスト書き出しに使ったのでこっちでも使えるかな?程度でやってました。 この本、サンプルが少々載っているのですがどういう風に動くのか・どう変化させればいいのかが良くわからなくて… 良い方法があれば教えてください。

関連するQ&A

  • リストに何も無ければXXを表示…

    あるCGIのログの一部をSSIで表示させようとしています。リストの「pt」と「name」があったものだけを「$max」個表示すると言う物です。 一部抜き出すと… ----- print "Content-Type: text/plain\n\n"; open (FILE,"../../cgi-bin/navi-a/navi.log"); $i=0; while (<FILE>) { local($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs) = split(/<>/); if ($pt eq $ARGV[0] && $name eq $ARGV[1]){ $i++; print "~ } if ($i >= $max) { last; } } ----- これに、「合う物が無かったら"無いですよ"文を表示」と言うのを付けたいのですが、うまく出来ません。 if ($pt eq $ARGV[0] && $name eq "") とかを試してみましたがうまく出来ませんでした。 何か良い方法が無いでしょうか? お願いします。

    • ベストアンサー
    • CGI
  • リストメニューに反映させる内容

    list.dat 内 $list1,$list2,$list3,$list4,$list5,$name1,$name2,$name3,$name4,$name5, print "<select name=list>\n"; print "<option value="0">未選択</option>\n"; print "<option value="1">$name1</option>\n"; print "<option value="2">$name2</option>\n"; print "<option value="3">$name3</option>\n"; print "<option value="2">$name4</option>\n"; print "<option value="3">$name5</option>\n"; print "</select>\n"; list.dat内のデータをselectメニューに反映させたいのですが、自分の頭ではかなり難しい事のようで、行き詰ってしまいました。 質問の仕方が下手で、どのように書いていいのかわからないのですが、やりたいことは、 $list1の名前が$name1 $list2の名前が$name2 というように、$listと$nameに付けられた数値番号が同一のものがセットになります。 この両方の変数にデーターが入っている場合のみ、セレクトメニューに反映させます。 例えばlist.dat内が $list1,,$list3,,$list5,$name1,$name2,$name3,$name4,, のような場合は、 print "<select name=list>\n"; print "<option value="0">未選択</option>\n"; print "<option value="1">$name1</option>\n"; print "<option value="3">$name3</option>\n"; print "</select>\n"; このようになります。 上のような作りは無理でしょうか? お力をおかし頂けると幸いです。

    • ベストアンサー
    • Perl
  • プルダウン選択によるボタンの表示/非表示に関して

    教えて下さい。 下のように、ONCHANGEイベントで、プルダウンにて選択された内容を、別のテキスト ('text')エリアに表示させる記述をしましたが、今度は選択された内容によって、 ボタンの表示/非表示をコントロールしたいと考えています。 実際には、下の記述で、'BBB'が選択された場合のみ、***よりしたの"日"ボタンを 表示させたいと考えています。 どのように記述すれば良いでしょうか。。。 教えて頂きたいと思います。 <SCRIPT LANGUAGE="JavaScript"> function ChangeSelection(form, selection,num) { v = selection.value; form.text.value = v; } <FORM NAME="fm_a" print("<TD><input name='text'></input>\n"); print("</TD>\n"); print("<TD><select name='am_note' ONCHANGE='ChangeSelection(this.form, this)'>\n"); print("<option value=''></option>\n"); print("<option value='AAA'>AAA</option>\n"); print("<option value='BBB'>BBB</option>\n"); print("<option value='CCC'>CCC</option>\n"); print("</select>\n"); print("</TD>\n"); ************************************************************** print("<TD>\n"); print("<input name='Cal' type='button' value='日'\n"); print("</TD>\n");

  • フォームの内容が1項目目だけ落ちます

    ショッピングカート CGIをカスタマイズしていますが、なにぶん自分で書く事ができずに見よう見まねねでソースをいじっているために行き詰まりました。。。 現状、商品をカゴに入れるボタンを押すと、注文者情報を入れるページに移動します。 情報入力ページにて入力して、確認画面へ のボタンを押すと、確認画面へ移行しますが、 情報確認ページに表示される情報の一行目だけが表示されません。 例えば、 氏名、〒、住所、電話・・・を入力して → 確認画面へボタン 確認画面では、 〒、住所、電話・・・しか表示されません。 ただ、一緒にhidden属性の項目もあり、そちらには一行目からのデータが書き出されており、 次に「メール送信」のボタンを押せばデータはすべて記載された形で送られます。 cgi プログラム 下記の部分でフォームから送られたデータを表示していると思うのですが、どこが悪いのか検討もつきません。 $Count_n = @DATA_N; foreach $n_data ( 1 .. $Count_n - 3 ) { if ( $DATA_N[$n_data] eq 'tax2' || $DATA_N[$n_data] eq 'sougoukei' || $DATA_N[$n_data] eq 'cookie' || $DATA_N[$n_data] eq 'syoukei' || $DATA_N[$n_data] eq 'soryo' ) { next; } $data_name = $data_name2 = $DATA_N[$n_data]; $data_name2 =~ s/^_//g; $data_name2 =~ s/pay/支払方法/g; if ( $DATA_N[$n_data] eq 'pay' ) { $DATA_V[$n_data] =~ s/-(\d+)//g; } print "<dt>$data_name2</dt>\n" ; if ( $data_name =~ /^_/ ) { if ( $DATA_V[$n_data] eq '' ) { print "<dd>必須項目未入力</dd>\n" ; push ( @Hissu,$DATA_N[$n_data] ); } else { print "<dd>$DATA_V[$n_data]</dd>\n" ; } } else { print "<dd>$DATA_V[$n_data]</dd>\n" ; } } print "</dl>\n" ; foreach $num_2 ( 0 .. $Count_n - 6 ) { if ( $DATA_N[$num_2] eq 'cookie' ) { next; } if ( $DATA_N[$num_2] eq 'pay' ) { next; } $DATA_N[$num_2] =~ s/^_//g; print "<input type=\"hidden\" name=\"$DATA_N[$num_2]\" value=\"$DATA_V[$num_2]\">\n"; } print "<input type=\"hidden\" name=\"syoukei\" value=\"\\$v_goukei\">\n"; print "<input type=\"hidden\" name=\"tax2\" value=\"\\$v_tax2\">\n"; if ( $v_soryo ne '' ) { print "<input type=\"hidden\" name=\"soryo\" value=\"$v_soryo\">\n"; } if ( $pay_name ne '' ) { print "<input type=\"hidden\" name=\"pay_tesuryo\" value=\"\\$pay_daikin\">\n"; } print "<input type=\"hidden\" name=\"sougoukei\" value=\"\\$v_sougoukei\">\n"; print "<input type=\"hidden\" name=\"pay\" value=\"$pay_name2\">\n"; print "<input type=\"hidden\" name=\"mode\" value=\"sendmail\">\n" ; 初心者の為、万策尽きた感じです。どなたか宜しくお願い致します。

    • ベストアンサー
    • CGI
  • 複数の SELECT タグを連動する

    複数の SELECT タグを連動するようにさせたいです。メインカテゴリを選択すると、サブカテゴリが出てくるというものです。 javaスクリプトの方は確認しました。 http://www.geocities.co.jp/SiliconValley/4334/unibon/asp/selectexample.html ただ、これをCGI(perl)上で利用したいのですが、方法が分かりません。 CGIは以下のようになっています。 print "<SELECT name=\"cat\">\n"; print "<OPTION value=\"\">カテゴリを選択してください</OPTION>\n"; for ($cnt = 0 ; $cnt<= $#catlist ; $cnt++) { if($catlist[$cnt] eq $cat){ print "<option value=\"$catlist[$cnt]\" selected>$catlist[$cnt]</OPTION>\n"; }else{ print "<option value=\"$catlist[$cnt]\">$catlist[$cnt]</OPTION>\n"; }#if閉じ }#for閉じ print "</SELECT>\n"; 配列変数(という言い方であってますか?@catlist)は別ファイル(data.ini)に保存されています。 サブカテゴリも配列を利用できないでしょうか?(@sub1=(~);@sub2=(~);のような感じ) また、修正画面(selectedを付ける)での使い方も今一つ不明です。 現在は、 print "<SELECT name=\"cat\">\n"; print "<OPTION value=\"\">カテゴリを選択してください</OPTION>\n"; for ($cnt = 0 ; $cnt<= $#catlist ; $cnt++) { if($catlist[$cnt] eq $cat){ print "<option value=\"$catlist[$cnt]\" selected>$catlist[$cnt]</OPTION>\n"; }else{ print "<option value=\"$catlist[$cnt]\">$catlist[$cnt]</OPTION>\n"; }#if閉じ }#for閉じ print "</SELECT>\n"; このような状態ですが、方法があれば教えてください。

  • リストボックス 複数選択のデータ受け渡し

    教えてください。PHP初心者です。 リストボックスを下記のように設置し、そこから別ファイルにデータの受け渡しをしたいのですが、どうしても上手く行きません。 データを受け継いだのち、複数の項目(さんまetc)を分別させるようにしたいです。 ========form.html============ <FORM method="POST" action="./get_data.php"> <SELECT size="15" name="list" multiple> <OPTION value="1">さんま</OPTION> <OPTION value="2">あじ</OPTION> <OPTION value="3">いか</OPTION> <OPTION value="4">かつお</OPTION> </SELECT> <INPUT type="submit" value=" 送信する "> </FORM> =========================================== ===========get_data.php==================== $LIST = array($_POST['list']); この後が分かりません。一応 foreach($LIST as $renew_list){ print "$renew_list\n"; print "<BR>\n"; } =========================================== 上記でやると、複数選択で選んだもの(例えば、さんまとあじ)の場合、 あじだけが表示されて、さんまは消えてしまいます。 どなたか助けてください。

    • ベストアンサー
    • PHP
  • データ

    データが送れているのかをプリントで確かめたのですが、$xの値しか表示されません。 セレクトボタンで選択した値が代入できません。 データが送られていないのでしょうか? どこが間違っているのか教えてください。 #!c:/perl/bin/perl <<省略>> print "<table border=1>"; print "<tr><td>商品番号</td><td>商品名</td><td>価格</td>"; print "<td>残り個数</td><td>注文数</td></tr>"; open(RF,"<butu.dat"); while(<RF>){ @data=split; print "<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]円</td>"; print "<td>$data[3]個</td><td><select name='ko[$n]'>"; for($i=1;$i<=$data[3];$i++){ print "<option value=$i>$i</option>"; } print "</select></td></tr>"; $n++; } close(RF); print "</table><br><br><input type='hidden' value='$n' name='gyo'>"; <<省略>> exit; ↓↓↓ #!c:/perl/bin/perl print "Content-type: text/html\n\n"; require 'cgi-lib.pl'; &ReadParse(\%in); $x=$in{'gyo'}; for($n=0;$n<$x;$n++){ $d[$n]=$in{'ko[$n]'}; } <<省略>> exit;

    • ベストアンサー
    • Perl
  • ユーザ入力が表示されない原因を教えてください。

    CGI初心者です。基礎を勉強しただけなのでまだまだ理解が足りないせいかもしれません。現在データ検索のカスタマイズをしています。 ユーザが入力したものを検索条件の一部にと考えているのですが、なかなかできません。どこがいけないのかおしえていただけないでしょうか? インプット print "<P>● 業 務 <input type=text name=P2 size=30>\n"; アウトプット print "<td valign=top nowrap><font color=\"$t_color\">■</font> <B>業 務</B><br>\n"; print "<select name=P2 >\n"; print "<option value=\"99\" selected>指定なし\n"; $i =99; foreach $line (@lines) { ($name,$value) = split(/\,/,$line); chop; if ($name ne '') { $i++; $names{($name)[0]}++; $n++; } } foreach (keys %names) { print "<option value=\"$_\">[$_]\n"; } print "</select></td>\n"; と表記してます。クッキーを利用して反映できるようにはしていて、 入力したものを、登録内容の確認や、削除するときやメンテするときにはちゃんと表示されています。

  • ?name=%94%E9%89%D8の表示

    $stock = array ( "./cgi-bin/photobbal25.cgi?name=%94%E9%89%D8"=>"143時間:43分:05秒", "./cgi-bin/photobbal25.cgi?name=naomi"=>"143時間:43分:05秒", "./cgi-bin/photobbal25.cgi?name=%82%D0%82%EB%82%DD"=>"117時間:31分:29秒") foreach($stock as $key => $value) { print "$key\n;" print "{$value}\n"       print "      \n" //ここに表示したい } 上記はPHPのコードです ?name=%94%E9%89%D8の %94%E9%89%D8を日本語で表示したい よろしくお願いします。

    • ベストアンサー
    • PHP
  • コーディングについて

    http://www.aimix.jp/cgi/accformkioku.html 上のサイトを参考にログイン画面を作っていまして、 この例の場合のようにセレクトする値が3つ、4つならこの書き方でもよいと思うのですが、 セレクトする値が10個、15個…となればソースが長くなり、とても見づらいものとなってしまいます。もうちょっとスマートな 書き方はあるのでしょうか?(一部略してあります) print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"; print "<title></title>\n"; print "</head>\n"; print "<body>\n"; &analysis; &auth; sub analysis{ if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/\r//g; $FORM{$name} = $value; } $pass1 = $FORM{'user_name'}; return; sub login{ if($pass1 eq '1'){ $check1 ="selected"; } elsif($pass1 eq '2'){ $check2 ="selected"; } else{ $check3 ="selected"; } print <<HEADER; <center> <caption><h1>ログイン</h1></cption> <table border="5" bgcolor="cfcfcf" width="300" height="150"> <tr> <td align="center" valign="center"> <form name="form" method="post" action="./xxx.cgi"> ユーザー名: <select name="user_name"> <option value="1" $check1>A</option> <option value="2" $check2>B</option> <option value="3" $check3>C</option> </select> <br><br> パスワード: <input type="password" name="password"> <br> <center> <input type="submit" name="submit" value="ログイン"> </center> </form> </td> </tr> </table> </center> HEADER } print "</body>"; print "</html>"; 1;

    • ベストアンサー
    • Perl