我在视图$all_set
上有一个包含一些ids的数组。现在我想在控制器中使用表单submit.for传递这个数组,我使用了j son编码和解码。
在我看来:
<?php $all_set=json_encode($all_set); ?>
<input type="hidden" name="all_set" value="<?php echo serialize($all_set); ?>">
上面的值包含(正如我在页面源中看到的):
<input type="hidden" name="all_set" value="s:26:"{"0":"1","5":"2","13":"3"}";">
现在在控制器上:
$result=$this->input->post('all_set');
$result= unserialize($result);
$result=json_decode($result);
print_r($result); die;
这给了我错误,我没有在控制器上获得任何数组。 错误:
Message: unserialize() [function.unserialize]: Error at offset 0 of 5 bytes
为什么会这样?请帮助。
答案 0 :(得分:5)
您必须在序列化中添加htmlspecialchars()
。
<input type="hidden" name="all_set" value="<?php echo htmlspecialchars(serialize($all_set)); ?>">
修改强>
为什么这可以解决问题?让我们先看看OP的引用输出:
value="s:26:"{"0":"1","5":"2","13":"3"}";">
^ ^
我添加^
来标记问题来源 - 您的值包含引号,这使得浏览器看到此输入更不像这样:
value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
只要找到匹配"
的字符串,它就会关闭它。 HTML中包含特殊字符,包括<
,>
,&
,"
,如果希望它们通过文字传递,则必须转换为实体。因此,通过调用htmlspecialchars()
我们转换所有这些字符,标记将如下所示:
value="s:26:"{"0":"1","5".....
浏览器现在可以正确解释它,正确显示并正确发回,但不将其视为标记的一部分。
编辑2
事实上,unserialize在你的代码中非常有用。完全摆脱serialize()
/ unserialize()
- 您的json编码数据只是纯字符串,因此您只需要htmlspecialchars()
。
答案 1 :(得分:1)
尝试
<input type="hidden" name="all_set" value="<?php echo base64_encode($all_set); ?>">
$result= base64_decode($result);
$result=json_decode($result);