- 締切済み
fopenが動作しない
PHPで、別のファイルで取得したファイル名をもとに fopenを使ってファイルを開こうとしているのですが、 どうしてもうまくいきません。 具体的な症状は以下のとおりです。 a.phpの中で、 … $file[2] = "hoge02.xml"; … のように、配列にファイル名を代入します。 これを b.php で require_once('a.php'); とした後 print_r($file); とすると Array([0] => … [2] => "hoge02.xml" [3]…) のように表示されるところまでは確認できました。 しかし、 $file0 = $file[2]; $fp = fopen("$file0", 'r'); とすると Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.php の絶対アドレス] とエラーが出てしまい、実行することが出来ません。 そこで、 //$file0 = $file[2]; $file0 = "hoge02.xml"; $fp = fopen("$file0",'r'); とすると実行することが出来ました。 作成しているシステム上、fopenの1つ目の引数には変数または配列を使いたいのですが、 エラーが発生してどうしてもうまくいきません。 自分なりにも似たようなエラーがないか調べたのですが、 それらしいものを見つけることが出来ず、お手上げ状態です。 どなたか解決策をご存じないでしょうか。 ご教授の程、よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- wish46
- ベストアンサー率78% (29/37)
print_r で出力したとき array([0] => … [2] => "hoge02.xml" [3]…) と [2]=>"hoge02.xml" ダブルクォーテーションが余計に表示されていますが、多分これが原因だと思います。 [a.php] <?php $file[2] = "hoge02.xml"; ?> [b.php] <?php require_once('a.php'); print_r($file); $file0 = $file[2]; if($fp = fopen($file0,'r')) print "OK"; else print "NG"; ?> 上記をそのままコピペしてみてください。
- wish46
- ベストアンサー率78% (29/37)
require_once('a.php'); print($file[2]); $file0 = $file[2]; のあとに file_exists($file0); でどのような結果になりますか?
補足
No.3の方への補足に記載したプログラムに 以下のものを追記して試してみました。 - - - - - - - - - - - - 8< - - - - - - - - - - - - $file0 = $file[2]; //$file0 = "hoge02.xml"; if(file_exists($file0)) { print("file exists."); } else { print("file doesn't exist."); } $fp = fopen($file0, 'r'); - - - - - - - - - - - - 8< - - - - - - - - - - - - 結果は『file doesn't exist.』と表示されました。 また、1・2行目を //$file0 = $file[2]; $file0 = "hoge02.xml"; としたところ、『file exists.』と表示されました。 ただ、代入するアドレスに絶対アドレスを 『$file0 = "http://hoge.co.jp/hoge.xml"』 のようにして代入すると『file doesn't exist.』 と表示されました。 基本的に、アドレスは絶対アドレスで指定した上で 使用したいと思っています。
- sakusaker7
- ベストアンサー率62% (800/1280)
print_r って制御コードとかはどう表示してくれるのでしたっけ? #3の方の情報のついでに、 if ($file[2] == "hoge02.xml") という判定をしたときに真と偽のどちらにになります?
お礼
sakusaker7さん、ご回答ありがとうございました。 先ほどなんとか問題を解決することが出来ました。 No.5のご回答へのお礼にも書きましたが、 ファイル名の前に空白文字を挿入していたことが 原因で読み込みが出来なかったようです。 一緒に解決策を探ってくださり、ありがとうございました。 1人で抱え込んでいた問題だったのでとても心強かったです。
補足
>print_r って制御コードとかはどう表示してくれるのでしたっけ? 試しにa.phpで$file[2]に『\n"hoge02.xml"』を 代入して以下のプログラムを実行してみました。 (質問のご意向に沿っていないかもしれません…違っていたらすみません) No.2の方へ補足したプログラムの、複数行コメントを取り除いただけのものです。 - - - - - - - - - - - - 8< - - - - - - - - - - - - <?php mb_language("Japanese"); require_once('a.php'); print_r($file); print($file[2]); $file0 = $file[2]; //$file0 = "hoge02.xml"; $fp = fopen($file0, 'r'); if($feed[2]=="hoge02.xml") { print("<br>reading OK<br>"); } else { print("<br>reading FALSE<br>"); } ?> - - - - - - - - - - - - 8< - - - - - - - - - - - - 実行結果は以下の通りです。 - - - - - - - - - - - - 8< - - - - - - - - - - - - Array ( [0] => … [2] => \n"hoge02.xml" …) \n"hoge02.xml" Warning: fopen( \x0a"hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.phpの絶対アドレス] on [『$fp = fopen($file0, 'r');』が書かれている行] reading FALSE - - - - - - - - - - - - 8< - - - - - - - - - - - - 代入する値を『"hoge02.xml"』のみにした場合も、 print_rとprintで出力した部分の『\n』が取れた以外 同じように表示されました。 printでは中身が表示されていたので、 $file[2]はb.phpで使える変数なのかと思っていました。 偽として認識されていなかったということは、 やはりb.phpで使う変数として有効でないということでしょうか…?
- asuncion
- ベストアンサー率33% (2127/6289)
> $fp = fopen($file0, 'r'); > として試してみましたが、やはり同じエラーが出てしまいました… $file0に代入している箇所を含めて、 現在のスクリプトとエラーメッセージを 見せてください。
お礼
asuncionさん、ご回答ありがとうございます。 No.5のご回答へのお礼にも書いたのですが、 ファイル名を代入する際、ファイル名の前に 空白文字が入っていたことが原因で ファイルの読み込みが出来ないようでした。 一緒に解決策を考えてくださり、大変感謝しています。 ありがとうございました。
補足
以下のプログラムを実行しました。 - - - - - - - - - - - - 8< - - - - - - - - - - - - <?php mb_language("Japanese"); require_once('a.php'); print_r($file); print($file[2]); $file0 = $file[2]; //$file0 = "hoge02.xml"; $fp = fopen($file0, 'r'); /* if($file[2]=="hoge02.xml") { print("<br>reading OK<br>"); } else { print("<br>reading FALSE<br>"); } */ ?> - - - - - - - - - - - - 8< - - - - - - - - - - - - 以上のプログラムを実行すると、以下のように表示されました。 - - - - - - - - - - - - 8< - - - - - - - - - - - - Array ( [0] =>… [2] => "hoge02.xml"… ) "hoge02.xml" Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.phpの絶対アドレス] on [『$fp = fopen($file0, 'r');』が書かれている行] - - - - - - - - - - - - 8< - - - - - - - - - - - -
- sakusaker7
- ベストアンサー率62% (800/1280)
> $file0 = $file[2]; > $fp = fopen("$file0", 'r'); なぜ $file0 をダブルクォートでくくっているのでしょうか? 単に $fp = fp($file0, 'r'); でよいように思うのですが。
補足
早速のご回答、ありがとうございます。 $file[2] = "hoge02.xml"; とする前に $file[2] = hoge02.xml; としており、ダブルクォートを入れたままにしていました。 $fp = fopen($file0, 'r'); として試してみましたが、やはり同じエラーが出てしまいました…
お礼
wish46さん、ご回答ありがとうございます。 先ほど漸く問題を解決することが出来ました。 どうやらファイル名を代入するとき、 ダブルクォーテーションとファイル名の間に 空白文字が挿入されていたようでした。 sakusaker7さん、asuncionさんにもお礼申し上げたいのですが、 1週間ほどずっと上記のことで1人で頭を悩ませていたので、 一緒に問題を考えてくださる方がいるというだけでも とても心強かったです。 本当に、ありがとうございました。