0

我在视图上有一个$all_set包含一些 id 的数组。现在我想使用表单提交在控制器中传递这个数组。因为我使用了 j 儿子编码和解码。

在我看来:

<?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

为什么会这样?请帮忙。

4

2 回答 2

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

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

于 2012-11-21T14:57:57.017 回答
1

尝试

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

$result= base64_decode($result);
$result=json_decode($result);
于 2012-11-21T15:01:01.653 回答