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

締切り済みの質問

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つ目の引数には変数または配列を使いたいのですが、
エラーが発生してどうしてもうまくいきません。
自分なりにも似たようなエラーがないか調べたのですが、
それらしいものを見つけることが出来ず、お手上げ状態です。

どなたか解決策をご存じないでしょうか。
ご教授の程、よろしくお願い致します。

投稿日時 - 2008-03-01 16:34:20

QNo.3823490

すぐに回答ほしいです

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

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

回答(5)

ANo.5

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";

?>

上記をそのままコピペしてみてください。

投稿日時 - 2008-03-02 11:13:07

お礼

wish46さん、ご回答ありがとうございます。

先ほど漸く問題を解決することが出来ました。
どうやらファイル名を代入するとき、
ダブルクォーテーションとファイル名の間に
空白文字が挿入されていたようでした。

sakusaker7さん、asuncionさんにもお礼申し上げたいのですが、
1週間ほどずっと上記のことで1人で頭を悩ませていたので、
一緒に問題を考えてくださる方がいるというだけでも
とても心強かったです。
本当に、ありがとうございました。

投稿日時 - 2008-03-03 03:51:24

ANo.4

require_once('a.php');

print($file[2]);
$file0 = $file[2];

のあとに

file_exists($file0);

でどのような結果になりますか?

投稿日時 - 2008-03-01 22:22:17

補足

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.』
と表示されました。

基本的に、アドレスは絶対アドレスで指定した上で
使用したいと思っています。

投稿日時 - 2008-03-02 09:10:30

ANo.3

print_r って制御コードとかはどう表示してくれるのでしたっけ?
#3の方の情報のついでに、

if ($file[2] == "hoge02.xml")

という判定をしたときに真と偽のどちらにになります?

投稿日時 - 2008-03-01 18:13:16

補足

>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で使う変数として有効でないということでしょうか…?

投稿日時 - 2008-03-01 19:19:07

お礼

sakusaker7さん、ご回答ありがとうございました。

先ほどなんとか問題を解決することが出来ました。
No.5のご回答へのお礼にも書きましたが、
ファイル名の前に空白文字を挿入していたことが
原因で読み込みが出来なかったようです。

一緒に解決策を探ってくださり、ありがとうございました。
1人で抱え込んでいた問題だったのでとても心強かったです。

投稿日時 - 2008-03-03 03:55:35

ANo.2

> $fp = fopen($file0, 'r');
> として試してみましたが、やはり同じエラーが出てしまいました…

$file0に代入している箇所を含めて、
現在のスクリプトとエラーメッセージを
見せてください。

投稿日時 - 2008-03-01 18:05:14

補足

以下のプログラムを実行しました。

- - - - - - - - - - - - 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< - - - - - - - - - - - -

投稿日時 - 2008-03-01 19:17:09

お礼

asuncionさん、ご回答ありがとうございます。

No.5のご回答へのお礼にも書いたのですが、
ファイル名を代入する際、ファイル名の前に
空白文字が入っていたことが原因で
ファイルの読み込みが出来ないようでした。

一緒に解決策を考えてくださり、大変感謝しています。
ありがとうございました。

投稿日時 - 2008-03-03 03:59:06

ANo.1

> $file0 = $file[2];
> $fp = fopen("$file0", 'r');

なぜ $file0 をダブルクォートでくくっているのでしょうか?
単に $fp = fp($file0, 'r'); でよいように思うのですが。

投稿日時 - 2008-03-01 16:40:55

補足

早速のご回答、ありがとうございます。

$file[2] = "hoge02.xml";
とする前に
$file[2] = hoge02.xml;
としており、ダブルクォートを入れたままにしていました。

$fp = fopen($file0, 'r');
として試してみましたが、やはり同じエラーが出てしまいました…

投稿日時 - 2008-03-01 17:28:18

あなたにオススメの質問