json_encode()函数添加反斜杠

时间:2018-10-16 08:41:58

标签: php arrays json

我有一个PHP数组,其中带有单词's morgens。我正在使用一个转义单引号的函数,json_encode()向其添加了另一个反斜杠,这会导致SQL代码出错。参数JSON_UNESCAPED_SLASHES导致以下错误:

  

警告:json_encode()期望参数2较长,并给出字符串

在json_encode()之前的输出如下:

string(11) "\'s middags"

在json_encode()之后:

"\\'s middags"

它的等效项(long,64)将不起作用,也不会引发错误。如何防止json_encode()添加反斜杠?

(对不起,英语不好,这不是我的母语)

2 个答案:

答案 0 :(得分:2)

  

json_encode()期望参数2长,并给出字符串

这意味着未定义常量JSON_UNESCAPED_SLASHES(应为64),并将其隐式视为字符串"JSON_UNESCAPED_SLASHES"

这意味着您使用的PHP版本太旧,无法支持JSON_UNESCAPED_SLASHES

PHP自版本5.4.0起已支持JSON_UNESCAPED_SLASHES

5.4分支在2015年停产。自从收到安全更新以来已经过去了三年多。您使用的版本要比该版本的(即至少 4年零两个月不受支持的版本)

这意味着您的服务器存在严重的安全漏洞。

解决方案:升级到受支持的PHP版本

更好的解决方案:升级到受支持的PHP版本,并接受我之前的评论中给出的建议:

  

不要尝试更改JSON的特定格式,而是更改生成SQL的代码,以便它可以处理特殊字符。这可能只是意味着使用绑定参数而不是字符串连接。更好的是,不要将JSON推送到关系数据库中-将数据的单独位以明智的规范化格式存储在不同的行/列/表中,您可以使用SQL进行适当的查询。

答案 1 :(得分:0)

您在这里混淆了不同的事情。

  1. 您应使用Prepared Statements将原始字符串's morgens插入数据库。使用准备好的语句,您没有理由对数据库操作使用引号进行转义。如果仍然要转义它们,则可以在运行SQL语句之前直接进行转义。您通常不会json_encode()转义的字符串,尽管这是可能的并且不应该引起问题。
  2. 当您使用json_encode()编码字符串时,您当然必须稍后使用json_decode()对其进行解码。如果这样做,则字符串中不会有两个反斜杠。
  3. json_encode()将整数作为第二个参数。您显然写了类似json_encode($str, "JSON_UNESCAPED_SLASHES")的内容,但必须是json_encode($str, JSON_UNESCAPED_SLASHES)。但是如前所述,在考虑(1)和(2)时,通常不需要

所以我想您要做的第一件事就是清理:

  • 插入数据库:使用准备好的语句(或转义查询值)。
  • 传输数据:json_encode()
  • 接收数据:json_decode()