質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2566閲覧

PHPのファイル書き込みとfpassthruについて

WeilSpinor

総合スコア170

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/03/20 04:37

編集2019/03/20 05:23

プログラミング初心者です。
いまphpでファイル書き込みについて勉強中です。
###実現したいこと
サーバーマシン上に置いた以下のような内容のテキストファイルiroha.txtがあります。

txt

1いろはにほへと

これをまず、ブラウザに表示します。
次に、ここに文字列「ちりぬるを」を追記します。
そして、再びブラウザに表示します。
そしてファイルを閉じます。

その結果として、ブラウザ上の表示として以下のような結果を期待しています。

いろはにほへと
いろはにほへとちりぬるを

これを実現するために、以下のようなphpを書いて実行しました。

php

1<?php 2header("content-type:text/html; charset=shift-jis"); 3$file =fopen("iroha.txt","a+"); 4 5fpassthru($file); 6$str ="ちりぬるを"; 7$str = mb_convert_encoding($str, "shift-JIS"); 8fwrite($file,$str); 9fpassthru($file); 10 11fclose($file); 12?>

その結果、iroha.txtファイルを見てみると、追記には成功して、
「いろはにほへとちりぬるを」
となっていました。
しかし、ブラウザ上の表示は、

いろはにほへと

しか表示されていませんでした。
多分、2つ目のfpassthruが実行されていない、ということだと思うのですが、
どうなんでしょうか?

ご回答宜しくお願いします。
###実行環境
Windows10/Microsoft Edge

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/20 05:05 編集

質問に「初心者アイコン」つけてください。 本来「初心者」というのは単なる質問者の状態であり要件とは別物です。
WeilSpinor

2019/03/20 05:22

すみません、忘れてました。今つけます
guest

回答1

0

ベストアンサー

マニュアルを読み込みましょう。

与えられたファイルポインタを EOF まで読み、結果を出力バッファに書き出します。

$fileに入っているファイル情報は
あくまで最初のheader()直後に読まれたものであり、
そのときには「いろはにほへと」しか入っていない状態です。
書き込んだ後、もう1度読み出す必要があります。

php

1<?php 2header("content-type:text/html; charset=shift-jis"); 3$file =fopen("iroha.txt","a+"); 4 5fpassthru($file); 6$str ="ちりぬるを"; 7$str = mb_convert_encoding($str, "shift-JIS"); 8fwrite($file,$str); 9$file =fopen("iroha.txt","a+"); //追加 10fpassthru($file); 11 12fclose($file); 13?>

ファイル内容:いろはにほへとちりぬるを
画面表示:いろはにほへといろはにほへとちりぬるを

投稿2019/03/20 04:50

編集2019/03/20 04:51
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

WeilSpinor

2019/03/20 05:18 編集

ご回答ありがとうございます。 修正したら、予想通りの結果をえられました。 一つ疑問なのですが、 fpassthruが、「ファイルポインタの位置から前の文字列を出力する」 ということなら、 修正前の私のコードでは、一回目のfopenで読み込んだ「いろはにほへと」 を二回繰り返して表示し、 いろはにほへといろはにほへと と出力されるはずだと思ったのですが、実際には いろはにほへと となっているのは、 fwriteに「書き込んだ後、ファイルポインタを先頭に戻すという機能がある」 ということでしょうか? また、余談ですが、 出力画面を開発者ツールをみたところ、 phpファイルにも拘わらず、htmlのソースコードとして出力されているのを確認しました。 つまり、phpのfpassthruコマンドを受けて、 「iroha.textの中身を反映したhtmlファイルを作成され、ブラウザに表示された」 ということだと思います。 ここで、「htmlファイルを作成している主体」は、 ブラウザ、Apache、サーバーマシン のどれかだと思うのですが、どれなのでしょうか? 質問が多くてすみません…。
WeilSpinor

2019/03/20 05:28

いや、今調べたのですが、むしろ、 「fpassthru()は、出力した後、自動的にファイルを閉じる機能がある」 ため、ファイルは閉じたままになっており、 「2回目のfpassthru()が発動してくれなかった」 ということですかね? 自己解決しました。
m.ts10806

2019/03/20 05:31 編集

>「iroha.textの中身を反映したhtmlファイルを作成され、ブラウザに表示された」 まだその話します?もう対象の質問で私は答えてますよ。 全くコメントがないので読んでいないということでしょうか。 PHPがやっているのは実行元(今回はブラウザ)からリクエスト(xxx.phpを実行)を受けて処理(今回はファイルを読み込んでファイルを出力する)を行って出力があればそれは実行元に返してるだけで、その後のことは実行元に任せているだけです。PHPプログラムはどこから呼び出されたか、どこに返すかはそもそも知らない状態です。 だからブラウザから呼び出されたらブラウザに返す、コマンドから呼び出されたらコマンドに返す だけです。 ちなみに今回あなたは冒頭に header("content-type:text/html; charset=shift-jis"); と書いてますよね?これの意味も分かって書いてないと後で痛い目を見ます。 ※ちなみに「HTMLファイルを作成しますよ」という宣言ではないです
m.ts10806

2019/03/20 05:30

> 「2回目のfpassthru()が発動してくれなかった」 根拠は何でしょうか。自己解決したようで全く見当違いの理解をしている可能性もあります(これまでの経緯から特に疑わざるを得ない)
WeilSpinor

2019/03/20 05:41 編集

す、すみません!!ご回答を見落としていました。。 「ブラウザは、『文字の出力』を受けたら、htmlで表示するようにできている」 という感じですね。ありがとうございます。 header("content-type:text/html; charset=shift-jis"); は、出力はhtmlで(文字コードはshift-jisで)出力する、という意味ですかね…調べてみます。 >根拠は何でしょうか。 教科書で調べましたら、「fpassthru()は出力した後にfclose()を使わなくても自動的にファイルを閉じます」とありました。間違いないと思います。
m.ts10806

2019/03/20 05:55

>「ブラウザは、『文字の出力』を受けたら、htmlで表示するようにできている」 勝手に変換する癖はやめられたほうが良いです。例え話の件もそうですね。 真っ当なアドバイスに対して自分が理解できた言葉で解釈しようとするとそれはもう元のアドバイスの原型を損ねます。アドバイスの意味がありません。 まずは言葉通り受け取って、分からない表現があったら分かるまで聞いてください。 私が言ったのは 「phpはあくまで文字列を出力するだけです。 それをhtmlとして解釈するのはブラウザの機能です。」 ですよね。 そこはサーバーとクライアントの通信の仕組みを1から勉強しなおしてください。リクエストとレスポンスが分かっていないと話ができません。 >教科書で調べましたら 教科書が何の教科書か知りませんが、どんな優秀な書籍であってもPHPマニュアル以上に仕様が書いてあるものはありません。 どんな書籍であっても必ずPHPマニュアルとの整合性をとるようにしてください。なので「書籍に書いてあるから間違いない」というのはPHPエンジニアは信じません。 (もちろんお金をとる書籍なので正しいことが多いですが、「間違いない」という根拠にすることは間違い) その本を書いた人はPHPを作った人、メンテナンスをしている人ですか? そうでなければ結局はPHPマニュアルが大元です。PHPマニュアルの解釈が間違ったまま書籍にしてしまっていたらそれはもう嘘でしかありません。 PHPマニュアル確認が確実でしょう。 ※PHPマニュアルの各説明にあるNoteは自由に書き込めるので嘘が書いてあることもあります。
WeilSpinor

2019/03/20 06:03

PHPはあくまで文字列を出力するだけ、、頭に刻んでおきます。 マニュアルが大元、なんですね…。 マニュアルって専門用語がさく裂していて意味が分からず、 中~上級者になってから読むもの、と思っていたのですが…やはり初心者のうちから読んでいくべきなんですかね。 また、PHPマニュアルのfpassthru()の項目を見たところ、 「fpassthru()は、ファイルの中身を出力した後、fclose()を使用しなくても、自動的にファイルを閉じる」ということが書かれていなかったのですが…。(教科書には書かれていたのに…)
m.ts10806

2019/03/20 06:14

>PHPはあくまで文字列を出力するだけ もちろん、出力処理が書いてあれば、という条件付です。 何も出力しなければ処理だけして終わらせることもできます。 PHPマニュアルは辞書代わりにも使えます。 辞書は「あ」から1つずつ見ていくものではなく、「この単語の意味が知りたい」とそこだけスポットで見ていきますよね?それと同じです。 もちろん「PHPとは」というところ、他にも考え方や組み方(セッションやクラスなど特に)を解説しているところはあるのでそれはそれできちんと読んで理解していくべきですが、そもそもプログラミングって難しいものです。 プログラミングによって出来上がったシステムの大目的は「問題解決」ですからね。問題解決に役立つものが容易に扱えたらそれは大目的が崩れます。 誰でもあることですが「調べたらその中の単語を理解するためにその単語を調べる」をやって、成長しています。 そこを避けては通れないのがプログラミングの世界です。理解しないと扱えないのがプログラミング言語です。理解しないと作り上げられないのがシステムです。 例え足し算だけを行うようなもの、文字列出力を行うようなものであっても、です。 >また、PHPマニュアルのfpassthru()の項目を見たところ、 「fpassthru()は、ファイルの中身を出力した後、fclose()を使用しなくても、自動的にファイルを閉じる」ということが書かれていなかったのですが…。(教科書には書かれていたのに…) 表現ですね。 PHPマニュアルにある「結果を出力バッファに書き出します。」この1文で全て説明しています。 「バッファリング」について調べると良いかもしれません。 正確には「ファイルを閉じる」ではないんですけどね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問