みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

phpのエラー(Warning: explode() [functio

phpのエラー(Warning: explode() [function.explode]: Empty delimiter in..)と(Warning: Invalid argument supplied for foreach() in)

PHP4のサーバーにて問題なく作動しているプログラムなのですが、PHP5のサーバーにて設置したところ、以上のエラー表示がされ、解決策が見つからず質問いたしました。

エラーの出たサーバー情報
PHP Version 5.2.11
Server API Apache

エラーの出たファイル1
---------------------
$fname = "als_admin/alslist.dat";
$fp = fopen($fname, "r");
$buf = fread($fp, filesize($fname));
$buf = explode( LB(), substr($buf, 0, strlen($buf)-strlen(LB()) ) );    ※

//tab毎に分割
foreach($buf as $key => $value) { //表示対象を抽出   ※
$buf[$key] = explode("\t", $value);
}

//詳細情報に代入
$write = "";
foreach($buf as $key => $value)     ※
{
//idが一致するデータのみを取得
if( $value[0] != $_GET['id'] ){
continue;
}

//非表示中はアクセス不可(一覧には出ないが直リン対策)
if( $value[13] < 0 ){//リストNoがマイナスになっている
exit("ページが存在しません。<a href=\"top.php\"> TOPへ</a>");
}

//データをセット
foreach($gkey as $fk => $fv){
$g[$fv] = $value[$fk] ? $value[$fk] : "";
}

break;
}

エラーの出たファイル2
---------------------
<?
include "../modules.php";


if(empty($_GET['r'])) : //リスト表示の場合
$fname = "galslist.dat";
$buf = file_get_contents($fname);

if(!empty($buf)) {
$buf = explode( LB(), substr( $buf, 0, strlen($buf) - strlen(LB()) ) ); ※

foreach($buf as $key => $value) {     ※
$buf[$key] = explode("\t", $value);
if(isset($buf[$key][13]) && $buf[$key][13] > 0)
$view[] = $buf[$key];
else
$noview[] = $buf[$key];
}
}
endif;
?>


エラー表示が出たところに※印をいれました。
文字数制限があり、お答えを頂く上で以上の記載で足らない部分がありましたらご指摘頂けますでしょうか。恐れ入りますがよろしくお願いします。

投稿日時 - 2010-07-24 02:54:36

QNo.6059917

困ってます

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

 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()が対応していないだけという可能性もありますが…)

投稿日時 - 2010-07-24 23:48:20

お礼

この度はお世話になりました。

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'に置き換えたところ、エラーは出なくなりました。

投稿日時 - 2010-07-25 04:15:38

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

> $_SERVER['SERVER_SOFTWARE']

これに正しく期待する値が入ってるかどうかが問題でしょう。

マニュアルには「レスポンスヘッダ上に書かれているサーバの認識文字列」とありますが、サーバの設定によるものじゃないでしょうか。

投稿日時 - 2010-07-24 16:12:42

お礼

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

PHPの知識不足でこれをうまく解決することができずにいる状態です・・。

投稿日時 - 2010-07-24 16:30:47

ANo.1

とりあえず、関数が成否を返すものはちゃんとそれをチェックしましょう。

エラー内容はexplodeで指定されてるデリミタが空だってこと。
LB()っての、何の関数だかわかりませんが、ちゃんと値を返していますか?

explodeがエラーだから、以降の$bufにはfalseが入ってるだけなので、これを文字列配列としてデータを取り出そうとしたら全部エラーになるに決まってます。

まず、LB()が何を返しているのか確認してください。

投稿日時 - 2010-07-24 04:28:59

補足

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

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

修正箇所がよく分からない状態です・・・。

問題解決にあたり、他に必要な情報がありましたら、ご連絡いただけますでしょうか?
よろしくお願いします。

投稿日時 - 2010-07-24 14:37:43

お礼

このたびは回答ありがとうございました。

誤って”回答の補足”としてお礼をしてしまいました。

上記に加え更に補足として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ファイルをすべて記載できるともっと分かりやすいかと思いますので、上記のみで問題の解決が難しい場合は、その分を分割して掲載するようにさせて頂きます。

よろしくお願いします。

投稿日時 - 2010-07-24 16:24:58

あなたにオススメの質問