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

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

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

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

Q&A

解決済

5回答

2989閲覧

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

3.a.m.op

総合スコア11

PHP

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

0グッド

1クリップ

投稿2018/05/09 01:06

編集2018/05/09 03:30

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

input.phpで入力

confirm.phpで確認表示

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

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

という流れです。

現在、
input.php

html

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

confirm.php

php

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

html

1<p>入力内容を確認してください</p> 2<p><?php echo $textarea; ?></p> 3<form action="save.php" method="post"> 4<input type="hidden" name="textarea" value="<?php echo $textarea; ?>"> 5<button type="button" onclick="history.back()">戻る</button> 6<button type="submit">更新</button> 7</form>

save.php内では

php

1$textarea = $_POST['textarea']; 2$textarea = htmlspecialchars($textarea); 3$file = 'file.txt'; 4file_put_contents ($file, json_encode($textarea));

html

1<p>更新完了</p> 2<a href="output.php">更新を確認</a>

output.php内では

php

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

となっております。

例えば、
input.phpで

おはよう

こんにちは
こんばんは

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

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

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

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

php

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

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

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

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

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

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

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

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

m.ts10806

2018/05/09 01:20

input→confirm→output という流れで良いですか?confirmからoutputへどのように渡しているのでしょうか?各html部分もご提示ください。
退会済みユーザー

退会済みユーザー

2018/05/09 01:39 編集

input→confirm→save(ナニソレ)→output、らしいですよ。恥ずかしがらずにすべてのソースを掲載してほしいものです。(どうせ学校の課題かなにかで秘密にしておかないといけない部分なんて無いんじゃないかな。)
m.ts10806

2018/05/09 01:40

無駄な処理が沢山ありそうですね。オーソドックスな「入力→確認→完了」の流れであれば割りとサンプルコードは溢れてそうですが、何かしら課題があるのでしょうか。。
退会済みユーザー

退会済みユーザー

2018/05/09 01:43

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

2018/05/09 01:52 編集

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

2018/05/09 02:17 編集

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

回答5

0

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

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

投稿2018/05/09 01:09

編集2018/05/09 01:10
maisumakun

総合スコア145062

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

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

m.ts10806

2018/05/09 01:18

あ、そういうことか。誤解してました;
3.a.m.op

2018/05/09 01:29

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

退会済みユーザー

2018/05/09 01:38 編集

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

2018/05/09 01:36

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

2018/05/09 04:37

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

0

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

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

php

1<?php 2$textarea = "hoge\r\nhoge\r\nhoge\r\n"; 3$textarea = htmlspecialchars($textarea); 4$file = 'file.txt'; 5file_put_contents ($file, json_encode($textarea)); 6$text = json_decode(file_get_contents('./'.$file)); 7?> 8<textarea><?php echo $text;?></textarea>

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

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

php

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

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

投稿2018/05/09 01:07

編集2018/05/09 02:29
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

3.a.m.op

2018/05/09 01:20 編集

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

退会済みユーザー

2018/05/09 01:25

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

退会済みユーザー

2018/05/09 02:22

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

退会済みユーザー

2018/05/09 02:47 編集

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

退会済みユーザー

2018/05/09 03:37

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

2018/05/09 04:36

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

0

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

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

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

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

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

投稿2018/05/09 01:27

編集2018/05/09 01:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

3.a.m.op

2018/05/09 04:31

ご回答ありがとうございました。 htmlspecialcharsの理解が不十分だったことが原因でした。 その他にも至らない点が多く大変失礼いたしました。 よろしければもう一点ご回答いただきたいのですが、 「保存用データと表示用データを一つの変数で扱うのは危険」なのは何故なのでしょうか。
guest

0

ベストアンサー

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

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

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

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

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

php

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

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



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

php

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

nl2br()

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

htmlspecialchars()

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

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

php

1$textarea = $_POST['textarea']; 2$textarea = htmlspecialchars($textarea); 3$textarea = nl2br($textarea); 4 5echo '<p>'.$textarea.'</p>'; 6

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

html:

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

投稿2018/05/09 01:17

編集2018/05/09 02:13
m.ts10806

総合スコア80731

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

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

3.a.m.op

2018/05/09 04:17

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

2018/05/09 04:20

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

0

以下の行を消して、

php

1$textarea = nl2br($textarea);

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

php

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

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

投稿2018/05/09 01:11

naga3

総合スコア1293

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

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

3.a.m.op

2018/05/09 04:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問