我使用jQuery json_encode
的表单中的数据形式写入数据库。
但是,数据库中的数据会损坏。
$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 :(得分:25)
在将数据放入SQL查询之前始终转义数据:
$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查询中:
INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\u00fcnya"]'
转义序列\u
没有特殊含义,因此MySQL只删除了\
;这导致["Merhaba","Du00fcnya"]
存储在数据库中。
因此,如果您转义字符串,查询将变为:
$incelemeEkle = "
INSERT INTO incelemeRapor SET
bigData = '["Merhaba","D\\u00fcnya"]'
";
["Merhaba","D\u00fcnya"]
存储在数据库中。
答案 1 :(得分:1)
因此,除了确保您的数据库使用utf8_unicode_ci之外,您还需要确保PHP使用正确的编码。通常,我在任何可能在其中包含外来字符的函数的顶部运行以下两个命令。更好的方法是在应用程序启动时将其作为第一个命令之一运行:
mb_language('uni');
mb_internal_encoding('UTF-8');
这两行让我头疼不已!
答案 2 :(得分:0)
与user576875一样,您只需要在将字符串插入数据库之前正确处理它。 mysql_real_escape_string()
是实现这一目标的一种方式。准备好的陈述是另一种方式。如果您将用户输入直接写入SQL,这也可以避免您可能容易受到的SQL注入安全问题。始终使用以上两种方法之一。
另外,请注意,这与UTF8没什么关系。 JSON是ASCII安全的,因此只要您使用类似ASCII的字符集(utf8,iso-8859-1),数据就会被正确插入和存储。
答案 3 :(得分: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之后可用!
答案 4 :(得分:-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);