電子書籍の厳選無料作品が豊富!

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

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

A 回答 (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";

?>

上記をそのままコピペしてみてください。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/03/03 03:51

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

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

補足日時:2008/03/02 09:10
    • good
    • 0

print_r って制御コードとかはどう表示してくれるのでしたっけ?


#3の方の情報のついでに、

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

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

この回答への補足

>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
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/03/03 03:55

> $fp = fopen($file0, 'r');


> として試してみましたが、やはり同じエラーが出てしまいました…

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

この回答への補足

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

- - - - - - - - - - - - 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
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/03/03 03:59

> $file0 = $file[2];


> $fp = fopen("$file0", 'r');

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

この回答への補足

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

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

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

補足日時:2008/03/01 17:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!