0

ここで奇妙なシナリオが進行中です。

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 テーブルで特殊文字を処理する際に、これが悪い習慣または一般的な「してはいけない」間違いであるかどうかを知っておくとよいでしょう。

4

1 に答える 1