【问题标题】:Why is my unserialize returning empty?为什么我的反序列化返回空?
【发布时间】:2017-01-20 04:15:49
【问题描述】:

这可能是重复的,但我找不到任何帮助。

我正在尝试通过表单的 post 方法将所有数据的数组传递到另一个页面。它看起来像这样:

        <form method="post" action="../resource_load/export.php" target="_blank">
        <input type="hidden" name="tipo" value="<?=$_GET['tipo']?>">
        <input type='hidden' name='excel_array' value='<?php echo htmlentities(serialize($_SESSION['excel_array']))?>'>
        <input  type='submit' class='submit' id='btnExport' value='Export to Excel' />

所以我在这里序列化 $_SESSION 数据。这就是它的样子:

    value="a:1:{s:12:"dpi_strategy";a:1:{s:5:"Plan1";a:1:{i:0;a:9:{i:0;s:3:"PCR";i:1;s:11:"Description";i:2;s:4:"Task";i:3;s:8:"Resource";i:4;s:13:"Baseline Plan";i:5;s:10:"Trend Date";i:6;s:4:"User";i:7;s:20:"Data Inicialização";i:8;s:6:"Status";}}}}

这是我反序列化的地方:

    $Excel_array = htmlentities(unserialize($_POST['excel_array']));

然而,它返回 null。这是为什么呢?

【问题讨论】:

  • 我不明白。您序列化会话变量并在另一个页面/脚本中取消序列化它?只需访问其他页面中的会话变量
  • 我想把它变成$_POST数据,这样当我打开另一个标签时它就不会被替换
  • 不会被替换。只需访问其他页面上的会话数据。试试看。
  • 你不是在解码,而是在向后解码:unserialize(html_entity_decode($_POST['excel_array']));
  • 我的意思是,如果用户打开各种选项卡,则只会保留最近的会话,我目前正在将会话信息导出到 excel,这就是为什么我想改用 $_POST

标签: php session serialization


【解决方案1】:

如果您这样做,请使用htmlentities() 进行编码并使用html_entity_decode() 使用原始 值进行解码。

其次,我认为输出序列化和反序列化用户提交的数据的数据不是一个好主意。原因是代码注入是一个主要的安全问题。

改为使用json_encode()json_decode()。 现在因为我看到您的数组中有特殊字符 Data Inicialização 您确实将这些字符转换为另一个实体是正确的,但只要您拥有 UTF-8 的所有内容,它就可以工作。

<input type='hidden' name='excel_array' value='<?php echo json_encode($_SESSION['excel_array']) ?>'>

还有:

# ../resource_load/export.php 
var_dump(json_decode($_POST['excel_array']);

【讨论】:

  • 我将其转换为 $_POST 信息,因为即使在我打开另一个页面并因此打开另一个会话之后,我也想保留这些信息。
  • 会话通过 cookie ID 工作,您可以关闭浏览器,会话中的数据仍然存在。在 cookie 过期或通过清理工具删除之前,这一点一直有效。如果您通过其他浏览器打开它,它将作为新请求处理,并且新会话将开始,仍然保持来自其他浏览器的数据完好无损。
  • 我相信我没有正确解释这一点。我需要同时打开各种“会话”,因为我正在将会话数据导出到 Excel。由于我无法通过选项卡分隔会话,因此我尝试将 $_POST 数据导出到 Excel 中。
  • @RazorFinger 答案相应调整,但我仍然认为您需要以不同的方式实现它。您可以随时在表单中打印一个随机 id,并相应地设置 $_Session['id']['exceldata']
【解决方案2】:
<?php

    $temp = array();
    $temp['aaa'] = "aaaaaaaaaaaaaaaaaaaaaaa";
    $temp['bbb'] = "bbbbbbbbbbbbbbbbbbbbbbb";
    $temp['ccc'] = "ccccccccccccccccccccccc";

    $arr = array();
    $arr['excel_array'] = $temp;


?>

 <form method="post" action="">
     <input type='hidden' name='excel_array' value='<?php echo htmlentities(serialize($arr['excel_array']))?>'>
    <input  type='submit' class='submit' id='btnExport' value='Export to Excel' />

</form>


<?php


if( isset($_POST['excel_array']) ) {
    echo "<pre>";
    $Excel_array = unserialize($_POST['excel_array']);
    print_r($Excel_array);
}


?>

从反序列化中删除 htmlentities,因为您将反序列化一个数组并且 htmlentities 使用字符串

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2019-07-11
    • 1970-01-01
    • 2011-05-14
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多