• 締切済み

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

みんなの回答

  • wish46
  • ベストアンサー率78% (29/37)
回答No.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"; ?> 上記をそのままコピペしてみてください。

totoko2007
質問者

お礼

wish46さん、ご回答ありがとうございます。 先ほど漸く問題を解決することが出来ました。 どうやらファイル名を代入するとき、 ダブルクォーテーションとファイル名の間に 空白文字が挿入されていたようでした。 sakusaker7さん、asuncionさんにもお礼申し上げたいのですが、 1週間ほどずっと上記のことで1人で頭を悩ませていたので、 一緒に問題を考えてくださる方がいるというだけでも とても心強かったです。 本当に、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • wish46
  • ベストアンサー率78% (29/37)
回答No.4

require_once('a.php'); print($file[2]); $file0 = $file[2]; のあとに file_exists($file0); でどのような結果になりますか?

totoko2007
質問者

補足

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)
回答No.3

print_r って制御コードとかはどう表示してくれるのでしたっけ? #3の方の情報のついでに、 if ($file[2] == "hoge02.xml") という判定をしたときに真と偽のどちらにになります?

totoko2007
質問者

お礼

sakusaker7さん、ご回答ありがとうございました。 先ほどなんとか問題を解決することが出来ました。 No.5のご回答へのお礼にも書きましたが、 ファイル名の前に空白文字を挿入していたことが 原因で読み込みが出来なかったようです。 一緒に解決策を探ってくださり、ありがとうございました。 1人で抱え込んでいた問題だったのでとても心強かったです。

totoko2007
質問者

補足

>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% (2126/6286)
回答No.2

> $fp = fopen($file0, 'r'); > として試してみましたが、やはり同じエラーが出てしまいました… $file0に代入している箇所を含めて、 現在のスクリプトとエラーメッセージを 見せてください。

totoko2007
質問者

お礼

asuncionさん、ご回答ありがとうございます。 No.5のご回答へのお礼にも書いたのですが、 ファイル名を代入する際、ファイル名の前に 空白文字が入っていたことが原因で ファイルの読み込みが出来ないようでした。 一緒に解決策を考えてくださり、大変感謝しています。 ありがとうございました。

totoko2007
質問者

補足

以下のプログラムを実行しました。 - - - - - - - - - - - - 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)
回答No.1

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

totoko2007
質問者

補足

早速のご回答、ありがとうございます。 $file[2] = "hoge02.xml"; とする前に $file[2] = hoge02.xml; としており、ダブルクォートを入れたままにしていました。 $fp = fopen($file0, 'r'); として試してみましたが、やはり同じエラーが出てしまいました…

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • windows環境でphpのfopenが使用できない

    rimyと申します。 windowsでapacheを使用していて、PHP5をインストールしています。 PHPは作動していて、スプリクトは実行できます。 しかしfopen関数を使ってファイルをロードしようとしたところ なぜかエラーが起きます。 fopen関数は fopen('ファイルパス','モード'); でやれるので やってみましたが、 Warning: fpassthru(): supplied argument is not a valid stream resource in C:\Apache\htdocs\test\reading.php on line 6 という表示が出ます。 ちなみにスプリクトは <html> <head><title>ファイルの読み出し</title></head> <body> <?php $text = fopen("test.txt","b""r"); fpassthru($text); ?> </body> </html> と書いてあります。 あるサイトで windows環境では モードにbを入れろ と書いてありましたがどういうことでしょうか。 まだ最近 勉強し初めでわかりませんのでよろしくお願いします。

    • ベストアンサー
    • PHP
  • Warningの意味・・・

    またなんですが、困っています・・・m(__)m Warning: fopen(./data/6-9.xml): failed to open stream: No such file or directory in /***/***/xmldoc.php on line 83 xml file[./data/6-9.xml] don't open... 上記のような表示になりました。 <xmldoc.php> /* XMLファイルを開く */ if(!($fp = fopen($this->xml_filename, "r"))) ←83 { die("xml file[" . $this->xml_filename . "] don't open..."); } $tmp = ""; $encord; 意味がよく分からなくて困っています。。 お力貸していただければと思います(><)

    • ベストアンサー
    • PHP
  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • fopenでファイルがオープンできません

    $fp = fopen(TEST_FILE, "w") としてオープンしようとすると Warning: fopen(mybasic9.txt): failed to open stream: No such file or directory と、オープンしようとしたファイルがない、と出ます そして、そのファイルをあらかじめ作っておくと OKです。 しかし fopen(TEST_FILE, "w") は該当ファイルがあればそれをオープンし 無ければ、新しく作成する、とFopenの仕様に出ています。 これは、今使っているサーバーの問題でしょうか 何か、避ける方法はないでしょうか よろしくお願いします

    • 締切済み
    • PHP
  • fopenしてくれない。。。

    こんにちは。PHP初級者です。 postgresqlに入れたデータをCSVファイルに書き込んで、出力してみたいと思って以下のプログラムを作ってみました。 $file_name ="insatu.csv"; //データベースから呼び出し以下の$arrayへいれるデータは省略します。 //今回は1行のみのデータを入力プログラムになってますが、本当は何行もやるプログラムとなってます。 $array = compact("a","b","c","d","e","f","g","h","i","j","k","l"); $string = implode("," , $array); $file = fopen($file_name, "a") or die ("openエラー $file_name"); flock($file, LOCK_EX); fputs($file, $string."\n"); flock($file, LOCK_UN); fclose($file); $file = fopen($file_name, "r"); while($array = fgetcsv($file, 1000, ",")){ echo "<hr> \n"; for($i=0; $i< count($array); $i++){ echo $array[$i]."<br>"; } } fclose($file); なぜか最初の fopenで dieの方へ行って OPENエラーメッセージが出てきます。 この作業をするためには何かあらかじめ入れなくてはいけない構文とかあるんでしょうか?何か間違っていますでしょうか? それともphp.iniを設定するとかしなくてはいけないんでしょうか? php5を使用してますが、php.iniやphp.ini-distはともに見つからず。 困り果ててます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • includeで読み込んだ内容を変数にいれたい

    includeで読み込んだファイル内容を変数に格納する方法はありますか? 動的ページをHTMLファイルで出力したいと思っています。 例: if(!file_exists("$file")){ mkdir("$file",0755); } $fp = fopen("$file/index.html","w") flock($fp, LOCK_EX); $hoge = include("./hoge.php"); fputs($fp,'<html>'."\n"); fputs($fp,'$hoge'."\n"); fputs($fp,'</html>'."\n"); この様に、$hogeの中に読み込んだファイルを書き込みたいのですが、 うまくできません。 この様な方法で変数にいれるのは可能でしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • fopen

    あるファイルを$fp = fopen("./filename","r+");で開き、ファイルの文頭の18バイトを削除して保存するにはどうしたらよろしいでしょうか?

    • ベストアンサー
    • PHP
  • fopenでファイルを読み込み、その取り込んだファイルを置換や修正したい。

    こんばんわ。 AというファイルにBというファイルを読みこもうと思うのですがうまくいきません。 ■a.php <?php // ファイルを読み込み専用でオープンする $fp = fopen('b.php', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); // 読み込んだ行を出力する print $line; // <br>の出力 print "<br>"; } // ファイルをクローズする fclose($fp); ?> ■b.php <div class="title">コンテンツ</div> <?php $amin = 1; //最小値 $amax = 4; //最大値 $randevent = rand($amin,$amax); //値を表示 if ( $randevent == 1) echo "たちつてと"; // else if ( $randevent == 2) echo "さしすせそ"; // else if ( $randevent == 3) echo "かきくけこ"; // else if ( $randevent == 4) echo "あいうえお"; ?> と、二つのファイルはこのような内容です。 もちろんincludeやリクワイヤーで取り込めばすむのでしょうが、fopenで取り込んで表示させたいのです。 このままの文章だとPHPの構文ごとHPに表記されてしまいます。 Printにしているからでしょうか? fopenでPHPの機能ごと取り込むには方法はありませんでしょうか? includeだと取り込んだ際にPHP構文の置換や修正がきかなくて困るんです。 fopenで取り込むとPHP構文を「あいうえお」の部分を「なにぬねの」にstr_replaceで置換できると思ったのです。 a.phpの中にfopenを使いb.phpの中のPHP構文を機能させる方法はありませんか?

    • ベストアンサー
    • PHP
  • fopenでパーミッションエラー

    fopenでパーミッションエラーが出ます。 fopen("../news.htm", "w"); Warning: fopen(../news.htm): failed to open stream: 許可がありません。 fopen("./news.htm", "w"); fopen("../map/news.htm", "w");# mapディレクトリを757にしてOK 上記はOKでした。 ディレクトリ構成は /public_html/sample/mag/test.php # fopenをするファイル sampleを757にしてもエラーが出ました。 fopenで一つ上のディレクトリにファイルを書き込むことは出来ないのでしょうか?

    • 締切済み
    • PHP
  • C言語 fopen

    初心者の質問になります。現在ファイルがオープンできるかどうかを確認したいのですが、指定したディレクトリの中のファイルを指定しているのですが、オープンできませんという結果が返ってきます。同じ場所にファイルを置いてファイル名だけでしていするとオープンが出来ます。 何卒よろしくおねがいします。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { FILE *fp; char *filename = "/file/d20151001.csv"; fp = fopen(filename,"r"); if (fp == NULL) { printf("\aファイルをオープンできません\n"); } else { printf("ファイルがオープンできました\n"); fclose(fp); } return (0); } ディレクトリ(わかりにくくてすいません汗) file------d20151001.csv data.c 環境 VisualStudio

F52WW MA6501521 画面が黒い
このQ&Aのポイント
  • 富士通FMVのF52WW MA6501521の画面が黒くなってしまいます。どうしたら解決できるでしょうか?
  • F52WW MA6501521の画面が真っ黒になるトラブルが発生しています。解決方法を教えてください。
  • 富士通FMVのF52WW MA6501521の画面が暗くなり、何も表示されなくなりました。どのように対処すればいいですか?
回答を見る

専門家に質問してみよう