我有一个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()
添加反斜杠?
(对不起,英语不好,这不是我的母语)
答案 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)
您在这里混淆了不同的事情。
's morgens
插入数据库。使用准备好的语句,您没有理由对数据库操作使用引号进行转义。如果仍然要转义它们,则可以在运行SQL语句之前直接进行转义。您通常不会json_encode()
转义的字符串,尽管这是可能的并且不应该引起问题。json_encode()
编码字符串时,您当然必须稍后使用json_decode()
对其进行解码。如果这样做,则字符串中不会有两个反斜杠。json_encode()
将整数作为第二个参数。您显然写了类似json_encode($str, "JSON_UNESCAPED_SLASHES")
的内容,但必须是json_encode($str, JSON_UNESCAPED_SLASHES)
。但是如前所述,在考虑(1)和(2)时,通常不需要。所以我想您要做的第一件事就是清理:
json_encode()
json_decode()
。