3

ああ、私はPHPが好きではなかった、それはとても「不純」だ...

今、私はそれを使わなければなりません、そして私はそれに問題があります:主に私のために働かhtml_entity_decodeないようです。htmlspecialchars_decode私はこのフォーラムをずっと見てきましたが、何もありません。それはどこでも機能するようですが、ここでは機能しません...

映画のタイトルをすべてエンコードされたデータベースに送信し、DBから取得するときに、次のようにデコードします。

$title = html_entity_decode($row['Title']);

その後:

"title":"'.$title.'"

これは、PHPで作成しているJSONオブジェクトの一部です。その特定のオブジェクトのプロパティを見ると、タイトルがデコードされていませんが、実際には何も変更されていません。質問のタイトルに記載されているように両方の機能を試し、UTF-8のようにエンコードしてみました。また、ENT_QUOTESやENT_COMPATのようないくつかのオプションも試しましたが、それでも機能しません。

誰かがなぜ一体PHPが私に従わないのか教えてもらえますか?

編集:これが私がそこで行っていることの全体です:

echo 'var serverVideos = [';
while($row = mysql_fetch_array($result))
{
    $currentRow++;
    $data = array('posterSrc' => $row["Poster_name"],
        'videoSrc' => $row["Video_name"],
        'videoType' => $row["Type"]);

$title = html_entity_decode($row['Title']);
$poster = html_entity_decode($row['Poster_name']);
echo'{"id":"'.$row["ID"].'", "vimeoID":"'.$row["VimeoID"].'", "title":"'.$title.'" ,"client":"'.$row["Client"].'" , "production":"'.$row["Production"].'", "type":"'.$row["Type"].'", ';
            if($row["Type"] != "vimeo")
            {
                echo '"href":"'.http_build_query($data).'"';
            }
            else
            {
                echo '"href":"'.$row["Video_name"].'"';
            }
            echo ', "poster":"'.$poster.'"}';

            if($currentRow != $rowNumber)
            {
                echo ',';
            }
        }
        echo '];';

申し訳ありませんが、少し面倒です。notepad++では見栄えが良くなります。/実際にスクリプトタグで出力してオブジェクトを作成していますが、json_encodeを調べましたが、これほど多くの変数をどのように使用するかわからないため、どのように役立つかわかりませんでした。申し訳ありません。

また、そのJSONオブジェクトの変数を使用してjavascriptでタグを作成した後の、ソースからのコードは次のとおりです。

<a production=" " client=" " title="O.S.T.R &amp;quot;Track #12&amp;quot;" href="http://player.vimeo.com/video/43886787?title=1&amp;amp;byline=1&amp;amp;portrait=1" rel="shadowbox" class="box">

4

3 に答える 3

10

(これをコメントに収めることができなかったので、答えにする必要があります。)

ここでの本当の問題は、データがデータベースに配置される方法です。あなたが与えたサンプル文字列を見てみましょう:

$raw="O.S.T.R &amp;quot;Track #12&amp;quot;";
echo html_entity_decode($raw);
//   O.S.T.R &quot;Track #12&quot;
echo html_entity_decode(html_entity_decode($raw));
//   O.S.T.R "Track #12"

したがって、ユーザー入力はOSTR「トラック#12」でした。

ここでの重要な概念は、それがまさにデータベースに格納されるべき方法であるということです。それが実際のデータだからです。変更されたバージョンをデータベースに保存しないでください。代わりに、データを適切にエスケープして、出力する必要があります。

次のいくつかの例で使用するサンプルデータを次に示します。

$title='O.S.T.R "Track #12"';
$description='A&B or A\B ??';

したがって、使用するSQLステートメントaddslashes(またはプリペアドステートメントですが、ここではaddslashesのアプローチを示します)にデータを書き込む場合は、次のようになります。

$sql="INSERT INTO xxx(title,description) VALUES('".addslashes($title)."','".addslashes($description)."')";
//   INSERT INTO xxx(title,description) VALUES('O.S.T.R \"Track #12\"','A&B or A\\B ??')

jsonエンコーディングの場合、json_encodeを使用します。

$json=json_encode( array('title'=>$title,'description'=>$description) );
//   {"title":"O.S.T.R \"Track #12\"","description":"A&B or A\\B ??"}

csvとしてエンコードするには、ログファイルでfputcsvを使用します。

$fp=fopen("my.csv","a");
fputcsv($fp, array($title,$description) );
fclose($fp);
//   "O.S.T.R ""Track #12""","A&B or A\B ??"

HTMLとして出力するには、htmlspecialchars()(またはhtml_entity_encode())を使用します。

$html='<h3>'.htmlspecialchars($title).'</h3>';
$html.='<p>'.htmlspecialchars($description).'</p>';
//   <h3>O.S.T.R &quot;Track #12&quot;</h3><p>A&amp;B or A\B ??</p>

さて、おそらく私はまだあなたを納得させていません、そしてあなたはまだ本当にあなたのデータベースにHTML対応データを保存したいと思っています、そしてあなたが他の何かのためにそれを使いたいたびにそれを非HTML化する余分なステップに苦しんでいますか?その場合、サンプル文字列は次のようになります。

O.S.T.R &quot;Track #12&quot;

あなたの文字列は次のように見えましたが:

O.S.T.R &amp;quot;Track #12&amp;quot;

違いがわかりますか?最初のものは、htmlエンティティが1回だけエンコードされています。を呼び出すとhtml_entity_decode()、正しくデコードされます。2つ目は、それらを2回エンコードしました。htmlエンティティとしてエンコードされなくなりました。これを、double-entity-encoded-formatまたは略してDEEFと呼びます。deef_decode()PHPや、私が今まで聞いたことのあるコンピューター言語には、PHPよりも純粋なものでさえ、機能はありません。その理由は、誰もこの機能を必要としないからです。

概要:データベースに書き込むコードにバグがあります。エンティティがすでにエンコードされている文字列を受信して​​いますが、データベースに書き込む前に再度エンコードしています。

結論:上記の重要な概念に戻ると、データベースに書き込む前に、これらのhtmlエンティティをデコードする必要があります。2回目にエンコードするのではありません。ただし、この変更を行うときは、データベースからデータを取得してHTMLまたはXMLに配置するすべてのコードが、エンティティをエンコードする必要があることを認識していることを確認してください。

于 2012-07-03T00:02:17.203 に答える
3

ここで何が問題なのか完全にはわかりませんが、なぜjson_encode()オブジェクトの作成に使用していないのでしょうか。

それはあなたのためにすべてのエンコーディングの問題を解決します。

于 2012-07-01T11:36:08.447 に答える
-1

さて、誰かが同じ問題を抱えていて、このナンセンスを自分で理解しない場合、解決策は簡単です。PHP関数html_entity_decodeとhtmlspecialchars_decodeは、文字列を特殊文字から完全に削除しません。この関数を2回実行するために必要な2つの特別な文字があります...たとえば、次の文字列:
O.S.T.R &amp;quot;Track #12&amp;quot;

最初は&から、次にそれらの"-esを削除するためにもう一度2回ストライプする必要があります。

于 2012-07-02T11:32:05.730 に答える