- ベストアンサー
クッキーについて
いつも参考にさせていただいています。 早速ですが、クッキーのことで質問させてください。 <input type=checkbox name=address value=****@***.ne.jp> <input type=checkbox name=address value=****@***.ne.jp> <input type=checkbox name=address value=****@***.ne.jp> という感じで、HTMLを作成してあります。 ボックスでONにしたもののvalueをクッキーファイル内で、 address:****@***.ne.jp,****@***.ne.jpという感じで、 一つの項目として保存したいです。 現在は、ボックスを複数選択しても、 address:****@***.ne.jpで一つしか保存されません。 参考・ヒントをいただけると大変助かります。 よろしくお願いします。 (初心者なので、できればソースなど具体的な回答が助かります)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
少し情報が足りないので、おそらく、cgi-lib.plを利用されてると思われますが… 一つは値が取得できているようなので、その後の書き出しの部分までの処理に問題があると考えられます。 cgi-lib.plを利用しているのであれば、steel_grayさんもおっしゃっていますが、nameが全て同じaddressという値なので、 $address = $FORM_DATA{"address"}; とした時点で、$addressにチェックした箇所のvalue値がnull文字で区切られて入っていると思われます。 よって、値の取得からクッキーデータ作成までは、 $address = $FORM_DATA{"address"}; #値の取得 &jcode'convert(*address,"sjis"); #文字コードの変換 $address =~s/\0/,/g; #区切り文字全てをnullから「,」に変更 $c_line="cookietest=address:$address; expires=Sat,26-February-2005 00:00:00 GMT"; とすれば、$c_lineに必要な値が入ると思われます。 変数名等は適宜変更してください。 また、蛇足ではありますが、join関数の第二引数に$c_addressという変数を利用されていますが、 join関数の第二引数は配列です。 join関数は第二引数で指定された配列の要素を第一引数を区切り文字として連結する関数です。
その他の回答 (2)
- tune222
- ベストアンサー率50% (2/4)
一点気になる点があるのですが… 「現状のスクリプト」として書き込んでいただいたものがありますよね? このスクリプトは1つのファイルに記述されているのでしょうか? $CgiURL="mail.cgi"; <form action="$CgiURL" method"post"> という記述から、SUBMITボタンを押したときにフォームのデータはPOSTでmail.cgiというファイルに渡されることが分かります。 よって、クッキー作成から出力まではこちらのファイルに記述する必要があります。 こちらのファイルでもcgi-lib.plをインポートするのを忘れないようにしてください。 あと、methodと"post"の間に=を入れてください。
お礼
お礼の投稿が遅くなり大変申し訳ありませんでした。 色々試した結果、 スマートではありませんが、 正しい結果は得られました。 ありがとうございました。 また、わからないときは助力をお願いします。
- steel_gray
- ベストアンサー率66% (1052/1578)
同じnameを持つ項目をどのように扱っていいかは、 CGIにpostされたフォームデータの解析をしている部分の作り方によります。 現在どのように・・・ CGI.pmやcgi_lib.plなどを使っているのか、 それとも自前のデコードルーチンを使っているのか、 を具体的に教えてください。 また、現在cookieへ保存している部分も具体的に教えてください。 また、そのスクリプトがどこかで配布しているクリプトを母体にした改造版ならば元のスクリプトの素性もわかると回答に役立つかも。 具体的な回答をするには具体的な現状説明が必要です。 一応ヒントだけを書いておくと、CGI.pmやcgi-lib.plを使っているならば、同じnameの項目は1つの変数にnullで区切られて格納されているので、 @address = split /\0/,$q->param('address'); みたいな感じで配列に格納しなおして処理します。
補足
回答ありがとうございました。 下記が現状のスクリプトです。 スクリプトの母体は、手元にある「perl/CGI逆引き大全 555の極意」秀和システム出版の本です。 (スキルがないので、ほどんど改造していない状態です) よろしくお願いします。 #!/perl/bin/perl use CGI qw(:standard); require "jcode.pl"; $CgiURL="mail.cgi"; $address = $FORM_DATA{"address"}; &jcode'convert(*address,"sjis"); $c_address="address=$address"; $c_line=join(",",$c_address); $c_line=~ s/=/:/g; $c_line=~ s/・/br/g; $c_line="cookietest=$c_line\; expires=Sat,26-February-2005 00:00:00 GMT"; #============================================= #HTML表示 #============================================= print <<"EOL"; Content-Type:text/html Set-Cookie:$c_line <html> <head> <title>メールアドレス</title> <META http-equiv=content-type content="text/html;charset=shift_jis"> </head> <body> <form action="$CgiURL" method"post"> <a name="head"> <table border=1 align=center> <tr> <th colspan=4>本 社</th> </tr> <tr> <td><input type=checkbox name=address value=*****></td> <td>1</td><td>A太郎</td><td>***@****.ne.jp</td> </tr> <tr> <td><input type=checkbox name=address value=*****></td> <td>12</td><td>B太郎</td><td>***@****.ne.jp</td> </tr> <tr> <td><input type=checkbox name=address value=*****></td> <td>15</td><td>C太郎</td><td>***@****.ne.jp</td> </tr> <tr> <td colspan=4 align=right><input type="submit" value="クッキーをセット"></td> </tr> </table> </form> </body> </html> EOL
補足
回答ありがとうございます。 スクリプトを書き直したのですが、 クッキーファイルには、 cookietest・address・ のように何も保存されていない状態になります。 バカ正直にそのまま書き直すだけではダメなのでしょうか? 遅くなりましたが、cgi-lib.plを使用しています。 use CGI qw(:standard); require "jcode.pl"; $CgiURL="mail.cgi"; $address = $FORM_DATA{"address"}; &jcode'convert(*address,"sjis"); $address=~ s/\0/,/g; $c_line="cookietest=address:$address; expires=Sat,26-February-2005 00:00:00 GMT";