• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:phpのエラー(Warning: explode() [functio)

PHP5のサーバーでのエラーについて

このQ&Aのポイント
  • PHP4のサーバーでは問題なく動作していたプログラムが、PHP5のサーバーでエラーが表示されます。
  • エラーの内容は、Warning: explode() [function.explode]: Empty delimiterとWarning: Invalid argument supplied for foreach()です。
  • エラーが出ている箇所は、ファイル1では explode()関数とforeach()文、ファイル2では explode()関数とforeach()文が含まれています。

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

  • ベストアンサー
回答No.3

 LB()は$_SERVER['SERVER_SOFTWARE']の中に"win"か"unix"か"CentOS"のどれかの文字列が入っていないと値を返してこないわけですよね。  じゃあ最初に確かめなければならないことは、$_SERVER['SERVER_SOFTWARE']がどういう値を持ってるかということです。  変数の中身は <? PHP echo $_SERVER['SERVER_SOFTWARE']; ?> とだけ書いたPHPソースでも作ってサーバー上に置き、それをブラウザで開けば見ることが出来ますよね。  ネットで拾った一例だと Apache/2.2.8 (Win32) PHP/5.2.6 というような値が入ってるようです。  サーバーがApacheだと、この文字列を設定してあるのはhttpd.confの中のServerTokensというところです。 ServerTokens ××× とある×××の部分が設定値で、ここが Full か OS でないとOSの名称(つまり"win"とか"unix"とか"CentOS"という文字列を含んだ情報)が入りません。Minimal(Min)とかProductOnly(Prod)の場合は、FullかOSに変える必要があります。 (ま、使用OSが書かれていないから、それ以外のOSだからLB()が対応していないだけという可能性もありますが…)

php_hard
質問者

お礼

この度はお世話になりました。 OSはFreeBSD です。 ただ function LB() { if(eregi("win",$_SERVER['SERVER_SOFTWARE'])) return "\r\n"; if(eregi("unix", $_SERVER['SERVER_SOFTWARE'])) return "\n"; if(eregi("CentOS", $_SERVER['SERVER_SOFTWARE'])) return "\n"; } に if(eregi("FreeBSD", $_SERVER['SERVER_SOFTWARE'])) return "\n"; としても解決しなかったので(間違っているせいか・・)、LB()を'\n'に置き換えたところ、エラーは出なくなりました。

その他の回答 (2)

回答No.2

> $_SERVER['SERVER_SOFTWARE'] これに正しく期待する値が入ってるかどうかが問題でしょう。 マニュアルには「レスポンスヘッダ上に書かれているサーバの認識文字列」とありますが、サーバの設定によるものじゃないでしょうか。

php_hard
質問者

お礼

ご連絡ありがとうございます。 ご指摘のとおり、以前のサーバーでは問題がなかったのですが、上記のサーバーに変更した際にエラーが発生したので、設定が原因かと思うのですが、修正するにあたり、『正しく期待する値』をどうすればということが分からず悩んでおります。 PHPの知識不足でこれをうまく解決することができずにいる状態です・・。

回答No.1

とりあえず、関数が成否を返すものはちゃんとそれをチェックしましょう。 エラー内容はexplodeで指定されてるデリミタが空だってこと。 LB()っての、何の関数だかわかりませんが、ちゃんと値を返していますか? explodeがエラーだから、以降の$bufにはfalseが入ってるだけなので、これを文字列配列としてデータを取り出そうとしたら全部エラーになるに決まってます。 まず、LB()が何を返しているのか確認してください。

php_hard
質問者

お礼

このたびは回答ありがとうございました。 誤って”回答の補足”としてお礼をしてしまいました。 上記に加え更に補足としてLB()に関する記述部分を以下に追加しておきます。 (1つ目) function LB() { if(eregi("win",$_SERVER['SERVER_SOFTWARE'])) return "\r\n"; if(eregi("unix", $_SERVER['SERVER_SOFTWARE'])) return "\n"; if(eregi("CentOS", $_SERVER['SERVER_SOFTWARE'])) return "\n"; } (2つめ) $write .= $arr['id']."\t". $arr['name']."\t". "*\t". "*\t". "*\t". "*\t". "*\t". "*\t". "0\t". "0\t". "0\t". "0\t". "0\t". "0\t". //13番目は表示順rank "0\t". "0\t". "0\t". "0\t". "OFF\t". "0\t". "0\t". "0\t". "0\t". "0\t". "0\t". "0\t". "0\t"; //画像ファイル名結合 for($photo=1; $photo <= MAX_PHOTO; $photo++ ){ $write .= "0\t"."0\t"; } for($photo=1; $photo <= MAX_MPHOTO; $photo++ ){ $write .= "0\t"; } //画像ファイル名(一覧用) $write .= "0\t"; $write .= LB(); (3つ目) $fname = "galslist.dat"; $buf = file_get_contents($fname); $buf = explode(LB(), substr($buf, 0, strlen($buf) - strlen(LB()))); if( $type == "pc" ){ $temps = file_get_contents("../template/dit_pc.html"); }else if( $type == "mob" ){ $temps = file_get_contents("../template/dit_mob.html"); } foreach($buf as $key => $value) { $buf[$key] = explode("\t", $value); if(empty($buf[$key][13]) || $buf[$key][13] <=0) unset($buf[$key]); } usort($buf, "GALSORT"); 以上以外にもLB()はありますが、文字数制限のため記述出来ませんでした。 modules.phpファイルをすべて記載できるともっと分かりやすいかと思いますので、上記のみで問題の解決が難しい場合は、その分を分割して掲載するようにさせて頂きます。 よろしくお願いします。

php_hard
質問者

補足

回答ありがとうございます。 LB()は以下になります。 modules.php OSに応じた改行マークの設定。 function LB() { if(eregi("win",$_SERVER['SERVER_SOFTWARE'])) return "\r\n"; if(eregi("unix", $_SERVER['SERVER_SOFTWARE'])) return "\n"; if(eregi("CentOS", $_SERVER['SERVER_SOFTWARE'])) return "\n"; } ちなみに以下のサーバーではエラー無く動作しました。 [WEB] apache_1.3.41 [LANG] php-4.3.9 修正箇所がよく分からない状態です・・・。 問題解決にあたり、他に必要な情報がありましたら、ご連絡いただけますでしょうか? よろしくお願いします。

関連するQ&A

専門家に質問してみよう