2011-01-24 15 views
15

jQuery json_encodeのフォームからデータの形でデータベースに書き込んでいます。php json_encode utf8 char problem(mysql)

ただし、データベースのデータが破損します。

$db->query("SET NAMES utf8"); 

$kelime = array("Merhaba","Dünya"); 
$bilgi = json_encode($kelime); 

$incelemeEkle = " 
INSERT INTO incelemeRapor SET 
bigData = '".$bilgi."' 
"; 
$db->query($incelemeEkle); 

データベーステーブルスキーマ。

CREATE TABLE `incelemeRapor` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `bigData` text COLLATE utf8_unicode_ci, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

MySQLの挿入例のデータ。

["Merhaba","Du00fcnya"] 
+0

実際のPHPファイルはどのようにエンコードされていますか? –

+0

こんにちはMatt、UTF8が保存されました。 –

+0

MySQLのドキュメントに基づいて、SET NAMESを使用するときに文字セットが引用符で囲まれています。実際にはutf8を設定していない可能性があります。 –

答えて

25

常にSQLクエリでそれをputing前にデータをエスケープ:

$incelemeEkle = " 
INSERT INTO incelemeRapor SET 
bigData = '".mysql_real_escape_string($bilgi)."' 
"; 

(追加mysql_real_escape_string()コール)

json_encode()\u<code-point>表記と非ASCII文字をエンコードします。したがってjson_encode(array("Merhaba","Dünya"));["Merhaba","D\u00fcnya"]を返します。

はその後、この文字列は、SQLクエリに埋め込まれている:MySQLはちょうど\削除するよう

INSERT INTO incelemeRapor SET 
bigData = '["Merhaba","D\u00fcnya"]' 

は、エスケープシーケンス\uのための特別な意味はありません。これにより、["Merhaba","Du00fcnya"]がデータベースに格納されます。

は、ですから、文字列をエスケープする場合、クエリは次のようになります。

$incelemeEkle = " 
INSERT INTO incelemeRapor SET 
bigData = '["Merhaba","D\\u00fcnya"]' 
"; 

そして["Merhaba","D\u00fcnya"]データベースに格納されます。

-1

BASE64エンコーディングをJSON文字列に適用します。これは、ほぼすべてのPHPの設定、データベース、データベースのバージョンと設定で動作するはずです:

$values = array("Test" => 1, "the" => 2, "West" => 3); 
$encoded = base64_encode(json_encode($values)); 
$decoded = json_decode(base64_decode($encoded), true); 
+0

JSONをbase64でエンコードする必要はありません。それはASCII安全です。 7ビット文字のみ。 – bluesmoon

+0

あなたはそうです。しかし、base64エンコーディングは、バックスラッシュ(または他の特殊文字) –

1

は、だからあなたのデータベースはutf8_unicode_ci内を使用していることを保証することに加えて、あなたはまた、PHPが適切なエンコーディングを使用していることを確認します。通常、私は潜在的にそれらの中に外国文字を持つ予定の関数の先頭に、次の2つのコマンドを実行します。さらに良いことに、あなたのアプリの起動時に最初のコマンドの一つとして、それを実行することです:

mb_language('uni'); 
mb_internal_encoding('UTF-8'); 

これらの2行は、私の頭痛のトンを保存しています!

0

user576875のように、文字列をデータベースに挿入する前に、その文字列を正しく処理する必要があります。 mysql_real_escape_string()はこれを行う1つの方法です。準備文は別の方法です。これにより、ユーザーインプットをSQLに直接書き込む場合に発生する可能性のあるSQLインジェクションセキュリティの問題を回避できます。常に上記の2つの方法のいずれかを使用してください。

また、これはUTF8とほとんど関係がありません。 JSONはASCIIセーフなので、ASCIIのような文字セット(utf8、iso-8859-1)を使用する限り、データは正しく挿入されて格納されます。

0

私はmysql_real_escape_string()で試してみましたが、私のために働いていませんでした(データベースの空のフィールドの結果)。

だから私はここで見て:http://php.net/manual/fr/json.constants.phpとフラグJSON_UNESCAPED_UNICODEは罰金私の仕事:

$json_data = json_encode($data,JSON_UNESCAPED_UNICODE); 

をJSON_UNESCAPED_UNICODEが唯一のPHP 5.4.0以降で使用可能です!