ここで奇妙なシナリオが進行中です。
WAMP サーバー (Apache、MySQL、PHP) を実行しているローカルホストで、データベース内のテーブルからのメッセージのリストを表示する Web ページを作成しました。
DIV コンテナーが呼び出されたとしましょう: #message-list
このリストは正しく表示されます (ページが起動されると、PHP はページ全体をレンダリングします)。
PHP がエコーアウトする HTML マークアップは問題なく動作します。
したがって、MySQL データベース ルックアップも機能します。偉大な。
今...
AJAX と jQuery の魔法を少し使って、最初の#message-list DIVを生成したのと同じ基本コードを使用する PHP スクリプトにPOST要求を送信することで、その場でメッセージを追加するフォームを作成しました。
AJAX 化された PHP スクリプトは、次の 2 つのことを行います。
- ユーザーからの新しいメッセージのレコードを追加します。
- リストをエコーします (新しいメッセージで更新する必要があります);
AJAX 応答がブラウザーに返されると、JavaScript 側が古いリストを新しい#message-listコンテンツに置き換えます。
これで...部分的に機能します。
何が問題なのか - あるページで、私の以前の投稿のいくつかが、PHP 側の AJAX リクエスト内の何かを何らかの形で「破損」させているようで、 null応答が返されます (基本的に、 #message-list DIVを置き換える HTML コードは生成されません)鬼ごっこ)。
ただし、他のいくつかのページでは、AJAX 応答は正常に機能します。
だから私の質問は:
- 無効な文字、不適切なエンコード、または引用符/二重引用符が原因で、データベース内の一部の文字列データが PHP スクリプトの実行を中断する可能性はありますか?
PHP のhtmlentities()およびmysql_real_escape_string()関数を使用してこれを解決しようとしましたが、AJAX 応答を受信した後、ページの 1 つでリストが正しく更新されません。
テーブル内の既存のコンテンツをクリーンアップ/サニタイズする必要があるだけでしょうか?
もしそうなら、これを行うために使用できる簡単なスクリプト/クエリはありますか?
ありがとう!
編集#1:
- MySQL バージョン = 5.5.24-ログ
- mysql_client_encodingを使用すると、これは " latin1 " を示します (ああ、それが問題かもしれません!)
- PHP では、mysql_...メソッド (mysql_connect、mysql_select_db、mysql_query など) を使用します。
問題が発生する可能性のあるデータベース テーブルのサンプル: http://pastebin.com/PjLVmXEF
見た目からして、多くの開発者は PDO が推奨されていると言っています。試してみて、すべてのエラーが消えるかどうかを確認します。皆様、今まで本当にお世話になりました!
編集#2:
私の現在の解決策は次のとおりです。
これらのクエリを使用して、エンコードの問題があるデータベースとテーブルを変更しました。
// SQL queries:
ALTER DATABASE timegrasp charset=utf8;
ALTER TABLE tg_messages CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
次に、特定のレコードの一部の文字が正しく表示されていないことに気付きました (一部の二重引用符で囲んだÂ )。そのため、 MySQL Query Browserで二重引用符を手動でバックスペースして再挿入し、二重引用符が完全になくなったことを確認しました。
PHP 側では、データベースに「入る」途中のメッセージのみを次のようにエンコードします。
$htmlConverted = htmlentities( $pMessage, ENT_COMPAT | ENT_HTML401, "UTF-8" );
return mysql_real_escape_string( $htmlConverted );
そして、これでMySQL接続を開始するようにしてください:
mysql_set_charset("utf8", $DB_LINK);
次に、デコード/変換せずに、テーブルから文字列を直接読み取ることができます。
最後に、これをテストするために、特殊文字を含むソース (クライアントとの Skype チャット) から同じメッセージをコピーし、それを Web フォームに貼り付けたところ、正常に動作するようになりました! :)
上記のすべての手順とパラメーターが必要かどうかはわかりませんが、これが問題の解決に役立ちました。
今後の参考のために知っておくとよいでしょうが、MySQL テーブルで特殊文字を処理する際に、これが悪い習慣または一般的な「してはいけない」間違いであるかどうかを知っておくとよいでしょう。