8

基本的に、MySQLデータベースからのデータを表示する上で、htmlspecialchars()一重引用符と二重引用符を安全なエンティティに変換する必要がある以下の関数があります。私が抱えている問題は、ソースコードの表示にあります。これは< > &、一重引用符と二重引用符を変換するためにも必要な場合にのみ変換されます。

//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
    return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}

次に、たとえば使用したい場合は、次のようにします。

htmlsan($row['comment']);

一重引用符と二重引用符を変換しない理由を誰かに教えてもらえますか?

アップデート

奇妙なことhtmlsan()に、電子メールのコメントに使用されており、電子メールのソースコードを表示すると、それらが変換されますが、Webページに表示するときにデータベースからの一重引用符/二重引用符は変換されないようです。データベース照合もutf8_general_ciに設定されており、データベース接続などでutf8を使用していることを宣言します。

4

5 に答える 5

11

どのように正確にテストしていますか?

<?php

//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
    return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}

var_dump(htmlsan('<>\'"'));

... プリント:

string(20) "&lt;&gt;&#039;&quot;"

私の推測では、入力文字列は Microsoft Word からのもので、誤字脱字が含まれていると思います。

var_dump(htmlsan('“foo”')); // string(9) "“foo”" 

何らかの理由でそれらを変換する必要がある場合は、次のものが必要htmlentities()ですhtmlspecialchars()

var_dump(htmlentities('“foo”', ENT_QUOTES, 'UTF-8')); // string(17) "&ldquo;foo&rdquo;"

更新 #1

さて、適切なテストの時間です。データベース フィールドに一重引用符 ( ') を入力commentし、取得時に次のコードを実行します。

var_dump(bin2hex("'"));
var_dump(htmlspecialchars("'", ENT_QUOTES, 'UTF-8'));
var_dump(bin2hex($row['comment']));
var_dump(htmlspecialchars($row['comment'], ENT_QUOTES, 'UTF-8'));

これを出力する必要があります:

string(2) "27"
string(6) "&#039;"
string(2) "27"
string(6) "&#039;"

質問を更新して、このテストを実行し、同じ出力または異なる出力が得られたかどうかを確認してください。

アップデート #2

あなたが得ていると主張する出力を注意深く見てください:

string(6) "'"

これは 6 文字の文字列ではありません。実際の出力を見ているのではなく、ブラウザーによってレンダリングされた出力を見ているのです。期待どおりの結果が得られていると確信していますstring(6) "&#039;"&#039;Webブラウザでレンダリングすると になり'ます。実際の出力を表示するには、ブラウザーの[ソースの表示] メニューを使用します。

于 2011-01-18T10:17:00.483 に答える
4

Firebug を使用してソースコードを表示すると、Web ブラウザーが表示するように Firebug が表示されます。ブラウザー メニュー バーの [ソースを表示] に移動した場合と同じようにソース コードが表示されると思いました。頭痛は学び、記憶されます。貴重な時間とご意見をお寄せいただきありがとうございます。

于 2011-01-19T14:36:23.210 に答える
1

これで違いが生じるかどうかはわかりませんが、を削除してみましたか$htmlsanitize

function htmlsan($htmlsanitize){
    return htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
于 2011-01-18T10:04:42.383 に答える
1

同じ問題がありました。私のデータベースは utf-8_unicode_ci と私の html charset utf-8 を使用しており、htmlentities は引用符以外のすべてを変換しただけです。db と html の両方で同じ文字セットを使用するとうまくいくと思いましたが、そうではありませんでした。そこで、html の文字セットを iso-8859-1 に変更したところ、うまくいきました。理由はわかりませんが、うまくいきました。私のデータベースはまだ utf-8_unicode_ci です。

于 2014-11-06T06:31:15.100 に答える
0

使用する

htmlentities($htmlsin, ENT_QUOTES, 'UTF-8');

また

mb_convert_encoding($htmlsan, "HTML-ENTITIES", "UTF-8");

おそらくあなたが望むことをするでしょう。

于 2011-01-18T10:25:30.470 に答える