Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json_在php中编码/解码_Php_Json_Codeigniter_Serialization - Fatal编程技术网

Json_在php中编码/解码

Json_在php中编码/解码,php,json,codeigniter,serialization,Php,Json,Codeigniter,Serialization,我在view$all\u set上有一个数组,其中包含一些ID。现在我想使用表单submit在控制器中传递这个数组。为此,我使用了j-son编码和解码 我认为: <?php $all_set=json_encode($all_set); ?> <input type="hidden" name="all_set" value="<?php echo serialize($all_set); ?>"> 这给了我一个错误,我并没有在控制器上得到任何数组。 错误

我在view
$all\u set
上有一个数组,其中包含一些ID。现在我想使用表单submit在控制器中传递这个数组。为此,我使用了j-son编码和解码

我认为:

<?php $all_set=json_encode($all_set); ?>

<input type="hidden" name="all_set" value="<?php echo serialize($all_set); ?>">
这给了我一个错误,我并没有在控制器上得到任何数组。 错误:


为什么会这样?请提供帮助。

您必须将
htmlspecialchars()
添加到序列化中

<input type="hidden" name="all_set" value="<?php echo htmlspecialchars(serialize($all_set)); ?>">
我添加了
^
来标记问题的来源-您的值包含引号,这使浏览器看到此输入时更不像这样:

value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:&quot;{&quot;0&quot;:&quot;1&quot;,&quot;5&quot;.....
一旦找到匹配的
”,它就会简单地关闭字符串。HTML中有一些特殊字符,包括
&
,如果希望以文字形式传递,则必须将这些字符转换为实体。因此,通过调用
htmlspecialchars()
我们转换所有这些字符,标记如下所示:

value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:&quot;{&quot;0&quot;:&quot;1&quot;,&quot;5&quot;.....
浏览器现在可以正确地解释它,正确地显示它,并正确地发回,但不能将其视为标记的一部分

编辑2


事实上,非序列化在代码中非常有用。完全摆脱
serialize()
/
unserialize()
您的json编码数据只是纯字符串,因此您只需要
htmlspecialchars()

您必须将
htmlspecialchars()
添加到序列化中

<input type="hidden" name="all_set" value="<?php echo htmlspecialchars(serialize($all_set)); ?>">
我添加了
^
来标记问题的来源-您的值包含引号,这使浏览器看到此输入时更不像这样:

value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:&quot;{&quot;0&quot;:&quot;1&quot;,&quot;5&quot;.....
一旦找到匹配的
”,它就会简单地关闭字符串。HTML中有一些特殊字符,包括
&
,如果希望以文字形式传递,则必须将这些字符转换为实体。因此,通过调用
htmlspecialchars()
我们转换所有这些字符,标记如下所示:

value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
value="s:26:&quot;{&quot;0&quot;:&quot;1&quot;,&quot;5&quot;.....
浏览器现在可以正确地解释它,正确地显示它,并正确地发回,但不能将其视为标记的一部分

编辑2

事实上,非序列化在代码中非常有用。完全摆脱
serialize()
/
unserialize()
您的json编码数据只是纯字符串,因此您只需要
htmlspecialchars()

试试

<input type="hidden" name="all_set" value="<?php echo base64_encode($all_set); ?>">

$result= base64_decode($result);
$result=json_decode($result);
试试看



为什么要序列化JSON文本?事实上,我是第一次使用JSON将数据发送到contoller,但webnetmobile.com给了我答案。为什么要序列化JSON文本?事实上,我是第一次使用JSON将数据发送到contoller,但webnetmobile.com给了我答案。请告诉我为什么我们必须这样做添加htmlspecialchars()??请检查R的答案。使用unserialize()会使您面临安全漏洞。可怕..gr8解释..gr8帮助..+1explanation@JonathanAmendR.S.提供与使用serialize相同的安全级别。来自用户的任何数据都不可信任。若您构建了一个表单并将数据放在隐藏字段中,然后用户将该表单提交回来,那个么那个里就并没有您的数据了。It用户数据。这些都是用户数据。你必须再次验证它——你一开始把它放在那里完全没有区别。这是任何客户机/服务器代码的经验法则。问题是在表单中使用序列化数据的问题,而不是如何假装理解安全问题。@WebnetMobile.com如果你让某人继续对从用户接收的数据使用unserialize(),你只会把他们引向悬崖边。base64_decode()不存在执行任意代码的风险,而unserialize()具有执行任意代码的风险。你可以告诉我为什么我们要添加htmlspecialchars()吗?请检查R的答案。使用unserialize()会使您面临安全漏洞。可怕..gr8解释..gr8帮助..+1explanation@JonathanAmendR.S.提供与使用serialize相同的安全级别。来自用户的任何数据都不可信任。若您构建了一个表单并将数据放在隐藏字段中,然后用户将该表单提交回来,那个么那个里就并没有您的数据了。It用户数据。这些都是用户数据。你必须再次验证它——你一开始把它放在那里完全没有区别。这是任何客户机/服务器代码的经验法则。问题是在表单中使用序列化数据的问题,而不是如何假装理解安全问题。@WebnetMobile.com如果你让某人继续对从用户接收的数据使用unserialize(),你只会把他们引向悬崖边。base64_decode()不存在执行任意代码的风险,而unserialize()具有执行任意代码的风险。你不妨让他评估一下。虽然这也行得通,但这不是一个完全正确的解决方案,因为你正在解决这个问题,而不是消除真正的罪魁祸首。@WebnetMobile.com这不是真的。R S正确地删除了unserialize()的用法。如果您正在对从用户端提供的数据进行非序列化,您将面临一个非常巨大的安全漏洞,因为传递回脚本的数据可能会被操纵,从而导致服务器执行攻击者希望的任何PHP代码:来自用户的数据都不可信。这就是为什么您总是进行服务器端验证。如果你认为Base64是对这一点的任何形式的保护,那么你就错过了这一点。而这也会起作用,这不是一个完全正确的解决方案,因为你是在工作的问题,而不是移除真正的罪犯。@ WebNETMask.com这是不正确的。R S正确地删除了unserialize()的用法。如果您正在对从用户端提供的数据进行非序列化,您将面临一个非常巨大的安全漏洞,因为传递回脚本的数据可能会被操纵,从而导致服务器执行攻击者希望的任何PHP代码:来自用户的数据都不可信。这就是为什么你总是这么做