php中的Json_encode/decode

Har*_*jan 0 php serialization json codeigniter

我有一个视图$all_set上的数组,其中包含一些ids.now我想在控制器中使用表单submit.for传递此数组,我使用j子编码和解码.

在我看来:

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

<input type="hidden" name="all_set" value="<?php echo serialize($all_set); ?>">
Run Code Online (Sandbox Code Playgroud)

上面的值包含(正如我在页面源中看到的):

<input type="hidden" name="all_set" value="s:26:"{"0":"1","5":"2","13":"3"}";">
Run Code Online (Sandbox Code Playgroud)

现在在控制器上:

$result=$this->input->post('all_set');

           $result= unserialize($result);
           $result=json_decode($result);
           print_r($result); die;
Run Code Online (Sandbox Code Playgroud)

这给了我错误,我没有在控制器上获得任何数组.错误:

Message: unserialize() [function.unserialize]: Error at offset 0 of 5 bytes
Run Code Online (Sandbox Code Playgroud)

为什么会这样?请帮忙.

Mar*_*ski 5

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

<input type="hidden" name="all_set" value="<?php echo htmlspecialchars(serialize($all_set)); ?>">
Run Code Online (Sandbox Code Playgroud)

编辑

为什么这样才能解决问题?让我们先看看OP的报价输出:

value="s:26:"{"0":"1","5":"2","13":"3"}";">
      ^     ^
Run Code Online (Sandbox Code Playgroud)

我添加^了标记问题源 - 您的值包含引号,这使浏览器看到此输入更像这样:

value="s:26:" {"0" "1" , "5" : "2","13":"3"}";">
Run Code Online (Sandbox Code Playgroud)

一旦找到匹配,它就会关闭它".还有就是在HTML特殊字符,其中包括<,>,&,"其中有若预计将literaly通过转换为实体.所以通过调用htmlspecialchars()我们转换所有这些字符,标记将如下所示:

value="s:26:&quot;{&quot;0&quot;:&quot;1&quot;,&quot;5&quot;.....
Run Code Online (Sandbox Code Playgroud)

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

编辑2

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