CGI-BBS > 基礎 > その他 > ファイルを自動作成できません。


(株)友林堂
(株)友林堂


データ復旧、即日 データ¨復旧¨テラステーション¨修理

質問者 まだまだ初心者  投稿日 12/25(水) 21:57:15
会員制のサイトでファイルに会員データを作成するスクリプトを作成しています。
Mac J perl では「syntax OK」と出たのですが、実際にアップするとなぜか動きません。
内部エラーがおこりました、と表示されます。
#IDの重複チェックの直前までは動いているようです。
どこがいけないのでしょう?
教えて頂けませんか。よろしくお願い致します。

以下、スクリプトです。

#!/usr/bin/perl

#データの解読
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {
	($name, $value) = split(/=/, $pair);
	$value =~ tr/+/ /;
	$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
	&jcode'convert(*value, 'sjis');
	$value =~ s/\r\n/<br>/g;
	$value =~ s/\r/<br>/g;
	$value =~ s/\n/<br>/g;
	$form{$name} = $value;
}

#####設定ここから#####
#必要な外部ファイル
require 'jcode.pl';
require 'error.pl';
require 'p_m.pl';

#登録者データの言い換え
$name = $form{'name'};
$address = $form{'address'};
$tel = $form{'tel'};
$email = $form{'email'};
$id = $form{'id'};
$password = $form{'password'};

#各種ファイル
$logfile1 = '../member/member.dat';
$logfile2 = "../member/$id.dat";

#####設定ここまで#####

#名前が記入されていないとエラー
     if (!$name) {
         $word = $word17;
         &error;
} else { &check2; }

#住所が記入されていないとエラー
sub check2 {
     if (!$address) {
         $word = $word18;
         &error;
} else { &check3; }
}

sub check3 {
#電話番号が記入されていないとエラー
     if (!$tel) {
         $word = $word19;
         &error;
} else { &check4; }
}

sub check4 {
#メールアドレスが記入されていないとエラー
     if (!$email) {
         $word = $word20;
         &error;
} else { &check5; }
}

sub check5 {
#IDが記入されていないとエラー
     if (!$id) {
         $word = $word25;
         &error;
} else { &check6; }
}

sub check6 {
#IDに半角英数以外が使われているとエラー
     if ($id !~ /[0-9a-zA-Z]/) {
         $word = $word21;
         &error;
} else { &check7; }
}

sub check7 {
#IDが4文字以上8文字以下でないならエラー
     if (length($id) > 8 or length($id) < 4) {
         $word = $word22;
         &error;
} else { &check8; }
}

sub check8 {
#IDにdummyが使われるとエラー
     if ($id eq dummy) {
         $word = $word27;
         &error;
} else { &check9; }
}

sub check9 {
#パスワードが記入されていないとエラー
     if (!$password) {
         $word = $word26;
         &error;
} else { &check10; }
}

sub check10 {
#パスワードに半角英数以外が使われているとエラー
     if ($password !~ /[0-9a-zA-Z]/) {
         $word = $word23;
         &error;
} else { &check10; }
}

sub check11 {
#パスワードが4文字以上8文字以下でないならエラー
     if (length($password) > 8 or length($password) < 4) {
         $word = $word24;
         &error;
} else { &check12; }
}

sub check12 {
#IDが重複していないかチェック
open(IN,"$logfile1") || die "ファイルを開けませんでした。";
  while(<IN>) {
     $data = $_;
     chop $data;
     ($name2,$address2,$tel2,$email2,$id2,$password2) = split(/\,/,$data);
        if ($id eq $id2) {
            $word = $word27;
            &error;
            last;
    }elsif ($id ne $id2) {
            next;
    }elsif ($id2 eq dummy) {
            &regist;
    }
  }
close IN;
}

#会員データ登録
sub regist {
#ダミーデータ削除
open(IN,"+<$logfile1") || die "ファイルを開けませんでした。";
 @data = <IN>;
close IN;
$dummy = pop @data;
open(OUT,">$logfile1") || die "ファイルを開けませんでした。";
 flock(OUT, 2);
 print OUT @data;
 flock(OUT, 8);
close(OUT);
#全会員データ用ファイルに会員データ書込み
$member_data = "$name,$address,$tel,$email,$id,$password\n";
open(IN,">>$logfile1") || die "ファイルを開けません。";
 flock(IN,2);
 print IN $member_data;
 flock(IN,8);
close IN;
#各会員用データファイル作成
open(IN,"+>$logfile2") || die "ファイルを開けません。";
 flock(IN,2);
 print IN $member_data;
 flock(IN,8);
close IN;
#ダミーデータ追加
open(IN,">>$logfile2") || die "ファイルを開けません。";
 flock(IN,2);
 print IN $dummy;
 flock(IN,8);
close IN;
&hyouji;
}

sub hyouji {
print << "EOH";
Content-type:text/html
<html>
<head>
<link href="../text/aquatime1.css" type="text/css" rel="stylesheet">
<title>アクアタイム通信販売</title>
</head>
<body class="main">
<div align="center">
<font class ="b2">
登録は無事完了しました。
<br>
<hr class="m">
EOH

require 'p_m.pl';

&p_m;

print << "EOH";
</div>
</font>
</body>
</html>
EOH
}

プロバイダ参照:http://www.interlink.co.jp
サーバのOS:UNIXサーバ
パソコンのOS:Mac9
エディタ:MacJperl
FTPソフト:Fetch v4
サーバ移転:していない
改造:(未選択)
CGI習熟度:expert

回答者 やまだ  [削除]  投稿日 12/25(水) 23:28:26
ヘッダに空行を入れるの忘れてますよ。
質問者 まだまだ初心者  [削除]  投稿日 12/27(金) 11:48:25
お返事ありがとうございます。

print << "EOH";
Content-type:text/html

から

print "Content-type:text/html\n\n";
print << "EOH";

という書き方に戻してみましたが、駄目でした。
最後の&hyoujiというサブルーチンまで実行されていないようです。

どこか、論理的におかしいところがあるのでしょうか?
回答者 しあわせのツボ  [削除]  投稿日 12/27(金) 13:08:56
あります(苦笑)。hyojiの前にregistも実行されません。
check12の条件分岐を見直してください。
# それでもまだ「正しく」は動かないと思いますが…
質問者 まだまだ初心者  [削除]  投稿日 12/27(金) 14:44:45
しあわせのツボさん、いつもいつも頼ってしまって申し訳ありません。

条件分岐のどこが悪いのか、すら分かりません...
どうか教えて下さい。
よろしくお願い致します。
回答者 しあわせのツボ  [削除]  投稿日 12/27(金) 14:50:56
最初の if ($id eq $id2) と、次の elsif ($id ne $id2) は
必ずどちらかが真になるので、その次の elsif ($id2 eq "dummy") が
評価されることは絶対にありません。
質問者 まだまだ初心者  [削除]  投稿日 12/27(金) 15:24:36
サブルーチンのcheck12を以下のようにしてみましたが、まだ、「内部エラー」としか表示されません。

一体どうしたら良いでしょうか?

以下スクリプトです。

sub check12 {
#IDが重複していないかチェック
open(IN,"$logfile1") || die "ファイルを開けませんでした。";
  while(<IN>) {
     $data = $_;
     chop $data;
     ($name2,$address2,$tel2,$email2,$id2,$password2) = split(/\,/,$data);
        if ($id eq $id2) {
            $word = $word27;
            &error;
            last;
    }elsif ($id2 eq "dummy") {
            &regist;
    }elsif ($id ne $id2) {
            next;
    }
  }
close IN;
}
回答者 しあわせのツボ  [削除]  投稿日 12/27(金) 18:36:40
手元の文法チェックは通るのに転送するとエラーになる場合、
多くの原因が考えられます。
・改行コードを間違っている(\r改行のをバイナリモードで送っている等)
・転送時に何らかのいらない変換をされている(FetchならMacBinaryとか)
・転送先のシステムでは使えない関数を使っている(systemとか。今回はたぶん無関係)
・必要なファイルを設置していない
・手元と転送先でperlのパスが違っている
・メタ文字の入力を適切に処理していない(オンビキを入力するとエラーになる等)
・処理が多いためタイムアウトになっている(subの入れ子が激しい)
などなど。
カンではFetchの設定が怪しいように思いますが、なんとも言えません。
質問者 まだまだ初心者  [削除]  投稿日 12/27(金) 18:44:57
しあわせのツボさん、いろいろとお教え頂いてありがとうございました。

とりあえず、原因がわからないので、もう1度、以前に成功したスクリプトを参考に1から作ってみます。

また、分からないことがあったら教えて下さい。

よろしくお願いします。

このページは終了したので返信(回答)は書きこめません
 


データ復旧、即日 データ¨復旧¨テラステーション¨修理 Web裏技