
データベースを使ったウェブサイト。
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に入れてしまったほうが希望通りに動きます。
さっぱり困りました。
No.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');//(テキストエリア)
これでいけそうです。
こんばんは。
気付けば今週はこればかりやっています。
http://oshiete.goo.ne.jp/qa/1436841.html
上記にもあるように、やはりDBに入れる前に<br />にするのはよそうと思います。
ということでまた1からやり直します。
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
ここだけ使ったらどう?
何度もありがとう。コーギーが人のように思えてきました。
2は確かに僕の書き方の逆でもいいですね。
問題は3なんです。ブラウザに出す場合はいかなる例外もなくhtmlspecialcharsを通す。
というルールは守ったほうがいい気がするのですが、杞憂ですか?
No.4
- 回答日時:
こんばんは。
><textarea></textarea>で引っ張ってきた際、
>その入力フォーム内で<br />がまる見えになってしまいました。
その時に、
preg_replace("<br/>", "/\r\n/", DBから取得したデータ);
じゃダメなん???
こんにちは。確かにさらに元に戻せばいいんですよね・・・
となると、
管理画面のように、更新がある場合は大変ですね。
-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-----------
あ&い
--------------------
↑こうなっちゃいますよね。
というように、specialcharsを変えて変になっちゃう特有な文字を戻すのに
1つ1つ処理をやっていかないとだめってことですかね?
textareaに出力する前に、
preg_replace("/<br \/>/","\n")でまた見えない改行コードに直して
htmlspecialcharsをかけて、安全化
の部分が、
preg_replace("/<br \/>/","\n")でまた見えない改行コードに直して
htmlspecialcharsをかけて、安全化
preg_replace("/'/","'")でキレイにして
preg_replace("/</","<")でキレイにして
preg_replace("/>/",">")でキレイにして・・
というように変更すればいいってことですか?
No.3
- 回答日時:
こんにちは。
>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;
ご指導をお願いできたら嬉しいです。
やはりDBに<br />を入れるのは大変です。
SQLインサート前に改行コード(\n?)を<br />に変えて格納したところ、
<textarea></textarea>で引っ張ってきた際、
その入力フォーム内で<br />がまる見えになってしまいました。
タグを知らない人が編集しようとしたら驚いてしまいますね。
No.1
- 回答日時:
こんばんは。
MySQLに入れる前に、
mysql_real_escape_string
をやってしまってるので、htmlから飛んできた「\r\n」などは、「\\r\\n」として格納されます。
なので、DB上はただの文字列です・・・。
格納する特に「<br/>」にしてしまう方が無難かと思いますが・・・。
この回答への補足
ご返事ありがとうございます。
> htmlから飛んできた「\r\n」などは、「\\r\\n」として格納されます。
とありますが、phpmyadminで確認すると\r\nとなっています。
どう格納されているか目では正しく確認できないということですか?
また、格納はあくまで生データが基本というルールが一般的っぽかったので
なるべくそうしようと思っていましたが、改行コードくらいはさきに
変換しちゃっても逸脱しませんか?害がなければそうしたいですが・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- MySQL MySQLに登録した内容を更新する時の、textareaの使い方 1 2022/07/11 18:20
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- HTML・CSS HTMLソースの質問 3 2022/07/28 13:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLのVARCHARとVARCHAR2の違い
-
Float型の時の計算結果がおかしい
-
INT型は金額の型に使用するべき...
-
プライマリーキーの昇順でソー...
-
VBAで変数内に保持された二次配...
-
MySQLで先頭の0が省略されてし...
-
mysql(mariaDB)の格納文字数は...
-
ヌル値は記憶容量を必要としな...
-
経過時間(hhmmdd)をDATE型には...
-
DB2 INSERT時の格納順序
-
AccessからOrcleのODBCリンクテ...
-
MySQLカラム名は日本語と英数字...
-
ODP.NETのバージョン確認
-
旧filemakerで和暦(令和など)...
-
mysqlがインストールされている...
-
どれをDLすれば・・・
-
副問合せにLIKE文を使う方法は...
-
"文字列"? > CSVデータをMySQL...
-
筆ぐるめ住所録のバックアップ...
-
複数行のクエリを、まとめて実...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで変数内に保持された二次配...
-
SQLのVARCHARとVARCHAR2の違い
-
INT型は金額の型に使用するべき...
-
Excel VBA SelectedItems
-
postgreSQLのデータ型
-
プライマリーキーの昇順でソー...
-
Float型の時の計算結果がおかしい
-
オラクルのデータ型・通貨について
-
mysql(mariaDB)の格納文字数は...
-
カラムの長さを指定する意味に...
-
ヌル値は記憶容量を必要としな...
-
ハングル文字が入らない。
-
AccessからOrcleのODBCリンクテ...
-
MysqlにURLを登録する方法
-
MySQLで先頭の0が省略されてし...
-
経過時間(hhmmdd)をDATE型には...
-
select文でのデータの取り出し方法
-
MySQLの型のサイズ指定で速度は...
-
DB2 INSERT時の格納順序
-
MySQL TIMESTAMP型は、UTCですか?
おすすめ情報