
No.4ベストアンサー
- 回答日時:
DBに何かを突っ込む時は、最低限の正規化を行う以外はなるべく元のデータのまま入れるようにし、変換は出力の直前に行うようにします。
「原則からはずれる」と書かれてますので、この辺りご存知の上での質問だと思いますが、もし「なぜそうするのか?」という部分が納得いくレベルで理解できていない場合は、下記をご参考ください。
例えば、改行とHTMLタグの混ざったデータがあるとします。
<h1>sample</h1>
<は<span><</span>と書きます
htmlspecialchars() を通すと↓のようになり、これをDBに入れたとします。
<h1>sample</h1>
<は<span>&lt;</span>と書きます
【例1】HTMLとして出力したい
「htmlspecialchars_decode() を通し改行を<br>に変換する」という処理が必要になります。
【例2】<h1>を含むデータを検索したい
単純に htmlspecialchars() を通して <h1> ⇒ <h1> にして検索するだけでは、例えば「<」での検索結果がおかしくなりますので、処理がやや煩雑になります。
【例3】phpMyAdmin等から簡単に中身を確認したい
パッと見では何が入っているのかよく分かりません(笑)
このように、データに対する「汎用性」が失われてしまうので、「最低限の正規化を行う以外はなるべく元のデータのまま入れるようにし、変換は出力の直前に行うようにする」わけです。
そういった事まで「理解した上で」あえて htmlspecialchars() を通してからDBに入れるという設計にしたいのであれば、好きにすれば良いです。
> 変換した文字がmysqlに不具合を与えることはありますか?
DBにデータを入れる際に適切な処理(プリペアドステートメントを使う or 特殊文字のエスケープを行う)が行われているのであれば、どのような文字列であっても、DBにデータを入れる事自体には問題ありません。
> 例えば1000行10カラムを表示する場合、1万回もhtmlspecialcharsを使わなくてはいけないので、何とか軽く処理できないか
DBに格納する処理よりも出力する処理が呼ばれる回数の方が圧倒的に多くなりますから、DBに突っ込んだデータをそのまま出力する事を想定しているのであれば、決して間違った発想ではありませんが、例えば…
$html = '';
while ($row = $stmt->fetch()) {
$html .= $row['foo'];
}
$html = htmlspecialchars($html);
…のようにすれば1回で済みますよね。始めから「1万回htmlspecialchars() 呼ばなければいけない」と決めつけるのではなく、柔軟な発想が必要です。
更に究極を言えば、PHPを通してHTMLを出力するよりも、静的なHTMLを出力した方が処理速度は圧倒的に速いです。
即ち、htmlspecialchars() 等を通し更にHTMLとして加工した結果をHTMLファイルとして保存し、出力はDBを通さずにそのHTMLファイルを出力するようにするのが最速です。
お答え頂きありがとうございます
>のようにすれば1回で済みますよね。
頭固かったです!すいません
>HTMLを出力
やってみます。ありがとうございました(_ _
No.3
- 回答日時:
私も#2さん同様に、どうしてもやりたいならやれば?という感じです。
少なくとも、
>変換した文字がmysqlに不具合を与えることはありますか?
というのは杞憂です。
変換したからと言って、それが理由でmysqlに不具合を与えることはありません。
#2さんと違うのは
>登録する前に処理するか、後に処理するかのレベルで
>処理は軽くならないですね
というのは違うだろうというところですかね。
登録は1度でも、表示は何千回もという事は普通にあるので…。
ま、検索性やHTML表示以外に使い難くなるという指摘は完全にその通り。
それ以外には、登録後に再編集する場合にhtmlspecialchars_decodeで元に戻す必要があるとか、$double_encode = trueを指定していた場合は正しく戻せない場合があるとか、他のシステムは変換して保存する事はほとんどないので混乱しやすい(しかも、もしミスをすれば重篤なセキュリティホールの可能性が)とデメリットは多い。
どうしても必要なら、入力値そのままと変換後の値を別々のフィールドに格納するといいかも。
仮に現在titleというフィールドがあるとして、title、encoded_titleのように分けて登録しておいて…
検索にはtitleを使って、表示にはencoded_titleを使う。
再編集の際には、htmlspecialchars_decodeを使って元に戻すのではなく、titleからデータを引っ張ってきてのような感じ。
#2さんの指摘の、データ量がちょっと増えるどころか、倍以上に増えるという事になってしまってますが。
encodedがついたフィールドは変換済みと明確なので、混乱度合いが小さく済むだろうという期待も込めて。
ちなみに、
>例えば1000行10カラムを表示する場合
これは、ユーザーが使い難いUIとなる気がするので、50行程度でページ分割するなどの方法を選ぶ方がずっといいとは思う。
お答え頂きありがとうございます
>というのは杞憂です。
少し安心しました
>htmlspecialchars_decodeで元に戻す
こんなことができるんですね
>登録後に再編集する場合にhtmlspecialchars_decodeで元に戻す必要がある
そうですよね。再編集のときに戻さないといけないですよね、コレについてはもう一つ選択がありました
No.2
- 回答日時:
>mysqlに登録する前に使えませんか?
使いたければ使えばよいのでは?・・・レベルの話
ただし・・・
>何とか軽く処理できないか
登録する前に処理するか、後に処理するかのレベルで
処理は軽くならないですね
むしろ前にする方がデータは重くなるし、検索性もわるくなるし
html以外にデータ活用する際に邪魔になるしいいこと一つもないと思いますが
お答え頂きありがとうございます
そうですよね、検索は重くなりますよね、今回は<などの記号を使う人は1000人いたら10人くらいですので検索の重さはきにならないです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP 書籍よりも より良い htmlspecialchars の変更を 1 2022/04/18 02:28
- PHP isset — 変数が宣言されていること、そして null とは異なることを検査 1 2022/03/27 17:34
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PostgreSQL PostgressからMySQL(MariaDB)へ構造を変更する際のTimestamp等について 2 2023/04/04 12:09
- JavaScript Typescript が必要な理由 1 2023/01/07 11:45
- MySQL MySQLに登録した内容を更新する時の、textareaの使い方 1 2022/07/11 18:20
- Visual Basic(VBA) VBA初心者です。 2 2022/10/10 11:52
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jspで作った入力フォーム内...
-
PDF出力
-
動的にhtmlテーブルを表示
-
ページに時間制限
-
GETとPOST
-
PHPでSESSIONによる変数の引き継ぎ
-
htmlspecialcharsの挙動について
-
ランキングサイトのスパム登録...
-
ブラウザの戻るボタンで重複登...
-
httpでもログインフォームは暗...
-
リストボックスにテキスト入力...
-
asp.netでのセッションを使用し...
-
ログイン画面から入って、「戻...
-
IFRAME内PHPのセッション変数取...
-
PHP+Mysqlによる会員制サイト
-
cURL関数を使用したphpからのpo...
-
PHP+MySQLからHTMLページを自動...
-
GETのメリットについて
-
Dosブロンプトでtabを出力したい
-
重複を無くしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
IFRAME内PHPのセッション変数取...
-
PHPで値を保持する方法
-
POSTで受け渡したものを保存し...
-
cURL関数を使用したphpからのpo...
-
php 入力画面から確認表示画面...
-
htmlspecialcharsについて
-
php history.back()の戻るボタ...
-
セッションを使用したページ遷移
-
ログイン画面から入って、「戻...
-
ブラウザの戻るボタンで重複登...
-
「ページネーション」で検索キ...
-
閉じるボタン「×」を制御したい
-
動的にhtmlテーブルを表示
-
PHP+MySQLからHTMLページを自動...
-
ブラウザバックしてもチェック...
-
PHP+MySQLで型の整合について
-
HTMLエスケープ処理とデーター...
-
登録確認メールのリンクURLにメ...
-
PHP スマーティ
-
VBAで重複チェックの仕方を教え...
おすすめ情報