• ベストアンサー

ゲストブック作成の際の疑問

10日で出来るPHP入門教室という本の中で、ゲストブックを作成する際、 while($row=fgets($org_file,1024)){ fputs($tmp_file,$row); } という部分があるのですが、要は$org_fileを$tmp_fileに入れるだけなのだから fputs($tmp_file,$org_file); の方がてっとり早い気がしてしまいます。 上のと下のではどういった違いがあるのでしょうか?

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

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

質問者さんが、言いたい、手っ取り早いんじゃない勝手方法に関してですが、 fputs関数は、第一引数が、文字列型で、第二引数が、fopen関数が返してきた、ファイルへのリソース型ですので、 その記述では、PHPがエラー吐いてこけます。 fopen関数がどういう処理をしているか、というのは、参考書には詳しく説明書いてなかったですかね。 fopen関数は、ファイルを開く関数ですが、ファイルの中身そのものを取得してくる関数ではなく、 ファイルを開いたって情報を伝えてくる関数です。 ビジュアル的には、fopen関数は、ファイルの中身をメモ帳で開いたときのことを思い浮かべてもらうと分かりやすいです。 fopen関数でファイルを読み込みモードで開きます。そうすると、カーソル位置が一番最初にあります。 次に、fgets関数で、そのカーソル位置から改行がされている場所までを選択して、選択部分の内容をコピーしてきて、 $row変数に貼り付けます。 そして、あらかじめ、新規作成でひらいてあったもう一つのファイルに、$rowに貼りつけた内容をコピーする ということを、最後の文字まで全部繰り返し行う、といった動作になります。 そこで、質問者さんとしては、そんなまどろっこしいことをしないで、全部の文字を取得してきて、全部一気に貼りつければいいじゃん、 と思われたのだと思いますが、 fgets関数は改行コードがあるところまでしか取得できません。 一気に全部の文字を取得するためには、別の「fread関数」といったものを使うのですが、 この関数は第二引数に、何バイト読み込むかを指定しなければいけないため、 まずはじめにファイルのサイズを計測しないといけなかったりしますし、 一気に全部読み込むということだとメモリも一気に消費しますので、若干重かったりします。 また、質問内容の処理方法であれば、fputsでファイルに書き込む前に、 $row変数の内容に対してPHPで加工が行えますが、全部読んできてしまうと、加工がしづらくなったりします。 参考書の意図としては、なるべく沢山の組み込み関数を使わないようにしたり、 後で修正がしやすいような作り方にしたりとある程度工夫がしてあるのではないかなと思います。

ghfjri
質問者

お礼

回答ありがとうございます。 もうすこしメソッドについては調べるべきでしたね。 それにしてもすばらしい解説で、勉強になりました。

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

その他の回答 (2)

noname#123003
noname#123003
回答No.2

× copry ○ copy 訂正です。

すると、全ての回答が全文表示されます。
noname#123003
noname#123003
回答No.1

$org_fileに入ってるのはリソースIDなのでそれでは用は成さないです。 多分手っ取り早いのはcopry関数を使って一時ファイルを作ることかなぁ・・・。

ghfjri
質問者

お礼

回答ありがとうございます。 しかし、意味がわかりません。今の自分では答があっても理解できないのが悔しいです・・・。

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

関連するQ&A