PHP json_encode不会在法语字符之前添加反斜杠吗?

时间:2014-07-08 14:02:27

标签: php json

我想在json数组中添加一个元素。一切都很好,直到我在输入中应用法语字符..(é,à等)。它们编码正确,但在“u00e9”之前没有添加反斜杠

这是我在数组中添加一行的代码: (对于此示例,$_POST['titre']提交的值为“Présidente”)

// 1. Get original json from my db
$res=mysql_query("SELECT * FROM produits WHERE p_id=".$id);
$b=mysql_fetch_assoc($res);

// 2. json_decode the result to put in a array  
$array_before_json = json_decode($b['p_images'], true);

// 3. Put our submited value in an array
$newImage = array("titre" => $_POST['titre'], "file" => $_FILES['files']['name'][0]);
array_push($array_before_json,$newImage);
$json_encode = json_encode($array_before_json);

// 4. Re-insert array in bd 
$res=mysql_query("UPDATE produits SET p_images='".$json_encode."' WHERE p_id=".$id);

现在我的数据库中出现了新的json :( 4张图片)

[{"titre":"Image #2","file":"1149124_65352813.jpg"},{"titre":"Image #3","file":"333047.jpg"},{"titre":"Titre de ma photo","file":"14.jpg"},{"titre":"Pru00e9sidente","file":"16.jpg"}]

正如您所看到的,在最后一次出现时,“é”没有正确编码,假设在u00e9之前有一个反斜杠......

我的页面是UTF-8,但我不知道问题是什么......

2 个答案:

答案 0 :(得分:1)

经典SQL注入。

您的查询如下:

UPDATE produits SET p_images='blah blah blah Pr\u00e9sidente blah' ...

MySQL对\u没有任何特殊含义,所以反斜杠"脱落"无益。它是\n00e9然后你得到换行符,给你一个想法。

简单回答:清理您的输入,,即使它来自可信来源(即您的代码 - 但在这种情况下,它不是)。或者更好的是,使用PDO - 准备好的语句将为您处理这类事情。

答案 1 :(得分:1)

SQL查询中的反斜杠具有特殊含义。您需要准备要正确插入查询的值,以保留所有特殊字符,如反斜杠。在您的情况下,您需要在mysql_real_escape_string上使用$json_encode。但是,您应该切换到支持预准备语句的现代MySQL API并使用它们。

请参阅How can I prevent SQL injection in PHP?The Great Escapism (Or: What You Need To Know To Work With Text Within Text)