• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DBから出力の際preg_replace等が効かぬ)

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

このQ&Aのポイント
  • データベースを使用したウェブサイトで、POSTを使用してformタグからテキストをsql文に変換し、MySqlに挿入します。しかし、改行が正しく表示されず、消せません。
  • htmlspecialcharsとnl2brを使用して改行を変換しようとしましたが、うまくいきませんでした。
  • 他の文字列を直接出力した場合には正しく改行が変換されるため、ソースの記述ミスではないと考えています。なぜ改行が消えないのか、原因を教えてください。

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

  • ベストアンサー
回答No.6

こんばんは。 >コーギーが人のように思えてきました。 これは雑種です・・・。 バセンジーが入ってるようですが、よーわからん・・・。 保健所行きを貰ったので。 >ブラウザに出す場合はいかなる例外もなくhtmlspecialcharsを通す。 >というルールは守ったほうがいい気がするのですが 表示エリアはそうですね。 テキストエリアは例外扱いできないの??? そんなこと言ったら、<pre>はどーするの?

raryrary
質問者

お礼

こんばんは。 気付けば今週はこればかりやっています。 http://oshiete.goo.ne.jp/qa/1436841.html 上記にもあるように、やはりDBに入れる前に<br />にするのはよそうと思います。 ということでまた1からやり直します。

raryrary
質問者

補足

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');//(テキストエリア) これでいけそうです。

すると、全ての回答が全文表示されます。

その他の回答 (5)

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

raryrary
質問者

お礼

何度もありがとう。コーギーが人のように思えてきました。 2は確かに僕の書き方の逆でもいいですね。 問題は3なんです。ブラウザに出す場合はいかなる例外もなくhtmlspecialcharsを通す。 というルールは守ったほうがいい気がするのですが、杞憂ですか?

すると、全ての回答が全文表示されます。
回答No.4

こんばんは。 ><textarea></textarea>で引っ張ってきた際、 >その入力フォーム内で<br />がまる見えになってしまいました。 その時に、 preg_replace("<br/>", "/\r\n/", DBから取得したデータ); じゃダメなん???

raryrary
質問者

お礼

こんにちは。確かにさらに元に戻せばいいんですよね・・・ となると、 管理画面のように、更新がある場合は大変ですね。 -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;/",">")でキレイにして・・ というように変更すればいいってことですか?

すると、全ての回答が全文表示されます。
回答No.3

こんにちは。 >phpmyadminで確認すると\r\nとなっています。 そうですよ。 「\r\n」と目で見れるという事は、 内部的には「\\r\\n」という文字列になっているからです・・・。 改行コードで格納されていれば、普通には見えません。 <br/>変換してから格納するのに抵抗があるのなら、 取得してから「\\r\\n」を「\r\n」に変換してから、 nl2brとかやるしかないですね。

raryrary
質問者

お礼

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

raryrary
質問者

補足

こんにちは。 ありがとうございます。 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; ご指導をお願いできたら嬉しいです。

すると、全ての回答が全文表示されます。
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

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

raryrary
質問者

補足

ご返事ありがとうございます。 magic_quotes_gpc = Off、On ともにやってみてもだめでした。 addslashesとかを触らせないためにもphpmyadminにちょくで\r\nと書いてもだめです。 ほかの文字列なら置換してくれるのになぜかこの改行コードだけだめです。

すると、全ての回答が全文表示されます。
回答No.1

こんばんは。 MySQLに入れる前に、 mysql_real_escape_string をやってしまってるので、htmlから飛んできた「\r\n」などは、「\\r\\n」として格納されます。 なので、DB上はただの文字列です・・・。 格納する特に「<br/>」にしてしまう方が無難かと思いますが・・・。

raryrary
質問者

補足

ご返事ありがとうございます。 > htmlから飛んできた「\r\n」などは、「\\r\\n」として格納されます。 とありますが、phpmyadminで確認すると\r\nとなっています。 どう格納されているか目では正しく確認できないということですか? また、格納はあくまで生データが基本というルールが一般的っぽかったので なるべくそうしようと思っていましたが、改行コードくらいはさきに 変換しちゃっても逸脱しませんか?害がなければそうしたいですが・・

すると、全ての回答が全文表示されます。

関連するQ&A