2009-06-13 16 views
1

編集:オリジナルの投稿からフィードバックを得た後、問題を明確にするためにテキストを変更しました。PHP/MySQLのエンコーディングの問題

Iは、次のクエリ(擬似コード)を有する:

$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';"); 

mysql_query("SELECT id FROM myTable WHERE name = 'Fióre`s måløye'", $conn); 

これが0行を返します。私はphpMyAdminを直接クエリを実行すると、私は結果を取得し、

255 Connect  [email protected] on 
255 Query  SET NAMES 'utf8'; COLLATE='utf8_danish_ci' 
255 Init DB  norwegianfashion 
255 Query  SELECT id FROM myTable WHERE name = 'Fióre`s måløye' 
255 Quit 
  • :私のログファイルに

    は、私はこれを参照してください。

  • 表のエンコード:UTF-8
  • HTMLページのエンコーディング:UTF-8
  • 私は(フォーム入力からの)レコードを追加することができます名前が(例えば "Fióre`sHäßelberg")のアクセントを使用しています
  • 私は読むことができますアクセントを持つレコード使って - > DBの「名LIKE 『$のラベル名の%』」
  • 情報は私は名前がアクセント文字が含まれている任意の行を選択することができない理由見当もつかない

正常に見えます。

私は本当に誰かが私を助けることができると思います。

更新1: 私は妥協に至りました。私は、データを格納するときにhtmlentitiesでアクセントを変換し、DBからデータを取得するときにはhtml_entity_decodeを変換します。それはうまくいくようです。

私が今見た唯一の欠点は、phpMySQLを使って平文で名前を読むことができないことです。

+2

スクリプトにあるように、関数呼び出しをポストすることはできますか?そして、あなたは$ sqlを出力して、それがどのように見えるのかを見ることができますか? –

+0

完了。出力されたSQLをPHPMyADminで直接使用すると、正常に動作します。私は私が望む結果を得る。 – Steven

+0

上記のクエリを宣言するPHPファイルでは、どのようなエンコーディングを使用しますか?競合を起こさないためにUTF-8も使用する必要があります。 – Gumbo

答えて

2

をあなたのバッククォート文字の問題だ、これは非常に多くのエンコーディングの問題のように思えます。私はクエリのログを有効にすることをお勧めします(http://dev.mysql.com/doc/refman/5.1/en/query-log.html)、データベースが実際に受け取ったものを表示できます。

UPDATE: 私は最終的にPHPとUTF-8(http://www.phpwact.org/php/i18n/charsets)の汚い詳細を説明するページを発見。また、これを読んで(http://niwo.mnsys.org/saved/~flavell/charset/form-i18n.html)、フォーム投稿から返された適切なデータを取得する方法を理解してください。

+0

現時点では、ログのみが接続/切断を記録します。 Win XPでMySQLを実行しています。より詳細なログ情報を取得する方法を知っていますか? – Steven

+1

マニュアルを読んでください。 http://dotnot.org/blog/archives/2005/01/11/query-logging-in-mysql-on-windows/によれば、ロギングステートメントに問題はありません。しかし、私はMySQLのインストールがなく(さらにはXPが少ない)、これを確認することはできません。 –

+0

ブリリアント・マーティン。ログが正常に機能しているので、問題の原因を確認できるようになりました。入力名= 'ChurchÂ's'です。私が信じているユニコードの問題です。しかし、私はUTF8でそれをするために他に何ができるのか分かりません - 私はutf8ですべてを持っていたと思いました。 – Steven

0

クエリを呼び出した後でエラーメッセージをチェックしてみることもできます(まだその機能の外で実行していない場合)。何が間違っているかを正確に伝えることができます。

Artemがコメントしたように、実際のクエリを印刷するのは良いアイデアです。予想通りのものはありません。

+0

エラーはありません。 0行だけを返します。 – Steven

0

これはエンコードの問題である可能性があります。「教会の教会は素晴らしいキャラクターかもしれません。 PHPMyAdminはUTF-8であり、PHPウェブサイトはiso-latin1である可能性があります。

+0

Nah。 utf8_encode()を追加しても役立たない。 – Steven

+0

あなたが正しいように見えます。しかし、私はどのようにこれを解決することができないのか分かりません。私のポストアップデートを見てください。 – Steven

+0

接続を開いたら、mysql_set_charset( 'utf8')を実行します。または、SQLクエリ "SET CHARACTER SET 'utf8'"と "SET NAMES 'utf8'"を実行します。 – Andomar

4

$resultよりもむしろ$this->queryを返すべきだと思います。

さらに、SQL injectionに気づいて、mysql_real_escape_stringまたはPrepared Statementsを使用して、このような攻撃から身を守ることを検討する必要があります。 addslashesは適切な保護手段ではありません。

+0

私のDAL(データアクセス層)はクラスです。ここで最後の投稿を参照してください:http://stackoverflow.com/questions/975452/need-some-advice-on-error-handling-in-php-mysqlしたがって、値を返すために$ this-> queryを使用する必要があります。 mysqliやPDO(リンクを参照)を使用するためにDAL lassを拡張することはできませんが、SQLインジェクションをテストしましたが、これまで実行できませんでしたが、適切な処置を講じます。 – Steven

+0

'$ this-> query_result'を意味しませんか?とにかくそれはなぜ必要なのですか? '$ result'は' $ this-> query_result'と同じ値をとります: '$ this-> query()'の戻り値です。 – Gumbo

+0

あなたが私の他の投稿に謝意を表しているなら、$ query_resultを$ queryに改名しました。そして上記のコードでは、$結果はテストのためのものでした(mysql_num_rows($ result))。上記の例を更新して$ resultを削除しました。 – Steven

2

このクエリを試してみてください。あなたは結果を取得した場合、それは他の回答が示すように、クエリで

SELECT * FROM sl_label WHERE name Like 'Church%' 
+0

それはうまくいった! 1つの行が返されました。検索された名前は次のようになります:Church \ u00b4s。では、バックティックキャラクターの修正をどうすればいいですか? addslashesもmysql_real_escape_stringも文字をエスケープしません。 – Steven

+0

テーブルが作成されるのと同じ文字エンコーディングをクライアント側で使用します。 – nos

+0

同じchrを使用しています。エンコーディング。テーブルはUTF8であり、私はutf8_encode()を入力してみることもできます。 – Steven

0

私はこのライン

mysql_query("SET NAMES 'utf8'; COLLATE='utf8_danish_ci';"); 

を見ていると私はそれが誤りかもしれないと思います。とともに ';' 2つのクエリをサーバーに送信していますが、COLLATEは句であり、単独の法的な文ではありません。試してみてください:COLLATE句は、サーバーによって承認されない

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_danish_ci'"); 

場合は、danish_ci照合を持つあなたのラベル列の問題があるかもしれませんが、入ってくるのステートメントは、デフォルト(PROBのutf_general_ci)を持っています。アクセント付きの文字は一致しませんが、基本的なASCII文字の表現は同じであるため、ワイルドカードが機能します。

+0

こんにちはスティーブン。 ';'問題ではありません。私は解決策を見つけたと思う。私が欲しいものではありませんが、それは機能します。私は値を格納するためにhtmlentitiesを使用し、値を取得するときはhtml_entity_decodeを使用します。 – Steven

+0

*私はスティーブ、スティーブンを意味しません:) – Steven