Php 如何在MySQL中为数据库存储编码json数据?

Php 如何在MySQL中为数据库存储编码json数据?,php,javascript,mysql,ajax,json,Php,Javascript,Mysql,Ajax,Json,我有一个javascript丰富的页面,它将一个大的JSON格式传递给php,并将其放入MySQL数据库中。JSON中的数据包括用户提交的字符串,并将包括包含基本html的字符串(,等) 我遇到的问题是,当一个包含“引号的字符串被转义时,我无法去掉斜杠,从而导致类似这样的复合转义 <a href=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'example.com\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'></a> 获取数据的

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

我遇到的问题是,当一个包含
引号的字符串被转义时,我无法去掉斜杠,从而导致类似这样的复合转义

<a href=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'example.com\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'></a>
获取数据的方法是:

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编码($a,json十六进制)可能会有所帮助,但我运行的服务器有PHP5.2.16,因此该功能不可用)

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

如果使用占位符,则(存储)不会出现问题,并且不需要进行魔术转义。只需将其存储为VARCHAR类型。做了,做了

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

编辑

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

编制报表的参数不需要引用;司机会自动处理这个问题如果应用程序专门使用准备好的语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分是使用未scaped的输入构建的,则仍然可以进行SQL注入)

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


愉快的编码。

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

如果使用占位符,则(存储)不会出现问题,并且不需要进行魔术转义。只需将其存储为VARCHAR类型。做了,做了

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

编辑

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

编制报表的参数不需要引用;司机会自动处理这个问题如果应用程序专门使用准备好的语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分是使用未scaped的输入构建的,则仍然可以进行SQL注入)

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



愉快的编码。

您是否已打开
magic\u quotes\u gpc()
?这些会在你的数据上乱扔斜杠,这个选项应该关闭。啊,不,它是打开的。嗯,如果我关闭这个功能,我可能会在其他地方产生连锁反应吗?当你关闭这个功能时,你可能想在查询中使用mysql_real_escape_string(),以避免令人讨厌的注入,但是@Marc B是对的,你应该关闭它(在PHP5.3中不推荐使用)。@Capsule幸运的是我已经在使用
mysql_real_escape_escape_string()
所以这应该是一个相当安全的开关您是否打开了
magic\u quotes\u gpc()
?这些会在你的数据上乱扔斜杠,这个选项应该关闭。啊,不,它是打开的。嗯,如果我关闭这个功能,我可能会在其他地方产生连锁反应吗?当你关闭这个功能时,你可能想在查询中使用mysql_real_escape_string(),以避免令人讨厌的注入,但是@Marc B是对的,你应该关闭它(在PHP5.3中不推荐使用)。@Capsule幸运的是我已经在使用
mysql_real_escape_escape_string()
所以这应该是一个相当安全的切换问题是我正在编码的对象是一个非常深的多维数组(目前有5层深),并且是完全动态的。@Zak Henry这不会改变我的答案。JSON是文本。如果在SQL语句中使用占位符(也称为“准备好的语句”),则文本可以安全地存储在数据库中而无需“转义”。请看:或者类似的——糟糕的设计必须消亡。从理论上讲,使用准备好的语句也可以(取决于许多因素,包括后端、适配器和使用模式)--显著提高性能。不幸的是,PDO似乎使用了一些愚蠢的实现来引用变量--但无论如何,它从一种糟糕的方法变成了一种可接受的方法。很抱歉,我误解了你的答案。我从未听说过有准备的发言。我会调查的it@pst好的,我已经实现了PDO,它解决了我的问题。回答被接受,谢谢!现在您已经向我展示了这一点,我想浏览我以前的所有查询并更新它们>>grrr问题是我正在编码的对象是一个非常深的多维数组(当前最深可达5层),并且是完全动态的。@Zak Henry这不会改变我的答案。JSON是文本。如果在SQL语句中使用占位符(也称为“准备好的语句”),则文本可以安全地存储在数据库中而无需“转义”。请看:或者类似的——糟糕的设计必须消亡。从理论上讲,使用准备好的语句也可以(取决于许多因素,包括后端、适配器和使用模式)--显著提高性能。不幸的是,PDO似乎使用了一些愚蠢的实现来引用变量--但无论如何,它从一种糟糕的方法变成了一种可接受的方法。很抱歉,我误解了你的答案。我从未听说过有准备的发言。我会调查的
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));