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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

Q&A

解決済

2回答

3218閲覧

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

m_nan

総合スコア11

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

0グッド

3クリップ

投稿2019/05/14 08:39

編集2019/05/14 09:30

初めて質問させていただきます。
会社の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; }

宜しくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2019/05/14 08:52

提示されているコードはメール用のテキストを生成するだけの関数に過ぎないように見えます。これがCGIスクリプトの全体なのだとしたら「何も表示されない」のは当然の結果です。関数を呼び出している側のコードが実際にはあるはずです。問題が起こっているのはそっちのはずなので、これでは原因を探ることはできません。
CHERRY

2019/05/14 09:19 編集

真っ白な画面になるということは、大抵の場合、CGI で、エラーが発生しているか 出力前にプログラムが終了がされている状態と思います。 ( 例えば、どこかで exit が実行されている等 ) > エラーメッセージ等も見当たらず、原因が全く分からないというのが現状です。 エラーメッセージが無いということですが、エラーが発生している場合は、Web サーバーのエラーログにエラーメッセージが記録されていると思われますので、ログファイルに記載差入れている内容を確認してください。 Perl の CGI で、500エラーが発生する原因としては 外部コマンドが実行できなかった、文字コードの問題、改行コードの問題、パーミッション問題等いろいろありますので、エラーログの内容と該当する部分のソースコードを追記していただけないでしょうか。
m_nan

2019/05/14 09:05 編集

KojiDoi様 ご指摘ありがとうございます。 不足しておりすみません。記載したのは、「database.cgi」というCGIの一部です。まずは、教えていただいた”関数を呼び出している側のコード”に当たる部分を探してみます。
m_nan

2019/05/14 09:12

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

2019/05/14 09:21 編集

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

2019/05/14 09:37

CHERRY様 重ねてのコメントありがとうございます。 >プログラムのメイン部分を公開してもらえると回答が付きやすいかもしれません。 下記がおっしゃってくださった箇所に該当しますでしょうか? $Ver='9.53'; &Lrequire('./lib/jcode.pl'); &Lrequire('./db-setup.cgi'); &Lrequire("$DataDir/config/db-config.cgi"); &Lrequire('./lib/db-html.cgi');.........
guest

回答2

0

ベストアンサー

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

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

投稿2019/05/14 10:34

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_nan

2019/05/14 14:19

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

2019/05/14 14:34

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

2019/05/15 00:20

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

2019/05/15 04:22

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

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 09:54

編集2019/05/14 10:14
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_nan

2019/05/14 10: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以降に入れ替えというのも、手探りではありますが調べてみます…。 ありがとうございました。
CHERRY

2019/05/14 10:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問