こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

DBから出力の際preg_replace等が効かぬ

データベースを使ったウェブサイト。
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に入れてしまったほうが希望通りに動きます。

さっぱり困りました。

投稿日時 - 2012-01-26 13:56:15

QNo.7267594

すぐに回答ほしいです

質問者が選んだベストアンサー

こんばんは。

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

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

投稿日時 - 2012-02-02 23:43:30

補足

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:49

お礼

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

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

投稿日時 - 2012-02-03 01:46:55

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

こんばんは。

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

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
ここだけ使ったらどう?

投稿日時 - 2012-02-02 19:08:44

お礼

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

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

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

投稿日時 - 2012-02-02 23:11:03

ANo.4

こんばんは。

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

その時に、
preg_replace("<br/>", "/\r\n/", DBから取得したデータ);
じゃダメなん???

投稿日時 - 2012-02-01 19:36:17

お礼

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

となると、
管理画面のように、更新がある場合は大変ですね。
-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:35

ANo.3

こんにちは。

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

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

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

投稿日時 - 2012-01-29 11:30:14

補足

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

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:02

お礼

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

投稿日時 - 2012-02-01 17:02:20

ANo.2

mysql_real_escape_string の前にすでに、addslashes 状態なのでは?
magic_quotes_gpc ディレクティブの設定を確認してみてください。

投稿日時 - 2012-01-27 16:59:49

補足

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

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

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

投稿日時 - 2012-01-28 23:27:40

ANo.1

こんばんは。

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

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

投稿日時 - 2012-01-26 18:09:35

補足

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

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

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

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

投稿日時 - 2012-01-28 23:30:55