我想将json字符串编码的数据发送到PHP后端。为此,我使用一个GET
参数表,该参数表中以URL编码的json数据的形式像这样的数组:["mystring1","mystring2"]
当我现在尝试使用php的json_decode
函数对其进行解码时,它将返回null
。另外,使用此输入字符串完全不会更改任何内容:{"mykey":["mystring1","mystring2"]}
。
这是我的完整代码示例:
JavaScript:
var myArr = [];
myArr.push('mystring1');
myArr.push('mystring2');
window.location.href = 'example.com/index.php?myparam=' + encodeURIComponent(JSON.stringify(myArr));
PHP后端站点:
$jsonStr = filter_input(\INPUT_GET, 'myparam', \FILTER_SANITIZE_STRING);
var_dump($jsonStr);
var_dump(json_decode($jsonStr, true));
第一个var_dump
正确打印json字符串,第二个返回null
。使用assoc标志(第二个json_encode
参数)没有任何改变。
我希望得到的东西:
array(2) { [0]=> string(9) "mystring1" [1]=> string(9) "mystring2" }
我实际上得到了什么:
NULL
var_dump
for $jsonStr
为我返回了以下内容:
string(41) "["mystring1","mystring2"]"
答案 0 :(得分:2)
我正在从What does FILTER_SANITIZE_STRING do?转移笔记,但是该问题中的所有公认答案都可以更好地说明这一点:
首先-
php_filter_strip
。它并没有做太多事情,只是获取传递给函数的标志并进行相应处理。它会做有据可查的事情。然后,我们构建某种地图并调用
php_filter_encode_html
。更有意思:它将ASCII码小于32且大于127的字符“,”和&字符转换为HTML实体,因此字符串中的&变成&。再次使用标志为此。然后我们调用
php_strip_tags_ex
,它仅剥离HTML,XML和PHP标记(根据/ext/standard/string.c中的定义)并删除NULL字节,如注释中所述。
(强调了重要部分)。
简而言之,FILTER_SANITIZE_STRING
将破坏您的JSON,因为它将对不应该编码的东西进行编码。如果要验证此输入,请不要使用此过滤器。
此处的答案是不使用FILTER_SANITIZE_STRING
。
验证JSON字符串的明智方法是执行json_decode
并检查其是否为空。
$jsonStr = filter_input(\INPUT_GET, 'myparam');
var_dump($jsonStr);
var_dump(json_decode($jsonStr, true));
答案 1 :(得分:0)
这里的错误与JSON无关,而在于使用编码的URI组件的请求。
如果在JS端使用encodeURIComponent
,那么在PHP端也必须使用urldecode
。
<?php
$jsonStr = '%5B%22mystring1%22%2C%22mystring2%22%5D';
var_dump(
json_decode(urldecode($jsonStr), true)
);