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

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

ただいまの
回答率

90.52%

  • PHP

    20326questions

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

<textarea>からの入力値を改行させたい

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 873

3.a.m.op

score 3

input.phpの<textarea>フォームから、
入力された内容を改行まで入力された通りにoutput.phpで表示できるようにしたいです。

input.phpで入力

confirm.phpで確認表示

save.phpで入力内容をtxtファイルに保存

output.phpでtxtファイルからファイル内容を表示

という流れです。

現在、
input.php

<form action="confirm.php" method="post">
<textarea name="textarea"></textarea>
<button type="submit">確認</button>
</form>


confirm.php

$textarea = $_POST['textarea'];
$textarea = htmlspecialchars($textarea);
$textarea = nl2br($textarea);
<p>入力内容を確認してください</p>
<p><?php echo $textarea; ?></p>
<form action="save.php" method="post">
<input type="hidden" name="textarea" value="<?php echo $textarea; ?>">
<button type="button" onclick="history.back()">戻る</button>
<button type="submit">更新</button>
</form>


save.php内では

$textarea = $_POST['textarea'];
$textarea = htmlspecialchars($textarea);
$file = 'file.txt';
file_put_contents ($file, json_encode($textarea));  
<p>更新完了</p>
<a href="output.php">更新を確認</a>

output.php内では

$file='file.txt';
if (file_exists($file)){
 $textarea = json_decode(file_get_contents($file));
 echo '<p>'.$textarea.'</p>';
}


となっております。

例えば、
input.phpで

おはよう
こんにちは
こんばんは

と入力しても、
output.phpでは、

おはよう<br />こんにちは<br />こんばんは

と改行もされず、タグが表示されてしまいます。

いろいろと調べてみて、
output.php内で

echo '<p>'.htmlspecialchars($textarea).'</p>';


にする等変更してみましたがうまくいきません。
どうすればタグが表示されず、改行もできるようになるのでしょうか?

///////////////////////
htmlを追記しました。
初心者なので、以上で必要な情報が揃っているかもわかりませんが、
仕事で必要に迫られ、周りにわかる者もいない中で悩みながら作っております。
業務の都合上、抜粋での記載となり申し訳ありません。
どうぞよろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m6u

    2018/05/09 10:43

    output.phpでナニをどう表示しようとしているのか、要求仕様すら伝わらない残念な質問。

    キャンセル

  • 3.a.m.op

    2018/05/09 10:49 編集

    残念な思いをさせ申し訳ありません。未熟なので沢山いただいたコメントについて考えるのに精一杯で編集までおいついておりません。恐れ入りますがお時間いただければ幸いです。

    キャンセル

  • mts10806

    2018/05/09 11:14 編集

    追記を受けて回答に追記しました。流れが関係するものであれば、なるべくプログラム全文を投稿されるようにした方が良いです。編集後の質問内容でもoutput.phpでtxtファイルから取得する部分とか、input.phpにあるhtml部分とか不足している情報の方が多いです。

    キャンセル

回答 5

+2

confirm.phpoutput.phpがあるということは、その間の値の伝え方が問題ということが考えられます。

<br>などを入れて変換した値はあくまで表示用のものなので、confirm.phpからoutput.phpに流すのはもとの値にして、output.phpの側でもnl2brなどを実行しましょう。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/09 10:18

    あ、そういうことか。誤解してました;

    キャンセル

  • 2018/05/09 10:29

    ご回答ありがとうございます。
    申し訳ありません、失念しており書いてませんでした。
    input.phpで入力、confirm.phpで確認表示、そしてoutput.phpの前にsave.phpにてfile_put_contentsで入力内容をtxtファイルに保存し、output.phpにてfile_get_contentsでtxtファイルを読みだして表示という流れになっております。この辺りが原因でしょうか?

    キャンセル

  • 2018/05/09 10:35 編集

    質問中にない説明を後出し回答コメント内で加えられても困りますので、質問中に全体の流れを正しく説明ください。

    キャンセル

  • 2018/05/09 10:36

    流れと内容を全て一通り質問に書き出したほうが良いかと思います。
    断片的過ぎては問題の根本が見えてきません。

    キャンセル

  • 2018/05/09 13:37

    改めて、ありがとうございました。
    あらゆる点でとても勉強になりました。

    キャンセル

checkベストアンサー

0

質問追記を受けての追記。
本来はもう少し流れ部分から根本的に見直したほうが良いです。
「php 入力 確認 完了」などで検索するとそれなりのサンプルコードが結構でてきます。
(CRUDの基本のキなので誰もが通るみちですし)

ひとまず現状を対応するための対応です。

htmlspecialchars()をした情報がjson_encode()されて入るという謎の流れが気にはなりますが、
ちゃんと取得時はjson_decode()がされて取得しているとすると、
output.phpでは取得した際には

おはよう
こんにちは
こんばんは


のように改行コードが入った状態で取得されるので、
nl2br()すれば良いだけです。

$text = json_decode(~file.txtから取得した文字列~);
echo '<p>'.nl2br($text).'</p>';

追記:
変数の中身をポイントポイントでechoやvar_dumpを利用してデバッグする癖をつけると良いです。
そうすることで想定の情報が想定の状態かどうかとか、想定の場所を通っているかと言うのが分かるので、
問題解決まで早くなります。



下記でできないのは、nl2br()で改行タグを入れたのにhtmlspecialchars()で改行タグの<>などが変換されているためです。

echo '<p>'.htmlspecialchars($textarea).'</p>';

nl2br()

改行文字の前に HTML の改行タグを挿入する

htmlspecialchars()

特殊文字を HTML エンティティに変換する

今回の場合、再度htmlspecialchars()を入れる必要はないです。
最初のコードで問題ないと思いますが。。

$textarea = $_POST['textarea'];
$textarea = htmlspecialchars($textarea);
$textarea = nl2br($textarea);

echo '<p>'.$textarea.'</p>';


画面表示:
おはよう
こんにちは
こんばんは

html:
<p>おはよう<br />
こんにちは<br />
こんばんは</p>

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/09 13:17

    ご丁寧にありがとうございました。
    save.phpの$textarea = htmlspecialchars($textarea);を消し、
    output.phpでecho '<p>'.nl2br($text).'</p>';に修正したらできました!
    不必要なhtmlspecialcharsを実行していたのですね。
    CRUD等についても勉強していきます。
    大変助かりました。本当にありがとうございました。

    キャンセル

  • 2018/05/09 13:20

    それぞれの機能を理解し、適切な場面で適切に使えるように試行錯誤していってください。

    キャンセル

0

nl2br がなにやってるか調べてみてください。

追記
<br />
で改行されないってことなので、<textarea> の入力を <textarea> へ出力したいのだと認識して回答を書いています。

<?php
$textarea = "hoge\r\nhoge\r\nhoge\r\n";
$textarea = htmlspecialchars($textarea);
$file = 'file.txt';
file_put_contents ($file, json_encode($textarea));
$text = json_decode(file_get_contents('./'.$file));
?>
<textarea><?php echo $text;?></textarea>


これで正しく <textarea> 内に改行付きで表示されます。
nl2br の挙動が理解できていれば、nl2br が余計なことしてるって辿り着けると思います。

ちなみに、複数の方から指摘がありますが、htmlspecialchars は表示する際にエスケープする関数なので、表示の際に使用するのが適切です。
入力値は生のまま持つのが基本です。

<?php
$textarea = "hoge\r\nhoge\r\nhoge\r\n";
$file = 'file.txt';
file_put_contents ($file, json_encode($textarea));
$text = json_decode(file_get_contents('./'.$file));
?>
<textarea><?php echo htmlspecialchars($text, ENT_QUOTES, 'UTF-8');?></textarea>


あと、コードは最低限再現するものを記述しないと、まともに回答できません。
今回の回答はエスパー回答です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/09 10:20 編集

    ご回答ありがとうございます。
    改行コードを<br />に変換する関数と本に載っていたので使用しました。
    改行するべき部分に<br />が挿入されているので変換されていると思うのですが、
    文字列としてではなくタグとして認識されるにはどうすればいいのかわかりません。

    キャンセル

  • 2018/05/09 10:25

    こんな感じです。改行を<br>に変換しなければ、textarea 内で反映されます。
    <?php
    $str="hoge\r\nhoge\r\nhoge\r\n";
    ?>
    <textarea><?php echo $str;?></textarea>

    キャンセル

  • 2018/05/09 11:22

    質問が修正されたので、回答に追記しました。
    再度質問を修正されることを提案します。

    キャンセル

  • 2018/05/09 11:47 編集

    他の人の回答見ると、<p> + nl2br + htmlspecialchars が要因って説が本命っぽいですね。

    キャンセル

  • 2018/05/09 12:37

    質問修正後のコードを確認しました。htmlspecialchars の挙動が理解できていなかったみたいですね。

    キャンセル

  • 2018/05/09 13:36

    ご回答ありがとうございました。
    理解が足りておらず質問の仕方も不十分だったようで大変失礼いたしました。
    仰るとおり不必要なhtmlspecialcharsを使用しておりました。
    大変勉強になりました。

    キャンセル

0

以下の行を消して、

$textarea = nl2br($textarea);

表示するときに以下のようにスタイルを追加してみてください。

echo '<p style="white-space: pre-wrap;">'.$textarea.'</p>';

改行をそのまま出力します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/09 13:21

    ご回答ありがとうございます。
    レベルが低すぎて何を記載すればきちんと質問点が伝わるのかもわからず、
    言葉が足りず申し訳ありません。
    不要なhtmlspecialcharsを実行していたのが原因でした。
    ありがとうございました。

    キャンセル

0

htmlspecialchars — 特殊文字を HTML エンティティに変換する
nl2br — 改行文字の前に HTML の改行タグを挿入する

それぞれの関数のサンプルコードをよく読んで動作を理解してください。

そして、保存用データと表示用データを一つの変数で扱うのは危険です。
confirm.php内で

$textarea = $_POST['textarea'];
echo nl2br(htmlspecialchars($textarea));


とすれば、$textarea変数内のデータを改変せずに保持したまま表示用に加工できます。
confirm.phpからoutput.phpにおそらくhiddenで渡すデータには、
改変していないデータを渡すようにすればいいです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/09 13:31

    ご回答ありがとうございました。
    htmlspecialcharsの理解が不十分だったことが原因でした。
    その他にも至らない点が多く大変失礼いたしました。

    よろしければもう一点ご回答いただきたいのですが、
    「保存用データと表示用データを一つの変数で扱うのは危険」なのは何故なのでしょうか。

    キャンセル

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

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

関連した質問

  • 解決済

    ファイルダウンロードについて

    質問 PHPで、Submitボタンを押下すると、 テキストボックスに入力した値を処理して、処理結果をテキストファイルに出力するプログラムを作成しています。 このときSubmi

  • 解決済

    掲示板の削除機能をつけたい

    簡易な掲示板を作成しました。タイトルや名前などをつけて投稿ができるようになっています。このコードを応用してできるだけ簡単に投稿した内容を削除する機能をつけたいです。アイデアが思い浮

  • 受付中

    フォームの内容をデータベースに入れたい

    <!DOCTYPE html> <head> <title> サンプルフォーム </title> </head> <body> <form action="0829post.php

  • 受付中

    phpでの掲示板編集機能について

    現在phpを用いた掲示板を作成しているのですが、指定した番号のコメントを編集する機能がどうしても実装できません。 改善点を教えて頂けると嬉しいです。 <html> <body>

  • 解決済

    PHP formを元のページで出力するには? ($_SERVERが問題だと思うのですが......)

    action要素内の$_serverの問題だと思うのですが、一つのファイルの中でsubimitを押したときに表示されるようにしたいのですが、どうしたらいいでしょうか? *<?php

  • 解決済

    formのtype="button"でsubmitさせたい

    現在ページ切り替え(ページ遷移)をしないformを作っているのですが、 <div class="submit"><button type="button" name="mode

  • 解決済

    POST通信とjavascript

    現在htmlでFORMをつかったPOST通信を使っています 入力フォームを作るにあたり、記入されているか確認するためにjavascriptを使ってみました。 いかにコードを入れます

  • 解決済

    php ログインできなくなる

     前提・実現したいこと phpでログインシステムを実装中に以下のエラーが発生しました。  発生している問題・エラーメッセージ Warning: session_start():

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

  • PHP

    20326questions

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