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

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

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

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

Q&A

解決済

3回答

12733閲覧

PHPで受け取った文字列データをテキストファイルに表示できません

macaroni

総合スコア7

PHP

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

0グッド

0クリップ

投稿2018/03/02 05:23

編集2018/03/02 06:44

前提・実現したいこと

入力フォームを作成し、
入力フォームから入力された文字列データをPHPで受け取って、その値をテキストファイルに保存することが課題です。
入力フォームの作成はできたのですが、
文字列をフォームに入力し、
イメージ説明
ファイルとブラウザを更新してから、
ブラウザの戻るボタンを押してkadai5.txtを開きます。
(戻るボタンを押さないと開きたいテキストファイルのリンクが現れない状態です。)
イメージ説明
本来であればkadai5.txtを開けば入力した文字列(今回でいえば あ )が表示されているはずなのですが、何も表示されません。
イメージ説明
何が原因なのかわからず、とても困っています。ご教授願います。

該当のソースコード

PHP

1<!DOCTYPE html> 2<head> 3<html lang="ja"> 4<meta charset="UTF-8"> 5</head> 6<body> 7<form action="mission_1-5-2.php" method="post"> 8<!--入力フォームの作成--> 9<input type="text" name="comment"> 10<input type="submit" value="送信"> 11</form> 12<?php 13$comment=$_POST['comment']; 14var_dump $comment 15$filename='kadai5.txt'; 16$fp=fopen($filename,'w'); 17fwrite($fp,"$comment"); 18fclose($fp); 19?> 20</body> 21</html>

試したこと

更新を何度も行う
htmlとphpの順序を入れ替えたりする

補足情報(FW/ツールのバージョンなど)

全てではありませんが、ご指摘の通りプログラムを書き直してみました。依然問題が解決せず申し訳ありません。どんなことでもご指摘いただけると嬉しいです。

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

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

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

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

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

m.ts10806

2018/03/02 05:29

提示のソースはmission_1-5-2.phpですか?
m.ts10806

2018/03/02 05:32

また、そのままですとコメント送信前にNoticeエラーがでると思います。その部分は解消された方が良いかと(出てないのであればphp冒頭に ini_set( 'display_errors', 1 ); を入れておいてください)
m.ts10806

2018/03/02 05:47

シングルクォートで解決しなかったのであれば、何が起きているのでしょうか?(私はそこだけファイルに書き込めましたが) 質問に情報を追記してください。
macaroni

2018/03/02 05:54

何度も答えていただいていて本当に嬉しいです。素早く反応ができず申し訳ありません。
m.ts10806

2018/03/02 05:54

何となく分かった気がします。回答に反映するので少々お待ちを。
macaroni

2018/03/02 05:59

ありがとうございます!! 始めたばかりでどこがわからないのかもわからず、修正に答えられず申し訳ありません。全ての回答のご指摘通り直していっています。
m.ts10806

2018/03/02 06:01

今回修正するところは全角のクォートを半角にするだけで、あとは「操作手順」に抜けがあったようです。回答をご確認ください。
guest

回答3

0

ここではないでしょうか?

php

1$comment=$_POST[‘comment’];

php

1$comment=$_POST['comment'];

※「'(シングルクォーテーション)」の全角半角問題

追記

php

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5</head> 6<body> 7 8 <form action="mission_1-5-2.php" method="post"> 9 <!--入力フォームの作成--> 10 <input type="text" name="comment"> 11 <input type="submit" value="送信"> 12 </form> 13 14 15 <?php 16 17 // フォームから値が送信されてきているかの確認 18 if ( isset($_POST['comment']) === true ) { 19 20 // 送信されてきていたら、変数にその値を代入 21 $comment = $_POST['comment']; 22 23 // データを書き出すファイル名を設定 24 $filename = 'kadai5.txt'; 25 26 // ファイルに書き出しを開始(ファイルハンドルの取得) 27 $fp = fopen($filename, 'a'); // 追加書き込みモード 28 29 // データを書きだす 30 fwrite($fp, $comment); 31 32 // 書き出し処理の終了(ハンドルの開放) 33 fclose($fp); 34 35 } 36 37 ?> 38 39</body> 40</html>

投稿2018/03/02 05:31

編集2018/03/02 09:41
nnahito

総合スコア2004

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

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

macaroni

2018/03/02 05:45

ありがとうございます!!修正しました。しかしまだ問題が解決されません…。文法間違いがないか、自分でももう一度よくチェックしてみます。
nnahito

2018/03/02 05:47

$commentをvar_dumpしてみてください。 中身は入っていますか?
macaroni

2018/03/02 06:56

修正したプログラムのようにvar_dumpを入れてみたのですが、表示されません。中身が入っていないのかもしれないです。
nnahito

2018/03/02 07:02

(1)HTMLの開始タグが変なところにいます。 (2)ver_dump($comment);としましょう。(セミコロン抜けてますし・・・) (3)特に必要ないので、fwrite($fp,"$comment");の「"」は消しましょう。 で、「追記」のコードで実行してみましたが、正常動作しました。 ファイルが作成できているとのことで、問題ないかと思いますが、動作させているフォルダのパーミッションは777等になっていますか?
guest

0

ベストアンサー

状況を踏まえて追記しました 15:00

実施手順を振り返りますと、

文字列をフォームに入力し
ファイルとブラウザを更新してから、
ブラウザの戻るボタンを押してkadai5.txtを開きます。

とあります。
大事な手順が抜けています。
「文字列をフォームに入力し」の後に**「送信ボタンを押す」**
です。

先の回答にも書いたように「PHPはサーバー側の言語として、HTML出力の前に処理が行われます。」
つまり、今の状態だと、特にリクエストがPOSTかどうかもチェックせずに実行しているので、
画面を表示しただけで中身が空の「kadai5.txt」というファイルができあがります。

文字列を入力したのであれば、その情報をPHPに対して渡す必要があります。
その「渡す」を「送信」ボタン(正確にはSUBMITボタン)が担当してくれます。

つまりその「渡す(SUBMIT)行程をしていないので、テキストファイルの中身が空になる」
ということですね。

気になるところを。 14:46

htmlとphpの順序を入れ替えたりする

関係ありません。
PHPはサーバー側の言語として、HTML出力の前に処理が行われます。
ソースコード上の順序は関係なく、PHPが先に実行されていて、HTMLが出力されます。

それをわかりやすくするために、HTMLを書くより前にPHPを書いておくことを強くすすめます。
HTML内にPHPコードが埋め込まれているとかなり見づらくなり、バグの発見が難しくなります。

POSTについて

POSTはHTMLよりSUBMITされたときに初めて定義されます。
つまり、今の段階では定義されていないものをいきなり使っていることになります。
Noticeエラーが出ているはずです。

まずは送られたリクエストがPOSTかどうかを判断する判定を入れて利用してください。

php

1if ($_SERVER["REQUEST_METHOD"] === "POST") { 2 $comment=$_POST['comment']; 3 ~~~~ 4 5} 6 7?> 8html 9~~

また、今の状態だと送信されたかどうかボタンを押下したあと分かりませんよね?
テキストファイルへの書き込みが終わったら何かしらメッセージを出すようにした方が良いでしょう。

php

1$result = ''; 2 3if ($_SERVER["REQUEST_METHOD"] === "POST") { 4 $comment=$_POST['comment']; 5 ~~~~書き込み処理 6 7 $result = '書き込みました。'; 8} 9?> 10 11html 12~~ 13</head> 14<body> 15<?php echo $result; ?>

ブラウザの戻るボタンを押してkadai5.txtを開きます。

サーバー側の言語を実行しているときに限らずですが、ブラウザバックは基本的によくない行為です。
結局ブラウザから直でアクセスするのであれば、ファイルの存在チェックをして画面からリンクを置き、そこから開くようにすると良いのではないでしょうか。

php

1$filename='kadai5.txt'; 2 3if ($_SERVER["REQUEST_METHOD"] === "POST") { 4 $comment=$_POST['comment']; 5 $fp=fopen($filename,'w'); 6 fwrite($fp,"$comment"); 7 fclose($fp); 8 $result = '<p>書き込みました。</p>'; 9} 10 11$filelink = ''; 12if(file_exists($filename)){ 13 $filelink = '<p><a href="'.$filename.'">作成したファイルを開く</a></p>'; 14} 15 16</head> 17<body> 18<?php echo $result; ?> 19<?php echo $filelink; ?> 20

もちろんリンクではなく、fopenでファイルの内容を取得して表示するのもありですが、課題のようなので、この辺で。

投稿2018/03/02 05:46

編集2018/03/02 06:02
m.ts10806

総合スコア80850

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

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

macaroni

2018/03/02 06:54

回答確認致しました。丁寧に何度も答えていただいて本当に本当にありがとうございます!! 送信ボタンを押し、戻るボタンを押さないようkadai6.txtを別のタブで開いてみているのですが、やはり表示されません…。
m.ts10806

2018/03/02 06:58

kadai5.txt じゃなくて kadai6.txt なんですか? コードにはkadai5.txtとありますが。。。。
macaroni

2018/03/02 06:59

5です!すみませんうち間違えました。
m.ts10806

2018/03/02 07:05

ソースコードに var_dump $comment とあります。ここでエラーが出てますよね。 PHP冒頭に ini_set( 'display_errors', 1 ); を入れておいてください。 <?php ini_set( 'display_errors', 1 ); で var_dump()の使い方間違っています。 var_dump( $comment); です。 PHPで変数が想定通りわたっているかどうか確認するため、などデバッグには必須の機能です。 http://php.net/manual/ja/function.var-dump.php
m.ts10806

2018/03/02 07:09

ひとまず、デバッグのとき以外は不要な記述なので var_dump $comment だけ消して、あとは手順どおり操作すれば入力した情報は書き込まれますよ(こちらで動作確認はできています)
macaroni

2018/03/10 04:02

お返事遅くなってしまい申し訳ありません!なんとかできました。ありがとうございます!!
guest

0

文字コードのmetaの中に、ダブルクォーテーションがおかしな位置(「UTF-8」の直前)にあります。
この影響で、文字コードのmetaタグが閉じられていないため、metaが続いていると解釈されているような気がします。

html

1<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

また、HTML5ならもっと簡単に書くことができます。

html

1<meta charset="utf-8">

追記

またまたおかしいところ見つけちゃいました。
見えない原因と直接的な関係はないと思いますが、HTMLの面で色々とおかしいです。

・phpの出力部分を、「</body></html>」の前にする
(「</body>」までが表示コンテンツ、「</html>」までがHTMLの構造です)
・コメントは「<!- ->」ではなく「<!-- -->

php

1<!DOCTYPE html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 4</head> 5<body> 6<form action="mission_1-5-2.php" method="post"> 7<!--入力フォームの作成 --> 8<input type="text" name="comment"> 9<input type="submit" value="送信"> 10</form> 11 12<?php 13 $comment=$_POST['comment']; 14 $filename='kadai5.txt'; 15 $fp=fopen($filename,'w'); 16 fwrite($fp,"$comment"); 17 fclose($fp); 18?> 19 20</body> 21</html>

投稿2018/03/02 05:31

編集2018/03/02 06:02
kszk311

総合スコア3404

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

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

macaroni

2018/03/02 05:48

そうだったのですね…!初心者で基礎から間違っていて申し訳ないです。丁寧に教えていただいてありがとうございます! まだ解決していないので、また修正したものも見ていただけると嬉しいです。
kszk311

2018/03/02 06:28 編集

HTML側で、他にも気になった箇所見つけて追記しておきましたので、確認しておいてください。 PHP側については、他の方が指摘されていますので、そちらを…。
macaroni

2018/03/02 06:58

確認致しました!コメントアウトの書き方も間違っていたのですね…。もっと自分で調べてから質問すべきでした(当時の自分としては万策尽きてしまったと感じていたのですが)。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問