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

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

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

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

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

  • ベストアンサー
回答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

  • phpで重複チェック

    phpの重複チェック phpで配列の重複データをチェックして、重複しているデータを表示しようとしています。 foreach ($arry as $key => $value) { $err_count = 0; foreach ($arry as $key => $value2) { if ($value == $value2) { $err_count++; if ($err_count >= 2) { echo "重複".$value2; } } } } としているのですが、 同じモノが2回表示されて困っています。 重複しているデータは一回だけ表示したいのですが、 なにか方法ないでしょうか?

    • ベストアンサー
    • PHP
  • PHP4でのXMLデータの取り扱い

    Webサービスを利用してXMLデータを取得するスクリプトをPHPで書いています。レンタルサーバの関係でバージョンは4.4.4しか使えません。 XMLを扱う関数というと、PHP5ではsimpleXMLやXMLReaderなどがあるようで、各要素へアクセスするにも $xml=simplexml_load_file('books.xml'); foreach($xml->book as $book){ .... という感じでオブジェクトとしてアクセスできるようですが、こういうのをPHP4で実現する方法はないのでしょうか?例えば入れ子になったデータだと、深い階層にたどりつくために foreach($results as $key => $value){ foreach($value $key2 => $value2){ foreach($value $key3 => $value3){ ... } } } みたいな感じで書いているのですが、まったくスマートではないですし、なにか間違っているような気がします。良い方法があればお教えください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • php4、php5によるimplode()、file()の動作の違い?

    お世話になります。 SJISのファイルで、 //----コメント //あああ //--------------- あああ,いいいいいいいいいいいいい ううううう,えええええええええええええ のようなファイルを作成して $csv へこSJISファイルのファイルパスを設定し、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\r\n",$FielList); foreach($RowData as $Value) { $FName=trim($FName);$Cmnt=trim($Cmnt); echo '$FName='.$FName.'<br> $Cmnt='.$Cmnt.'<br>'; } と、その内容を見ると php5では、 $FName=//あああ $FName=//--------------- $FName=あああ $Cmnt=いいいいいいいいいいいいい $FName=ううううう $Cmnt=えええええええええええええ と、想定の結果が得られます。 しかし、php4だと、 $FName=//あああ//--------------- となってしまい、どうもcsvファイルの内容が\r\nにより仕切られて配列とならないようです。 そこで、 $FielList = mb_convert_encoding(@implode('###', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("###",$FielList); とすれば、php4,php5でも動作します。 また、 $FielList = mb_convert_encoding(@implode('', @file($csv,FILE_SKIP_EMPTY_LINES)), "UTF-8", "SJIS"); $RowData = split("\n",$FielList); とすると、php4で予想の結果が返されますが、 php5では、echo で何も表示されなくなります。 ません。 php4、php5による \r\nの扱いの違い implode()の動作の違い file()の動作の違い だと思うのですが、どのように違うのかがわかりません。 このあたりのことをおわかりの方、 implode('###',@file(・・・ ) と記述しなくても implode('',@file(・・・ ) と記述することによりphp4、php5で同じように動作する方法がわからないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでファイルから取り込んだ数字で計算できない

    test.txtの内容 ------ 10 ------ のとき、 <? $file="test.txt"; //ファイルの中の行を配列に格納 $ary=file($file); //テキストファイル内の数字を取得 foreach ( $ary as $key => $value ) { $value = str_replace(array("\r\n","\r","\n"), "", $value); if (strlen($value )>0){ $a=trim($value); } } $a=$a+1; print $a; ?> として、11が出力されることを期待したのですが、 1が出力されてしまいます。 11を出力されるにはどうしたらよいでしょうか? どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpを使ってxmlの追加書き出しについて教えてください

    現在flashからphpに位を渡して、そこからxmlで書き出すということをしています。 phpからxmlを作成することは、なんとか無事にできるのですが、この場合一つのXMLデータしか作成できません。 fopen($fname."a")を使って追加で作成しようとすると $buf ="<?xml version=\"1.0\" encoding=\"" . $encode."\" ?> \r\n"; が二重に作成されてエラーが出ます。なにか解決策はないでしょうか? お願いします。 ソース ------------------------------------------------------------ <? function xml_write($fname,$roottag,$id,$encode,$val) { $file = fopen($fname,"w"); // XMLヘッダ書き出し // $buf ="<?xml version=\"1.0\" encoding=\"" . $encode."\" ?> \r\n"; fputs($file,$buf); // XMLルート書き出し // fputs($file,"<".$roottag.">\r\n"); // XMLルート書き出し1 // fputs($file,"<".$id.">\r\n"); // XML本文書き出し // foreach($val as $key => $oneval) { fputs($file,"<".$key.">" . $oneval . "</".$key.">\r\n"); } // XMLルート書き出し1 // fputs($file,"</".$id.">\r\n"); // XMLルート終了 // fputs($file,"</".$roottag.">\r\n"); fclose($file); } xml_write("./test/test.xml","doc","object","Shift_JIS",$_POST); ?> -----------------------------------------------------------------

    • ベストアンサー
    • PHP
  • 複数フォルダに格納されたファイル名取得VBA

    お世話になっております。 あるフォルダに複数のフォルダが格納されており、更にそのフォルダの中にあるファイルの情報を取得するプログラムを書いたのですが、実行すると下記のようなエラーとなってしまいます。 ■エラー プロシージャの呼び出し、または引数が不正です 下から3行目、「buf = Dir()」が問題であることはわかるのですが、 何が問題でどのように解決したらいいかわかりません。 どなたかご教授の程よろしくお願い致します(>_<) ------------------------------------------------------------------------ Sub test() Dim buf As String Dim fName As String Dim msg As String buf = Dir("*.*", vbDirectory) Do While buf <> "" If GetAttr(buf) And vbDirectory Then If buf <> "." And buf <> ".." Then fName = Dir(CurDir & "\" & buf & "\" & "*.jpg") Do While fName <> "" cnt = cnt + 1 Cells(cnt, 1) = buf Cells(cnt, 2) = fName msg = msg & buf & "\" & fName & vbCrLf fName = Dir() Loop MsgBox msg End If End If buf = Dir() Loop End Sub ------------------------------------------------------------------------ これが実現できないと細かい作業を毎日繰り返す事となり、 かなり業務不可が高いです。。 繰り返しになってしまいますが、どなたかご回答よろしくお願い致します。

  • [初歩?]FOREACHの構文エラーの原因がわからない

    下記を表示すると Warning: Invalid argument supplied for foreach() in とエラーになってしまい、どうしても原因がわからないのですが・・ よろしくお願い致します <html> <body> <form action="$PHP_SELF" method="post"> <input type="radio" name="q2[]" value="0"<?php foreach ($_POST['q2'] as $q2_sel) { if ( $q2_sel == '0') { echo " selected"; }} ?>>男 <input type="radio" name="q2[]" value="1"<?php foreach ($_POST['q2'] as $q2_sel) { if ( $q2_sel == '1') { echo " selected"; }} ?>>女 </form> </body> </html>

    • ベストアンサー
    • PHP
  • 全角ファイル名をアップロードすると文字化け

    複数のファイルをアップロードできるスクリプトを作成しています。 サーバはWindows、PHPのバージョンは5です。 利用者の要望で日本語のファイル名もアップロードできるようにしたいのですが、文字化けします。 http://okwave.jp/qa1724442.html を参考にし、下記のスクリプトを move_uploaded_file($att_tmp, mb_convert_encoding($att_name,"UTF-8")); と、変更もしてみましたが、うまくいきません。 $valueは文字化けせずに表示されていますが、サーバ上ではファイル名が「逋コ陦ィ謇ソ隱阪す…」という風に化けてしまいます。 対策を教えて頂けませんでしょうか。 よろしくお願いします。 if (isset($_POST["submit"])){ //添付ファイル用変数 foreach($_FILES["att"]["error"] as $key => $error_a){ if($error_a == UPLOAD_ERR_OK){ $att_na = $_FILES["att"]["name"][$key]; $att_tmp = $_FILES["att"]["tmp_name"][$key]; $att_type = $_FILES["att"]["type"][$key]; $att_size = $_FILES["att"]["size"][$key]; if (strlen($att_na)>0){ //ファイル移動 list($att_nam,$k) = explode(".",$att_na); $ymdhis = date("YmdHis"); $att_name = "{$att_nam}-{$ymdhis}.{$k}"; move_uploaded_file($att_tmp, "file/$att_name"); $att_name_ar[] = $att_name; foreach($att_name_ar as $value){ echo $value."<br>"; } } } }

    • ベストアンサー
    • PHP
  • PHP初心者です。エラーが出て困っております。

    ※下記がスクリプトです。((エラーは最下部にございます。) <?php require('../dbconnect.php'); session_start(); if (!empty($_POST)) { // エラー確認 if (isset($_POST['name']) == '') { $error['name'] = 'blank'; } if (isset($_POST['mail1']) == '') { $error['mail1'] = 'blank'; ..........省略 } } // 重複アカウントチェック if (isset($_POST['mail1'])) { if (empty($error)) ; $sql = sprintf('SELECT COUNT(*) AS cnt FROM ○○ WHERE mail1="%s"', mysql_real_escape_string($_POST['mail1']) ); $record = mysql_query($sql) or die(mysql_error()); $table = mysql_fetch_assoc($record); if ($table['cnt'] > 0) { $error['mail1'] = 'duplicate'; } } if (empty($error)) { // 画像をアップロードする $upfile = date('YmdHis') . $_FILES['upfile']['name']; move_uploaded_file($_FILES['upfile']['tmp_name'], '../member_picture/' . $upfile); $_SESSION['join'] = $_POST; $_SESSION['join']['upfile'] = $upfile; header('Location: check.php'); } } // 書き直し if (isset($_REQUEST['action']) == ('rewrite')) { $_POST = $_SESSION['join']; $error['rewite'] = true; } ?> <html.....省略 <body> <h1>会員登録</h1> <div id="content"> <p>記入ください。</p> <form action="" method="post" enctype="multipart/form-data"> <dl> <dt>ニックネーム<span class="required">必須</span></dt> <dd> <input type="text" name="name" size="35" maxlength="255" value="<?php if (isset($_POST['name'])) {echo htmlspecialchars($_POST['name'],ENT_QUOTES, 'UTF-8'); } ?>" /> <?php if (!isset($error['name'])) {$error['name']="blank";} if ($error['name'] == 'blank'): ?> <p class="error">* ニックネーム</p> <?php endif; ?> </dd>................続く ※エラーは、 Notice Undefined index: name in....... です。 どうすれば上記エラーが消えますでしょうか? また、その際はどこをどのように直せばよろしいでしょうか。 お手数をおかけ致しますが、お力をお貸しいただければ嬉しく思います。 お願い致します。

    • ベストアンサー
    • PHP
  • PHPのエラーを無視したい

    phpで以下のエラーが出ます。 原因は初期値の関連の問題のようですが、この警告が出ないようにする方法を教えてください。 Warning: Creating default object from empty value

    • ベストアンサー
    • PHP

専門家に質問してみよう