php中的Json_encode / decode

时间:2012-11-21 14:55:46

标签: php json codeigniter serialization

我在视图$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

为什么会这样?请帮助。

2 个答案:

答案 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:&quot;{&quot;0&quot;:&quot;1&quot;,&quot;5&quot;.....

浏览器现在可以正确解释它,正确显示并正确发回,但不将其视为标记的一部分。

编辑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);