質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.98%

CGIで表示されず真っ白になります。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 457

m_nan

score 5

初めて質問させていただきます。
会社のHPで、欲しいカタログを選択してリクエストを承るサイトを運営しています。

定期的に更新作業を行っており、通常と同じ動作を行ったつもりなのですが、
上手く動作せず困っております。

前提・実現したいこと

formmail.htmlが表示され、正しくリクエストフォームを動作させたいです。

発生している問題・エラーメッセージ

request/db-test/database.cgi?cmd=fm
を押すと、request/db-test/lib/template/formmmail.htmlが開きます。
formmail.htmlのデザインや文言を修正し、HTMLファイルのみをリモートサーバーにUPしました。
ブラウザで確認した所、文字化け等があったため修正して再度同じ作業をした所、真っ白になって何も表示されなくなりました。

なお、formmail.htmlは、サーバーに存在しており、request/db-test/lib/template/formmmail.htmlをブラウザのバーに直接入力するとHTMLは確認できます。

本更新前のテストとして、CGIとそれに関与するHTMLを用意しており、
本更新用のCGIとHTMLは問題無く作動しております。
そちらのCGI・HTMLと今表示されなくなってしまったCGI・HTMLと見比べたのですが、
表記が違っている箇所等は見つけられませんでした。

エラーメッセージ等も見当たらず、原因が全く分からないというのが現状です。

該当のソースコード

下記が該当するか定かではないのですが、お互いが関与しあっていそうな箇所は下記の通りです。

HTMLのコード

<form action="$BaseDir/$MainCGI" method="POST" name="MyForm">
<input type="hidden" name="cmd" value="fma">
<input type="hidden" name="SID" value="$PID">

CGIのコード

################
#   SendMail   #
################
sub SendMail{ my($type,$to,$from,$cc,$bcc,$fname,$attach)=@_;
my($boundary,$file,$path);
(!$to) and return(0);
if($fname ne ''){
    $fname=&EncodeM($fname);
    $from="$fname <$from>";
}my@files=@{$attach};
local($subject,$body)=&$type;
&jcode::convert(*subject,'jis');
&jcode::convert(*body,'jis');
$subject=&EncodeM($subject);
open(ML,"| $CNF{Mail}{Sendmail} -t") or return(0);
# open(ML,">>$DataDir/$type.txt");# ─TEST
print ML "MIME-Version: 1.0\n";
print ML "To: $to\n";
print ML "Cc: $cc\n" if($cc);
print ML "Bcc: $bcc\n" if($bcc);
print ML "From: $from\n";
print ML "Subject: $subject\n";
print ML "X-Mailer: $Ver\n";
print ML "X-Http-Referer: $BaseDir/$MainCGI\n";
print ML "X-User-Agent: $ENV{HTTP_USER_AGENT}\n" if($type=~/_admin$/i);
print ML "X-Host: $ENV{REMOTE_ADDR}\n" if($type=~/_admin$/i);
if(@files>=1){
    $boundary='==='.$PID.time.'===';
    print ML qq(Content-Type: multipart/mixed; boundary="$boundary"\n\n);
    print ML "--$boundary\n";
}print ML "Content-Transfer-Encoding: 7bit\n";
print ML qq(Content-Type: text/plain; charset="ISO-2022-JP"\n\n);
print ML "$body\n";
foreach$path(@files){
    (!-e$path) and next;
    ($file)=$path=~/([^:\/\\]+)$/;
    print ML "--$boundary\n";
    print ML qq(Content-Type: application/octet-stream; name="$file"\n);
    print ML qq(Content-Disposition: attachment; filename="$file"\n);
    print ML "Content-Transfer-Encoding: Base64\n\n";
    my$tmp=&EncodeB(undef,$path,'n');
    print ML "$tmp\n";
}print ML "--$boundary--\n" if(@files>=1);
print ML "\n";
close(ML);}

当方について

HTMLの編集はある程度出来ますが、CGIは何が何だかさっぱりという状態です。
前任者から必要な所は教えてもらっているのですが、CGIは無知に等しいです。

見ていただくにあたり、不足している箇所等ありましたら
すぐに確認致しますので、ご教授いただけますと幸いです。
どうぞ宜しくお願い致します。

5/14 18:30追記
サーバーのエラーログを確認しました。(何度もUPしたせいで同じ表記がたくさんあります。)
[Tue May 14 17:17:21.572303 2019] [cgi:error] [pid 96140] [client 123.255.245.251:0] AH01215: defined(%hash) is deprecated at ./lib/jcode.pl line 641.: /*当社Web*/request/db-test/database.cgi
[Tue May 14 17:17:21.572400 2019] [cgi:error] [pid 96140] [client 123.255.245.251:0] AH01215: \t(Maybe you should just omit the defined()?): /*当社Web*/request/db-test/database.cgi
[Tue May 14 17:17:21.572434 2019] [cgi:error] [pid 96140] [client 123.255.245.251:0] AH01215: defined(%hash) is deprecated at ./lib/jcode.pl line 648.: /*当社Web*/request/db-test/database.cgi

これは、「jcode.pl」といつファイルの641行目と648行目に問題があるという事なのでしょうか?
ちなみにそのファイルの該当箇所(639~651行目)は以下の通りです。

sub z2h_euc {
    local(*_, $n) = @_;
    &init_z2h_euc unless defined %z2h_euc;
    s/($re_euc_c|$re_euc_kana)/$z2h_euc{$1} ? ($n++, $z2h_euc{$1}) : $1/geo;
    $n;
}

sub z2h_sjis {
    local(*_, $n) = @_;
    &init_z2h_sjis unless defined %z2h_sjis;
    s/($re_sjis_c)/$z2h_sjis{$1} ? ($n++, $z2h_sjis{$1}) : $1/geo;
    $n;
}


宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m_nan

    2019/05/14 18:12

    CHERRY様
    ご指摘ありがとうございます。
    エラーメッセージが出ている状態であるとは知りませんでした。レンタルサーバーのエラーログを確認してみます。また分かりましたら、こちらに記載させていただきます。

    キャンセル

  • CHERRY

    2019/05/14 18:20 編集

    差し障りがなければ、(個人情報などの部分を置き換えたうえで)プログラムのメイン部分を公開してもらえると回答が付きやすいかもしれません。

    キャンセル

  • m_nan

    2019/05/14 18:37

    CHERRY様
    重ねてのコメントありがとうございます。
    >プログラムのメイン部分を公開してもらえると回答が付きやすいかもしれません。

    下記がおっしゃってくださった箇所に該当しますでしょうか?
    $Ver='9.53';
    &Lrequire('./lib/jcode.pl');
    &Lrequire('./db-setup.cgi');
    &Lrequire("$DataDir/config/db-config.cgi");
    &Lrequire('./lib/db-html.cgi');.........

    キャンセル

回答 2

checkベストアンサー

0

このjcode.plはかつて一般的に使われていたものですが、もう10年以上前に時代遅れになった代物です。これが今のperlの仕様にあっていないのがエラーの原因です。本当は全部書き直したほうがいいのですが、対症療法としては、これを試してみてはどうでしょう。

http://icepotato.cocolog-nifty.com/blog/2014/04/jcodepldefinedh.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/14 23:19

    KojiDoi様
    回答くださりありがとうございます。
    やはりそうなんですね…。
    Perlの本を買おうと思って先程本屋に行ったのですが、全く見当たらず時代遅れのものなのだと痛感しました。
    20年ほど前の無料配布されていたCGIを騙し騙し使っていた代償がようやく来たようです…。
    書いてくださったやり方はまだ試せておりませんので、取り急ぎ御礼のみですが。
    ありがとうございました。

    キャンセル

  • 2019/05/14 23:34

    補足しておきますが、時代遅れになっているのはjcode.plであってperlそのものは立派に現役です。かつてjcodeで対応していたことは今はEncodeという標準装備のライブラリで対応することになっています。
    今回出ているエラーは致命的問題というわけではないので、とりあえず紹介されているとおり2箇所ばほど修正すれば動くようにはなると思います。

    キャンセル

  • 2019/05/15 09:20

    そうだったのですね。知らない事が多いですが、ここでいろいろと教えていただき助かっております。
    ご丁寧に説明して下さり、ありがとうございました。

    キャンセル

  • 2019/05/15 13:22

    ご指摘いただいた通りに修正したのですが、そこは今回動作しなかった箇所の原因ではなかったようで、表示はやはりできませんでした。また、別の質問を立ち上げてお伺いできればと思います。
    しかし、エラー表記はなくなりましたので、こちらをベストアンサーとさせていただきました。

    キャンセル

0

AH01215: defined(%hash) is deprecated at ./lib/jcode.pl line 641.: /*当社Web*/request/db-test/database.cgi

メッセージで、defined(%hash) is deprecated  ( defined(%hash) は非推奨になった ) と言われていますね。

エラーが出るサーバーの Perl のバージョンはいくつですか?

perl -v を実行すると 表示されると思います。

例:

$ perl -v

This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
(with 38 registered patches, see perl -V for more detail)

perl のドキュメントを確認すると defined - PerlDoc に

Use of defined on aggregates (hashes and arrays) is no longer supported. It used to report whether memory for that aggregate had ever been allocated. You should instead use a simple test for size:

no longer supported. とありますので、新しい perl のバージョンでは、defined %z2h_euc;  というふうな defined %ハッシュ という使い方ができなくなったのだと思います。(新しい Perl のバージョンでは非推奨の方法なので使えない。)

対応としては、プログラムの全面的な書き換えや入れ替えをおすすめしたいところですが...

難しいのであれば、とりあえずの応急対策としては、 Jcode.pl を Jcode.pl と互換性のある Jcode.pm 2.0 以降に入れ替えて凌ぐ形になるのではないかと思います。


(追記)
こちらも延命策にしかなりませんが...

jcode.pl のメンテナンスした派生バージョンとして、jacode-2.13.4.18 があるようです。(こちらは使ったことがないので、ドキュメントを読んだだけですが...)

jcode.pl のある場所に ダウンロードした jacode.pl をコピーして、  require('./lib/jcode.pl');  となっている部分を require('./lib/jacode.pl');  に書き換えるとそのまま動くかもしれません。(設置手順は、Jcode.pm と比べると こちらのほうが多少楽かもしれません)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/14 19:15

    ご回答誠にありがとうございます。

    さくらのレンタルサーバーを使用していますので、5.14.x (※5.8.x、5.10.x、5.12.x へバージョン選択が可能)かと思います。
    jcode.plの中に
    ;# Current jcode.pl is written in Perl 4 but it is possible to
    ;# use from Perl 5 using `references'. Fully perl5 capable version
    ;# is future issue.
    とありますので、今は4で書いてあり、それが仰るように今のルールに即していない為no longer supportedとなるという事なのでしょうか。

    今色々と教えていただいた事も、調べつつ初めて見てみる部分ばかりでしたので、私の技量ではプログラムの入れ替えなどは到底できそうにもありません…。
    Jcode.pm2.0以降に入れ替えというのも、手探りではありますが調べてみます…。
    ありがとうございました。

    キャンセル

  • 2019/05/14 19:21

    ドキュメントを追いかけきれていないのですが、 perl 5.12 〜 perl 5.16 あたりで変更された感じですので、perl 5.8.x だと そのまま動く可能性もありますね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる