• ベストアンサー

fopenでファイルが開かない場合・・

現在あるサーバ上で問題なく利用できるファイル関数のfopenが、別のサーバに変えたらエラーになってしまいました。 if( ( $fp = fopen( $dir.$datefile ,"w" ) ) != FALSE ){ print "OK"; exit; // fwrite( $fp , $new_data ); // @chmod( $dir.$datefile , 0755 ); } else { print "no"; exit; } 上記で else に入ってしまいます。 なにか原因があるのでしょうか、まったくわからず困っています。 どなたかご教授下さい。

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

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

  • ベストアンサー
回答No.1

fopen関数は指定したファイルが存在しない場合は新たにファイルを作成します。 そのため、指定したファイルが存在しない場合はそのディレクトリに対する書き込み権限が必要になります。 パーミッションをチェックしてみて下さい。 ご自分でディレクトリの権限を変更できない場合は、サーバー管理者に問い合わせてみて下さい。

その他の回答 (2)

  • little-m
  • ベストアンサー率44% (45/102)
回答No.3

>なにか原因があるのでしょうか、まったくわからず困っています。  エラーメッセージは出力されませんか?  エラーメッセージが出力されないようなら、ソースの先頭に error_reporting(E_ALL); ini_set('display_errors', TRUE);  などを記述してみてください。  fopen()でエラーが発生しているなら、メッセージが表示されると思います。

  • utano_m
  • ベストアンサー率45% (14/31)
回答No.2

$dirに入っているディレクトリのパーミッションは 書き込み許可になっていますか? fopen()関数のwモードではファイルが存在しない場合 作成を試みるので書き込み許可パーミッションが与えられてない場合 ファイルの作成に失敗しエラーを返すと思います。 書かれているソースコードはそのままの状態で現在のサーバーで動いていますか?

関連するQ&A

  • 別ユーザ所有のディレクトリ内にファイル作成できない

    こんばんは。 タイトルのとおりですが、まずPHPでディレクトリを作成し、 その中にindex.htmlを作成しようとしているのですが上手くいきません。 PHPで作成したディレクトリの所有者はapacheになっているためかと思い、 実際にFTPを通して自分で作成したディレクトリの中にindex.htmlを作成したところ上手くいきました。 ディレクトリのパーミッションはいずれもスクリプトにより0777を指定しています。 このように、PHPのみでディレクトリを作成し、その中にファイルを作成する といったことが出来ずにいます。解決策等ございましたらお教えください。 参考までに、ソースを掲載しておきます。 これを設置するディレクトリのパーミッションは0777にしてみましたが、出力は「fopen error」になります。 <?php $path = "./dir/"; if(mkdir($path, 0, true)){ chmod($path, 0777); if($fp = fopen($path."index.html", "w")){ fputs($fp, $put); fclose($fp); print "Created!"; }else{ print "fopen error"; } }else{ print "mkdir error"; } ?>

    • ベストアンサー
    • PHP
  • 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関数

    いまいちfopen関数の使い方がわかりません。 FILE *fp; fp = fopen("test.txt","W"); fcose(fp); ですが、なぜここでポインタが出てくるんでしょうか? メモリ上に領域fpを作って、そこに関数のアドレスを格納している? と一応解釈していますがあっていますか?

  • 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
  • int型の値をファイルに保存

    int errint(int errnum){  FILE *fp;  if((fp = fopen("error02.txt", "w+b")) == NULL){   printf("ファイルのオープンに失敗しました。\n");   exit(-1);  }  fwrite(&errnum,sizeof(errnum),1,fp);  fclose(fp); } int型の値を受け取ってファイルに 保存する関数を作ったのですが 出力されるテキストが 文字化けしていてうまく動きません。 独習C等の参考書を読んでも自分では分かりませんでした。 どこが間違っているのか教えてください。 よろしくおねがいします。

  • 無料ホームページの鯖でPHPでfwrite出来ない

    無料ホームページのサーバに"php"というフォルダをアップし、その中に"write.php", "text.txt","read.php"というファイルを作って実行させたのですが、 "write.php"で、 $file = "text.txt"; $fp = fopen($file, "w"); if ($fp == FALSE) { print "ファイルオープン失敗<br />"; } else { fwrite($fp, $text); fclose($fp); } を実行しても"text.txt"の内容が変わらない(空のまま)のですが、何がいけないのでしょうか? "text.php"のパーミッションは666で、"php"フォルダは707です。 考えられる原因をご教授下さい、お願いします。

    • 締切済み
    • PHP
  • fopenのコード

    初歩的なことですがファイルをオープンするfopenの例題で *************************** #include<stdio.h> int main (void) {   FILE  *fp;     fp = fopen ("test1.txt","w");   if (fp==NULL) {     printf ("ファイルをオープンできませんでした。\n");     return 1;   }    else {     printf ("ファイルをオープンしました。\n");   }    fclose (fp);   printf ("ファイルをクローズしました。\n");    return  0; } *********************************というのがあります。 この中のif文の中のreturnの戻り値が1なのはなぜでしょうか? (例題によっては-1というのもありましたが・・。) またどこに戻り値を返すのでしょうか? もしファイルがオープンできなければその時点で終了になるのでしょうか?初歩的なところですがお願いします。

  • 条件文について

    PHPのサンプルを勉強していると 簡単な構文でも「if」などの条件文が 必要以上に使われ故意に複雑にしているように見えます。 -------------------------------------- if(!empty($name) || !empty($naiyou)){ $keijiban = "keijiban.txt"; $fp = fopen($keijiban, "a"); if($fp){ if (flock($fp, LOCK_EX)){ if (fwrite($fp, $data) === FALSE){ print "ファイル書き込みに失敗しました"; } flock($fp, LOCK_UN); }else{ print "ファイルロックに失敗しました"; } } fclose($fp); } ----------------------------------------- 上記は正しいサンプル構文になるようで、 流れは大体理解できるのですが そんなところまで条件分岐をしなくてはいけないのかな? と思ってしまいます。 初学者の私が上のサンプルと同じ内容の構文を書くとしたら 以下のように条件分岐をできるだけ 少なくして考えてしまいます。 ----------------------------------------- if(!empty($name) || !empty($naiyou)){ $fp = fopen("keijiban.txt", "a"); flock($fp, LOCK_EX); fwrite($fp, $data); flock($fp, LOCK_UN); fclose($fp); }else{ print "エラー"; } ----------------------------------------- 条件分岐をできるだけ多く使うことは 必要なのでしょうか? 条件分岐で詳細に分けるのは どのような利点が具体的にあるのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 新規ファイルを作成する

    にはどうしたらいいのでしょうか? <?php $file='gomi.dat'; $in=isset($_POST['in'])?$_POST['in']:'bad'; if(file_exists("$file")) { $a=file("$file"); foreach($a as $value) { echo "$value<br/>"; } } $fp=fopen("$file","w"); // <-------------- fwrite($fp,"$in\n"); fclose($fp); ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>"> <input type="text" name="in"/> <input type="submit" value="send"/> </form> は動きませんが $fp=fopen("$file","w"); // <-------------- を $fp=fopen("$file","r+"); // <-------------- としてあらかじめ空の gomi.dat (モード777)を作っていれば動きます どうしたら $fp=fopen("$file","w"); // <-------------- にしても動くようになるでしょうか?

    • ベストアンサー
    • PHP
  • ファイル

    c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。