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

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

ただいまの
回答率

88.22%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,827

macaroni

score 7

 前提・実現したいこと

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

 該当のソースコード

<!DOCTYPE html>
<head>
<html lang="ja">
<meta charset="UTF-8">
</head>
<body>
<form action="mission_1-5-2.php" method="post">
<!--入力フォームの作成-->
<input type="text" name="comment">
<input type="submit" value="送信">
</form>
<?php
$comment=$_POST['comment'];
var_dump $comment
$filename='kadai5.txt';
$fp=fopen($filename,'w');
fwrite($fp,"$comment");
fclose($fp);
?>
</body>
</html>

 試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/03/02 14:54

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

    キャンセル

  • macaroni

    2018/03/02 14:59

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

    キャンセル

  • m.ts10806

    2018/03/02 15:01

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

    キャンセル

回答 3

+3

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

$comment=$_POST[‘comment’];

$comment=$_POST['comment'];

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

 追記

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
</head>
<body>

    <form action="mission_1-5-2.php" method="post">
        <!--入力フォームの作成-->
        <input type="text" name="comment">
        <input type="submit" value="送信">
    </form>


    <?php

    // フォームから値が送信されてきているかの確認
    if ( isset($_POST['comment']) === true ) {

        // 送信されてきていたら、変数にその値を代入
        $comment = $_POST['comment'];

        // データを書き出すファイル名を設定
        $filename = 'kadai5.txt';

        // ファイルに書き出しを開始(ファイルハンドルの取得)
        $fp = fopen($filename, 'a');        // 追加書き込みモード

        // データを書きだす
        fwrite($fp, $comment);

        // 書き出し処理の終了(ハンドルの開放)
        fclose($fp);

    }

    ?>

</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/02 14:45

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

    キャンセル

  • 2018/03/02 14:47

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

    キャンセル

  • 2018/03/02 15:56

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

    キャンセル

  • 2018/03/02 16:02

    (1)HTMLの開始タグが変なところにいます。
    (2)ver_dump($comment);としましょう。(セミコロン抜けてますし・・・)
    (3)特に必要ないので、fwrite($fp,"$comment");の「"」は消しましょう。

    で、「追記」のコードで実行してみましたが、正常動作しました。
    ファイルが作成できているとのことで、問題ないかと思いますが、動作させているフォルダのパーミッションは777等になっていますか?

    キャンセル

checkベストアンサー

+2

状況を踏まえて追記しました 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かどうかを判断する判定を入れて利用してください。

if ($_SERVER["REQUEST_METHOD"] === "POST") {
  $comment=$_POST['comment'];
 ~~~~

}

?>
html
~~

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

$result = '';

if ($_SERVER["REQUEST_METHOD"] === "POST") {
  $comment=$_POST['comment'];
 ~~~~書き込み処理

  $result = '書き込みました。';
}
?>

html
~~
</head>
<body>
<?php echo $result; ?>

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

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

$filename='kadai5.txt';

if ($_SERVER["REQUEST_METHOD"] === "POST") {
  $comment=$_POST['comment'];
  $fp=fopen($filename,'w');
  fwrite($fp,"$comment");
  fclose($fp);
  $result = '<p>書き込みました。</p>';
}

$filelink = '';
if(file_exists($filename)){
  $filelink = '<p><a href="'.$filename.'">作成したファイルを開く</a></p>';
}

</head>
<body>
<?php echo $result; ?>
<?php echo $filelink; ?>

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/02 16: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

    キャンセル

  • 2018/03/02 16:09

    ひとまず、デバッグのとき以外は不要な記述なので
    var_dump $comment

    だけ消して、あとは手順どおり操作すれば入力した情報は書き込まれますよ(こちらで動作確認はできています)

    キャンセル

  • 2018/03/10 13:02

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

    キャンセル

+2

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

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

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

<meta charset="utf-8">

追記

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

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

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<form action="mission_1-5-2.php" method="post">
<!--入力フォームの作成 -->
<input type="text" name="comment">
<input type="submit" value="送信">
</form>

<?php
    $comment=$_POST['comment'];
    $filename='kadai5.txt';
    $fp=fopen($filename,'w');
    fwrite($fp,"$comment");
    fclose($fp);
?>

</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/02 14:48

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

    キャンセル

  • 2018/03/02 15:09 編集

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

    キャンセル

  • 2018/03/02 15:58

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

    キャンセル

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

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る