今日、データベースにアクセスするための PHP スクリプトを作成したところ、その中の中国語の文字列が HTML エンコーディングを使用して保存されていることがわかりました (たとえば、漢字「Mao」に対応する HTML エンコーディングは「Mao」です)。このフィールドに対して条件付きクエリを実行することは可能です。クエリに中国語を直接使用することはできませんが、条件一致の前にエンコードに変換する必要があります。
PHP で可読文字と HTML エンコード文字を変換する場合は、htmlentities 関数と html_entity_decode 関数を使用する必要があります。そこで、次のクエリ文
$sql="selectid,depart_name,first_name,last_name,local_name,extension,mobile,title "; $sql.="frompb_extensione,pb_departmentd "; $sql.="wheree.depart_id=d.depart_id "; $sql.="andd.plant='".$plant."' "; $sql.="and(first_namelike'%".$HTTP_POST_VARS["q"]."%'"; $sql.="orlast_namelike'%".$HTTP_POST_VARS["q"]."%'"; $sql.="orlocal_namelike'%".htmlentities($HTTP_POST_VARS["q"])."%'"; $sql.="orextensionlike'%".$HTTP_POST_VARS["q"]."%'"; $sql.="ormobilelike'%".$HTTP_POST_VARS["q"]."%'"; $sql.="ordepart_namelike'%".$HTTP_POST_VARS["q"]."%'"; $sql.="ortitlelike'%".$HTTP_POST_VARS["q"]."%'"; $sql.=") ";
を記述して実行します。しかし、何か奇妙なことが起こりました。このステートメントは SQL アナライザでは正しく実行され、結果がクエリされますが、このスクリプトを IE で実行すると、クエリ結果がゼロになるように求められます。これはなぜでしょうか。
この SQL を注意深くチェックし、IE でソース コードを表示した結果、問題の根本原因が見つかりました。クエリ値は、htmlentities 関数によって HTML エンコードに変換されます。このエンコードには特殊文字 & が含まれています (最初の段落の例など)。この文字は IE では別の意味を持ちます。 IE では通常、この記号を表すために「&」が使用されるため、IE で表示される SQL ステートメントの出力は、実際に実行されるステートメントとは異なります。
この問題を解決するには、IE が「&」記号を表すために「&」を使用しないようにする方法を見つける必要があります。いくつか検索した結果、次のコードを使用するとこの問題を解決できることがわかりました。
<?php $trans=get_html_translation_table(HTML_ENTITIES); $trans=array_flip($trans); $encoded="Hallo&<Frau>&Krämer"; $original=strtr($encoded,$trans); echo$original; ?>
このコードを実行すると、出力される $original 変数の値は "Hallo &
上記は私が仕事で遭遇した問題と解決策であり、同じような問題に遭遇した友人と共有するためにブログに書きました。