ホームページビルダー・グレート初心者講座

グレート初心者講座トップへグレート初心者講座 小技集へグレート初心者講座≠ヨグレート初心者講座 質問掲示板へ

HTML版 過去ログ
| 掲示板を見る | ホームに戻る | ワード検索 | 過去ログ |   

パラメータの名前の取り出しができない

日時: 2016/09/12 09:50
識別: IDr/cbMzM8SIs
名前: 秀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とかになってて欲しいのですが。
このあたりが、いけないのでしょうか。

ホームページビルダー・グレート初心者講座 Copyright © 2002-2005 aimix All Rights Reserved