公式アカウントからの投稿が始まります

データベースを使ったウェブサイト。
POSTを使ったformタグより、textareaにてテキストをsql文にて、
MySqlにinsertし、(このときにmysql_real_escape_string)
読み出すときにhtmlspecialcharsしてprint。

これが一般的な流れなのですが、
上記のまま行うと、改行(\r\n)がウェブ上に見えてしまいます。
ですので、

1:print preg_replace("/\r\n/","<br />", htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8'));
2:print nl2br(htmlspecialchars($ans['Pt_txt1'], ENT_QUOTES, 'UTF-8'));

などをやって消そうとしているのですが消えません。

ためしに、

$aaa ="適当な文字";
1:print preg_replace("/\r\n/","<br />", htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8'));
2:print nl2br(htmlspecialchars($aaa, ENT_QUOTES, 'UTF-8'));

のように、MySqlを介さずに直接出力した場合、
ちゃんと改行コードは<br />に変更してくれましたので
ソースの記述ミスではないと思うのです。

原因はなににあるでしょうか。


なお、現状phpmyadminで覗くと、

「フィールドA」(mysql_real_escape_stringを通してinsert)
-----
あいうえお\r\nかきくけこ
-----

「フィールドB」(mysql_real_escape_stringを通さずにinsert)
-----
さしすせそ
たちつてと
-----
となっているフィールドがありますが、

それらがhtmlで出力されたもののソースを見ると、
-----
A:あいうえお\r\nかきくけこ
B:さしすせそ<br />たちつてと

となぜかBのほうが希望通りの動きをします。
cを通さずにDBに入れてしまったほうが希望通りに動きます。

さっぱり困りました。

A 回答 (6件)

こんばんは。



>コーギーが人のように思えてきました。
これは雑種です・・・。
バセンジーが入ってるようですが、よーわからん・・・。
保健所行きを貰ったので。

>ブラウザに出す場合はいかなる例外もなくhtmlspecialcharsを通す。
>というルールは守ったほうがいい気がするのですが
表示エリアはそうですね。
テキストエリアは例外扱いできないの???
そんなこと言ったら、<pre>はどーするの?

この回答への補足

DBに入れる直前
$Pt_txt1 = mysql_real_escape_string($Pt_txt1);//安全化

ブラウザに出す直前
$Pt_txt1 = nl2br(htmlspecialchars($Pt_txt1, ENT_QUOTES, 'UTF-8'));//(一般のブラウザ)
$Pt_txt1 = htmlspecialchars($Pt_txt1, ENT_QUOTES, 'UTF-8');//(テキストエリア)

これでいけそうです。

補足日時:2012/02/03 02:00
    • good
    • 0
この回答へのお礼

こんばんは。
気付けば今週はこればかりやっています。
http://oshiete.goo.ne.jp/qa/1436841.html

上記にもあるように、やはりDBに入れる前に<br />にするのはよそうと思います。
ということでまた1からやり直します。

お礼日時:2012/02/03 01:46

こんばんは。



なんかよくわからんが・・・、考えすぎじゃないの???

1.画面の入力(テキストエリアとする)値は
あああ\r\nいいい\r\n&

2.POSTで飛んでくるので、
preg_replace("/\r\n/","<br />")
mysql_real_escape_string
あああ<br/>いいい<br/>& → DBに入る(&はそのままでよし)

3.テキストエリアに出力
preg_replace("<br/>","/\r\n/")
元のまま・・・。

4.表示エリアに出力
htmlspecialchars
ここだけ使ったらどう?
    • good
    • 0
この回答へのお礼

何度もありがとう。コーギーが人のように思えてきました。

2は確かに僕の書き方の逆でもいいですね。

問題は3なんです。ブラウザに出す場合はいかなる例外もなくhtmlspecialcharsを通す。
というルールは守ったほうがいい気がするのですが、杞憂ですか?

お礼日時:2012/02/02 23:11

こんばんは。



><textarea></textarea>で引っ張ってきた際、
>その入力フォーム内で<br />がまる見えになってしまいました。

その時に、
preg_replace("<br/>", "/\r\n/", DBから取得したデータ);
じゃダメなん???
    • good
    • 0
この回答へのお礼

こんにちは。確かにさらに元に戻せばいいんですよね・・・

となると、
管理画面のように、更新がある場合は大変ですね。
-textarea-----------


--------------------
をDBに入れる時
mysql_real_escape_stringで見えない改行コードを\r\nに変え、
それをさらにpreg_replace("/\\r\\n/","<br />")で<br />に変換
-DB-----------------
あ<br />い
--------------------

それを出力する際は、
preg_replace("/<br \/>/","\n")でまた見えない改行コードに直して
htmlspecialcarsをかけて、安全化
-textarea-----------


--------------------

ですね。
ただ、htmlspecialcharsをかけたことにより半角アンド(&)などの問題はどうしましょうか。
※ここからはhtmlspecialcharsについての完全な別件になりますが・・・

-textarea-----------
あ&い
--------------------
をDBに入れる時
mysql_real_escape_stringで見えない改行コードを\r\nに変え、
それをさらにpreg_replace("/\\r\\n/","<br />")で<br />に変換
-DB-----------------
あ&い
--------------------

それを出力する際は、
preg_replace("/<br \/>/","\n")でまた見えない改行コードに直して
htmlspecialcharsをかけて、安全化
-textarea-----------
あ&amp;い
--------------------
↑こうなっちゃいますよね。

というように、specialcharsを変えて変になっちゃう特有な文字を戻すのに
1つ1つ処理をやっていかないとだめってことですかね?

textareaに出力する前に、
preg_replace("/<br \/>/","\n")でまた見えない改行コードに直して
htmlspecialcharsをかけて、安全化

の部分が、

preg_replace("/<br \/>/","\n")でまた見えない改行コードに直して
htmlspecialcharsをかけて、安全化
preg_replace("/'/","'")でキレイにして
preg_replace("/&lt;/","<")でキレイにして
preg_replace("/&gt;/",">")でキレイにして・・

というように変更すればいいってことですか?

お礼日時:2012/02/02 16:38

こんにちは。



>phpmyadminで確認すると\r\nとなっています。

そうですよ。
「\r\n」と目で見れるという事は、
内部的には「\\r\\n」という文字列になっているからです・・・。
改行コードで格納されていれば、普通には見えません。

<br/>変換してから格納するのに抵抗があるのなら、
取得してから「\\r\\n」を「\r\n」に変換してから、
nl2brとかやるしかないですね。

この回答への補足

こんにちは。
ありがとうございます。

phpmyadminで見えている\r\nは\\r\\nなんですね。
なるほど。

いましきりに
> 取得してから「\\r\\n」を「\r\n」に変換してから、
の部分を頑張っていますが、うまくいっておりません。


$txt1 = preg_replace("/\\r\\n/","<br />", $ans['Pt_txt1']);
$txt1 = preg_replace("/\r\n/","<br />", $txt1);
print $txt1;

$txt2 = preg_replace("/\\r\\n/","/\r\n/", $ans['Pt_txt1']);
$txt2 = nl2br($txt1);
print $txt2;


ご指導をお願いできたら嬉しいです。

補足日時:2012/02/01 15:28
    • good
    • 0
この回答へのお礼

やはりDBに<br />を入れるのは大変です。
SQLインサート前に改行コード(\n?)を<br />に変えて格納したところ、
<textarea></textarea>で引っ張ってきた際、
その入力フォーム内で<br />がまる見えになってしまいました。
タグを知らない人が編集しようとしたら驚いてしまいますね。

お礼日時:2012/02/01 17:02

mysql_real_escape_string の前にすでに、addslashes 状態なのでは?


magic_quotes_gpc ディレクティブの設定を確認してみてください。

この回答への補足

ご返事ありがとうございます。

magic_quotes_gpc = Off、On ともにやってみてもだめでした。
addslashesとかを触らせないためにもphpmyadminにちょくで\r\nと書いてもだめです。

ほかの文字列なら置換してくれるのになぜかこの改行コードだけだめです。

補足日時:2012/01/28 23:27
    • good
    • 0

こんばんは。



MySQLに入れる前に、
mysql_real_escape_string
をやってしまってるので、htmlから飛んできた「\r\n」などは、「\\r\\n」として格納されます。
なので、DB上はただの文字列です・・・。

格納する特に「<br/>」にしてしまう方が無難かと思いますが・・・。

この回答への補足

ご返事ありがとうございます。

> htmlから飛んできた「\r\n」などは、「\\r\\n」として格納されます。

とありますが、phpmyadminで確認すると\r\nとなっています。
どう格納されているか目では正しく確認できないということですか?

また、格納はあくまで生データが基本というルールが一般的っぽかったので
なるべくそうしようと思っていましたが、改行コードくらいはさきに
変換しちゃっても逸脱しませんか?害がなければそうしたいですが・・

補足日時:2012/01/28 23:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!