如何在MySQL中编码json数据用于数据库存储?

时间:2011-02-22 22:25:20

标签: php javascript mysql ajax json

我有一个javascript丰富的页面,它将一个格式化的大型JSON传递给php,放入MySQL数据库。 JSON中的数据包括用户提交的字符串,并且将包含包含基本html(<a><strong>等的字符串。)

我遇到的问题是当包含'引号的字符串被转义时,我无法删除斜杠,导致复合逃逸,如

<a href=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'example.com\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'></a>

每次用户保存时,这都是复合的,严重膨胀了数据库字段。

将数据插入MySQL的字符串转换是:

$correspondenceArray = base64_encode(json_encode($_POST['saveArray']['correspondenceObject']));

要获取数据是:

function stripslashes_deep($value)
{
    $value = is_array($value) ?
                array_map('stripslashes_deep', $value) :
                stripslashes($value);

    return $value;
}

$correspondenceJSON = stripslashes_deep(json_decode(base64_decode($resultArray['correspondence_array']), true));

从我的工作开始,我的目的是去除数据库中出来的数据的斜杠,以便javascript具有未转义的数据

修改

我意识到json_encode($a,JSON_HEX_QUOT)可能有帮助,但我正在运行的服务器有PHP 5.2.16,因此该功能不可用)

1 个答案:

答案 0 :(得分:3)

不要对SQL使用字符串生成。

如果使用占位符,那么没有问题(带存储)并且不需要魔法转义。只需将其存储为VARCHAR类型即可。做完了。

输出的清理(输入期间的)同样应该使用适当的库来完成 - 有两个不同的操作;但是,这是一个与存储不同的问题。

修改

PDO视为一个预准备语句(读取:占位符)实现。其他可能存在(我不使用PHP,但有义务纠正与手动构建的基于字符串的SQL查询相关的设计错误的延续。)

  
    

不需要引用准备语句的参数;驱动程序自动处理这个。 如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果使用非转义输入构建查询的其他部分,则仍然可以进行SQL注入)。

  

听起来好得令人难以置信。现在使用字符串生成的语句退出。请。

快乐的编码。