PHP4→5のアップグレードでコードが動かなくなるエラーが発生する

このQ&Aのポイント
  • PHP4からPHP5へのアップグレードにより、特定のコードがエラーを出して正常に動作しなくなる問題が発生しています。
  • このコードは、特定のファイルをブラウザでダウンロードするスクリプトです。
  • プログラミング初心者のため、修正方法を教えてください。
回答を見る
  • ベストアンサー

PHP4→5にアップグレードしたらコードが動きません。

このコードを使うとエラーが出ます。PHP4の環境では問題なかったのですが、PHP5にしたとたんエラーが出てコードが動きません。このコードは指定のファイルをブラウザでダウンンロードできるスクリプトです。 プログラミング素人なのでどう直したらま動くようになりますか??? #!/usr/bin/perl -wT use CGI ':standard'; use CGI::Carp qw(fatalsToBrowser); my $files_location; my $ID; my @fileholder; $files_location = "/home/user/public_html/static/file"; $ID = param('ID'); if ($ID eq '') { print "Content-type: text/html\n\n"; print "You must specify a file to download."; } else { open(DLFILE, "<$files_location/$ID") || Error('open', 'file'); @fileholder = <DLFILE>; close (DLFILE) || Error ('close', 'file'); open (LOG, ">>//home/user/public_html/dl.log") || Error('open', 'file'); print LOG "$ID\n"; close (LOG); print "Content-Type:application/x-download\n"; print "Content-Disposition:attachment;filename=$ID\n\n"; print @fileholder } sub Error { print "Content-type: text/html\n\n"; print "The server can't $_[0] the $_[1]: $! \n"; exit; }

  • PHP
  • 回答数5
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

これぐらいなら、自動でなく人力でコンバートできるでしょ。 変換表は http://www.cs.wcupa.edu/~rkline/perl2php/ でみつけました。 ちゃちゃと書き換えると <?php /* #!/usr/bin/perl -wT use CGI ':standard'; use CGI::Carp qw(fatalsToBrowser); my $files_location; my $ID; my @fileholder; */ $files_location = "/home/user/public_html/static/file"; if ($ID == '') { header("Content-type:text/html"); print "You must specify a file to download."; }else { $DLFILE = fopen("$files_location" . "/" . $ID, "r"); if($DLFILE){ $i=0; while (!feof($DLFILE)) { $fileholder[$i] = fgets($DLFILE); i++; } fclose($DLFILE); }else { Error('open', 'file') } $LOG = fopen("//home/user/public_html/dl.log", "a+"); if($LOG){ fwrite($LOG,"$ID" . "\n"); fclose ($LOG); }else{ Error('open', 'file'); } header("Content-Type:application/x-download"); header("Content-Disposition:attachment;filename=" . $ID); for($i=0;$i<count($fileholder);i++){ print $fileholder[$i]; } } function Error($_[0],$_[1]){ header("Content-type:text/html"); print "The server can't" . $_[0] . " the " . $_[1] . " !\n"; die; } ?> こんな感じになるので、デバッグしてね。

kohei1016
質問者

補足

変換までして頂いて、ありがとうございます!初心者なのでとてもたすかりあます!

その他の回答 (4)

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.5

ANo.2です。 補足説明ありがとうございました。 起こった現象について、私の知識・経験からでは回答を差し上げることはできそうにないです。 とりあえず、動かなくなったPerlスクリプトをどうにかするために、Perlのカテゴリで質問してみてはいかがでしょうか(その際はエラーの内容も貼り付けた方がよいでしょう)。 その中でこの現象についての原因が明らかになるかもしれません。

kohei1016
質問者

補足

ありがとうございます。やってみます!

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.4

No3補足 大事なのが抜けてました。 $ID = param('ID');てのは、おそらく $ID = $_REQUEST["ID"]; ですね。

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.2

PHPをバージョンアップしたらPerlのコードが動かなくなったということですか? それとも別のサーバに移行したとかそういうことでしょうか。

kohei1016
質問者

補足

はいその通りです!PHP5にしたら何故か動かなくなりました

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

「perlからphpへの自動変換」で検索してみればいかがでしょう

kohei1016
質問者

補足

検索してみました。自動変換してくれそうなページは見当たりません。私のミスかもしれませんが。。。

関連するQ&A

  • ロック処理について

    ロック処理について my$id="abc"; open(IN,"file"); while(<IN>){ my ($cid) = split(/\,/); if($cid eq $id){&error;} } close(IN); open(OUT,">>$file"); print "$id,$pass\n"; close(OUT); いままで上記のような書き方でも普通にロック機構を使っていたのですが、 ふと、追加書込みなら必要ないのではと思い至りました。 上記のようにファイルに追加書込みする場合は、ロックは必要ないのでしょうか?

    • ベストアンサー
    • Perl
  • ログファイルと受信データを比べたい。

    フォームを使用して送られてきたデータをlogを比べて同じものがあったら、同じものがあるということを表示したいのです。 前にも同じようなことをしてできたはずなのですが、なぜかできなくて…。 もうずーっとやっていて頭がボーッとしてきてしまいました。。。。 #フォームで受信したデータ read(STDIN,$buffer,$ENV{'content_length'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #ログファイルオープン open FILE,"naisen.log"; @FILES =<FILE>; close FILE; $i=0; $n=0; $gyou = @FILES; #文末の改行を削除 $buffer =~ s/\n$//; $FILES[$i] =~ s/\n$//; foreach(@FILES){ @log = split(/&/,$FILES[$i]); ($keys,$values) = split(/=/,$log[$_]); $FORMS{$keys} = $values; } for ($i=0; $i<=$gyou-1;$i++){ if ($buffer eq $FILES[$i]){ print "$i行目<BR>\n"; } else{ print "$i行目。これはありません。<BR>\n"; print "$FILES[$i]<BR>\n"; print "$buffer<BR>\n"; } } ログの1行目と同じものとときだけ、きちんとした結果がでます。 上記のほかにもいろいろやりましたができませんでした。

    • ベストアンサー
    • CGI
  • はじめまして

    はじめまして 現在、PerlのMVCフレームワークCatalystのperlソースコード内で ボタンを押すと、ユーザーにとあるファイルをダウンロードさせたい と考え、以下のように実装しました my $filedir = '/var/www/html/Catal/lib/Catal/Controller/'; my $filename = 'test.zip'; my $filepath = $filedir . $filename; print "Content-type:application/download; name=\"$filename\"\n"; print "Content-Disposition: attachment; filename=\"hogehoge\"\n\n"; open(FILE,"< $filepath"); binmode FILE; binmode STDOUT; print while(<FILE>); close(FILE); 上記コードを動かすとIEのページにZIPファイルがバイナリ表示されるだけで ダウンロードダイアログすら出ません。 どうしたら、ダイアログを表示させ、ユーザーが望む場所にダウンロード させることができるでしょうか。 よろしくお願いします。

  • cgiログファイルの書き込みに余計なスペースが入る。

    ---------- #ここでログファイルに書き込みを行う。 open(FH,">>log.log"); print FH"ID=$ID&COUNT=$COUNT\n"; close(FH); #ログファイルをさらに開く。 open FILE, "<log.log"; flock(FILE,2); @log = <FILE>; flock(FILE,8); close FILE; ログファイルを並び替えてその順番で書き込み。 $gyou = @log; @sort=sort{(split(/&/,$b))[1] cmp (split(/&/,$a))[1];} @log; print "<FONT COLOR=RED>@sort</FONT><BR>\n"; open(FILE2, ">log.log"); print FILE2"@sort"; close (FILE2); ---------- というように行っていますが、一番最初のID=01&とかの前に半角スペースが入ります。 下の行に行くほどスペースが増えます。 どこが原因でしょうか?

    • ベストアンサー
    • Perl
  • PHPのファイルの読み方のコード

    下記はpearlのファイルの読み込みです #!/usr/local/bin/perl print "Content-type: text/html\n"; print "\n"; require './jcode.pl'; if (!open(IN,"$userfile")) { &error("投稿データファイルを開けません"); } @DATA = <IN>; @DATA = reverse(@DATA); close(IN); foreach $line (@DATA){ ($f1,$f2,$f3) = split(/,/, $line); &jcode'convert(*line,'sjis'); push(@CS,$line); } foreach (1.. 100) { ($f1,$f2,$f3) = split(/,/, $CS[$_]); print "$f1\n"; } exit; ############################################## foreach (1.. 100) { ($f1,$f2,$f3) = split(/,/, $CS[$_]); print "$f1\n"; } この部分のPHPのコ-ド書き方をお願いします

    • ベストアンサー
    • PHP
  • バックグラウンド処理をforkする意味

    初歩的な質問かもしれませんが… デーモンなどではなく、あくまでも通常のCGIスクリプトにおいて、何か重い処理をさせる場合は、STDOUTをcloseして処理はforkで生成した子プロセスにさせる、するとユーザーを待たせることなく(ブラウザをビジーから開放し)処理はバックグラウンドで実行される、という方法がよく見られるのですが、素朴な疑問があります。 ブラウザを開放させるにはSTDOUTをcloseすれば良い、 では、なぜ処理を子プロセスにさせなければならない? という点です。 一応、以下のような簡単なコードで試してみました。 ----------------- use Date::Format; my $log_file = 'hogehoge/test.log'; my $start = time2str('%m-%d %T', time); print "Content-Type: text/plain\n\n"; print "start:$start"; close(STDOUT); &heavy_exe($start); exit; sub heavy_exe { my $start = $_[0]; sleep(15); my $now = time2str('%m-%d %T', time); open(LOG, ">>$log_file") or &error('cant_open'); print LOG "$start\t$now\n"; close(LOG); } ----------------- 実行してみると、ブラウザはすぐさま開放される(読み込み完了になる)のと、15秒後にロギングも問題なく行われ、また本当に開放されていることを確認するために表示から15秒以内にリロードさせても、問題なく2プロセスとも動いていました。 以上を見る限りでは、forkなんてしなくても単にブラウザを開放するだけでいい、STDOUTをcloseするだけでバックグラウンド処理されると思うのですが、どうなのでしょう。 あるいは何か環境に依存した、子プロセスにさせなければならない理由などがあるのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • CGI
  • CGI経由でのPDFファイルをダウンロード

    こんにちは。 CGIの初心者です。 今CGI経由でのPDFファイルをダウンロードするというプログラムを作っています。 ただ、ダウンロードしたファイルは開けなく、エラーが出ます。ファイルを確認すると0バイトです。原因はよく分からないので、誰かが教えてください。ありがとうございます。 コードです: $filename = './data/sheet.pdf'; $source = $filename ; print qq|Content-type: text/plain\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); binmode FILE; binmode STDOUT; while(read(FILE, $value, 4096)){ print $value; } close FILE;

    • 締切済み
    • CGI
  • CGIで二つの仕事をしたい

    464487で質問したOtanoshikeです。 メール送信CGIは_mer_さんに教えて頂いたように直したら、無事動くようになりました。 今度は、このCGIの中で、メール送信後にファイル転送をしようとしています。 一応動いてはいるようなのですが、最後の確認ページが出ません。 どこが悪いのでしょうか?恐らくはまた基本的なことを無視しているのでしょうね。 よろしくお願いいたします。 (a.cgi) #!/usr/bin/perl require '../mimew.pl'; require '../jcode.pl'; $sendmail = "/var/qmail/bin/sendmail"; $master_id = "ho\@hoge.net"; $msg="メッセージ"; &jcode'convert(*msg,'jis'); open (ML,"| $sendmail $master_id"); print ML $msg; close(ML); $filename=$ARGV[0]; $file="/~/~/$filename"; $filetype='x-exe'; print "Content-Disposition:attachment;filename=\"$filename\"\n"; print "Content-type:application/$filetype\n\n"; open(FILE,"$file"); while(<FILE>){ print "$_"; } close FILE; print "Content-type: text/html\n\n"; print "<html><head>\n"; print "</head>\n"; print "<body>sent.\n"; print "</body></html>\n"; exit;

    • ベストアンサー
    • CGI
  • ログファイルの指定行に書込み

    open(IN,"$log") || &error("Open Error"); @data = <IN>; close(IN); while (100 <= @data) { pop(@data); } open(OUT,">$log") || &error("Write Error"); print OUT "$in{'id'}<>$in{'comment'}\n"; print OUT @data; close(OUT); ログにはID、時間、コメントが登録されています。 送信データの中に、ログに登録済みのIDがある場合には、そのIDのある行のみを書き換えたいのですが、方法がどうしてもわかりません。 $logに記録されるIDの順番は以下のようにランダムです。IDに登録される文字列は1からの数値のみです。 52<>コメント 120<>コメント 35<>コメント 8<>コメント 2<>コメント 19<>コメント 85<>コメント よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 掲示板を全削除機能にしたいのですが

    現在使っている掲示板は投稿を個別に削除は出来るのですが、一括削除は出来ません。一括削除だけしたいのですが、一括削除できる定型文のようなものはあるのでしょうか?よろしくお願いします。(Iモード用BBSです。本CGIスクリプトのメンテ部分です。) sub mainte { my($del) = (0); if($form{'pass'} ne $mainte_pass){ &error ("bad password."); } $out_val{'pass'} = $form{'pass'}; if($form{'id'}){ # delete if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); open (OUT, "> $log_file.$$") or &error ("can't open $log_file.$$ to write $!"); $del = 0; while(<IN>){ if(/^$form{'id'}\t/){ $del = 1; next; }else{ print OUT $_; } } close IN; close OUT; if($del){ rename $log_file, "$log_file.bak"; rename "$log_file.$$", $log_file; chmod 0666, $log_file; $msg = qq|$form{'id'}番の投稿を削除しました。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); }else{ unlink "$log_file.$$"; $msg = qq|$form{'id'}番の投稿は存在しません。<BR>\n <A href="$out_val{'cgi_name'}">戻る</A>|; &error($msg); } } }else{ if(&lock($log_file, 5)){ open (IN, "< $log_file") or &error ("can't open $log_file to read. $!"); while(<IN>){ ($id, $time, $name, undef, $title ) = split "\t"; $out_val{'del_list'} .= qq|$id, $time, $name, $title<BR>\n|; } &page_out($mainte_page); } } unlock($log_file); return 1; }

    • ベストアンサー
    • CGI

専門家に質問してみよう