window
トップページ > 記事閲覧
*パラメータの名前の取り出しができない
日時: 2016/09/12 09:50
識別: ID:gs063Ff6eEV0
名前: 秀seven  <hillshanazono@gmail.com>

問合せフォームでメール送信処理で行き詰っています。
以下のCGIソースで、6行目のデバックでは、以下の結果が返ってきますが、
7行目のName指定では、値がブランクになり、エラー処理に移ってしまいます。
また35行目のPushで配列に追加していますが、デバックで$value[$i]も値が
取れています。ご教示下さい。

デバック結果
mode=send
message=あ
name=ああああ ああ
kana=いいいい いいい

cgiソース抜粋

1 my %form;
2 Main();
3
4 sub Main {
5 &FrmDcd;
6 &debug(@{$form{'POSTDATA'}}[0]);
7 my $mode = @{$form{'mode'}}[0];
8 if($mode eq 'send'){
9 &Conf;
10 }else{
11 &SystemError('エラー','不正なリクエストです!!');
12 }
13 }
14
15 sub FrmDcd{
16 my $query = new CGI;
17 foreach my $field ($query->param) {
18 my @value = $query->param($field);
19 for (my $i=0; $i < @value; $i++) {
20 # 不都合な文字を取り除く
21 # tab,&,",<,>をエスケープ
22 $value[$i] =~ s/\t//g;
23 $value[$i] =~ s/&/&amp;/g;
24 $value[$i] =~ s/"/&quot;/g;
25 $value[$i] =~ s/</&lt;/g;
26 $value[$i] =~ s/>/&gt;/g;
27 $value[$i] =~ s/,/ /g;
28 # 改行コード(CR,LF,CRLF)を<BR>に変換
29 $value[$i] =~ s/\x0D\x0A/<BR>/g;
30 $value[$i] =~ s/\x0D/<BR>/g;
31 $value[$i] =~ s/\x0A/<BR>/g;
32 # 文字コードを変換(条件によって使い分ける)
33 jcode::convert(\$value[$i], 'sjis');
34 # 配列に内容をpush
35 push(@{$form{$field}},$value[$i]);
36 }#for
37 }
メンテ

Re: パラメータの名前の取り出しができない ( No.1 )
日時: 2016/09/14 08:02
名前: 名無しさん

デバッグする位置を「# 配列に内容をpush」のあとくらいにして確認してみてください。

CGI.pmだと思いますが、POSTDATAはPOSTで送信された内容を
そのまま表示しますので、CGI.pmは値を受け取れていますが、
その後、エスケープしたりの後でおかしいのではないかと思います。

ひとまず sub FrmDcd の末尾あたりでデータが正しく格納されているか確認し、
格納されているのであれば、sub Main で参照できないということなので、
対象の配列をourにするなどして参照できるようにします。
sub FrmDcd末尾でも参照できない場合は、取り出し方か、エスケープの不備かもしれません。
メンテ
Re: パラメータの名前の取り出しができない ( No.2 )
日時: 2016/09/14 14:06
名前: 名無しさん

ご指摘、ありがとうございます。

35行目にPush前のデバッグと
36行目にPush後のデバックをいれた結果、
Push前は

mode=send
message=あ
name=ああああ ああ
kana=いいいい いいい

Push後は
空白でした。

pushの記述がおかしいのでしょうか。



15 sub FrmDcd{
16 my $query = new CGI;
17 foreach my $field ($query->param) {
18 my @value = $query->param($field);
19 for (my $i=0; $i < @value; $i++) {
20 # 不都合な文字を取り除く
21 # tab,&,",<,>をエスケープ
22 $value[$i] =~ s/\t//g;
23 $value[$i] =~ s/&/&amp;/g;
24 $value[$i] =~ s/"/&quot;/g;
25 $value[$i] =~ s/</&lt;/g;
26 $value[$i] =~ s/>/&gt;/g;
27 $value[$i] =~ s/,/ /g;
28 # 改行コード(CR,LF,CRLF)を<BR>に変換
29 $value[$i] =~ s/\x0D\x0A/<BR>/g;
30 $value[$i] =~ s/\x0D/<BR>/g;
31 $value[$i] =~ s/\x0A/<BR>/g;
32 # 文字コードを変換(条件によって使い分ける)
33 jcode::convert(\$value[$i], 'sjis');
34 # 配列に内容をpush
35 #&debug($value[$i]);
36 push(@{$form{$field}},$value[$i]);
37 #&debug(@{$form{'mode'}}[0]);
38 }#for
39 }
メンテ
Re: パラメータの名前の取り出しができない ( No.3 )
日時: 2016/09/14 14:17
名前: 名無しさん

配列と連想配列がごっちゃになってる気がしますが、pushは配列の末尾に要素を追加するので、以下のように行います。
(配列 @array の末尾に '文字列' を追加)

push(@array,'この要素を末尾に追加');

対して連想配列はキーを元に要素を扱いますので、以下のように値を入れます。
(連想配列 %Hash のキー five に 5 を代入)

$Hash{five} = 5;

このあたりを確認してみてください。
メンテ
Re: パラメータの名前の取り出しができない ( No.4 )
日時: 2016/09/14 16:12
名前: 名無しさん

早々のご回答、有難うございます。

連想配列ですね。

push(@{$form{$field}},$value[$i]);

デバックでは$value[$i]の値はちゃんと入っていますし、

要素の$filedに何がはいっているかデバックしたら、
POSTDATAとなります。

予想は、modeとかmessageとかになってて欲しいのですが。
このあたりが、いけないのでしょうか。
メンテ

 返信フォーム (上記スレッドに返信する場合は以下のフォームから投稿します)
題名 ※必須 スレッドをトップへソート
名前
E-Mail
URL
パスワード 記事メンテ時に使用します (メンテは該当記事のメンテアイコンをクリック)
返信内容
※必須
エラーメッセージや内容などは省略せず詳細にご記入下さい
状態の設定

・問題が解決したら 解決 を選択して投稿して下さい HELP(新しいウィンドウが開きます)
・既存記事の状態設定はメンテ(メンテアイコン)から修正する事ができます。


投稿内容をご確認下さい(記事の削除は出来ません)

   クッキー保存