如何在$ _SESSION

时间:2017-07-30 20:54:43

标签: php html arrays http-redirect

我在重定向后存储和检索错误消息时遇到问题。我只得到'数组'或'数组([0] =>没有添加任何文件。)'结果。
下面我将描述我到底在做什么:

我正在开发一个php脚本,它在提交表单的帮助下上传文件。但是,由于在上载过程中可能会发生许多错误,因此我将错误存储在名为$ errors的数组中。我如何将错误消息添加到数组的示例:

$errors[] = "The error message is placed here";

上传过程成功(或失败后,如果出现错误),重新加载页面以清除表单等。这是(我认为)还需要在用户提交空白表单时显示错误(但也许有另一种方法可以做到这一点,但我不知道)。为了告知用户上传过程中可能出现的错误,我想将这个$ errors数组存储在会话变量#_SESSION ['errors']中。我希望这有助于将错误带到刷新的页面。

无论如何,这是我得到的(粗略)脚本,它显示了重定向的位置。

if(isset($_POST['submit'])){
    [upload script]
}else{
    $errors[] = "No files were added.";
    $_SESSION[ 'errors' ] = $errors;
    header( 'Location:' . $_SERVER[ 'PHP_SELF' ] );
    exit();
}

当然我把session_start();在我的php开始标记下面(只有error_reporting(E_ALL)和ini_set('display_errors','1')在session_start()之上,没有别的。)

我通过直接在session_start()下面包含以下代码来测试是否发送了数组:

if(isset($_SESSION[ 'errors' ])){
    $errors[] = $_SESSION[ 'errors' ];
    unset( $_SESSION[ 'errors' ] );
    print_r($errors);
}

我发现需要取消设置,否则在刷新后会一遍又一遍地在$ _sessions ['errors']中保存相同的错误。 print_r($ errors)给出了以下输出:

Array ( [0] => Array ( [0] => No files were added. ) )

所以我猜$ errors数组幸免于重定向,对吧?

因此,显示实际错误。我将$ errors = $ _SESSION ['errors']代码放在我想要显示错误的位置(在我的body标签中,在菜单下面)。这是代码:

if(isset($_SESSION[ 'errors' ])){
    $errors[] = $_SESSION[ 'errors' ];
    unset( $_SESSION[ 'errors' ] );

}
if(isset($errors)){
    echo "<div id=\"errorLog\" class=\"errorLogCl\" onClick=\"this.parentNode.style.display = 'none';\">";
    foreach ( $errors as $e ) {
        echo $e;
    }
    echo "</div>";
}

但是,这只会将'Array'作为值。我尝试了其他选项,例如print_r或:

foreach ($errors as $key => $errorvalue){
    echo($errorvalue);
}

但是我仍然只得到'Array'或'Array([0] =&gt;没有添加文件。)'结果。

我做错了什么以及如何正确存储和检索我在$ errors和$ _SESSIONS ['errors']数组中保存的错误消息?或者是否有更好的方法通过重定向发送(多个)错误消息?

2 个答案:

答案 0 :(得分:3)

正如print_r所示,$ error是一个数组数组,它​​包含了消息。您必须更改(不要将错误推送到另一个阵列):

$_SESSION[ 'errors' ][] = $errors;

为:

$_SESSION[ 'errors' ] = $errors;

或修复你的for循环(迭代内部数组):

foreach ($errors as $key => $errorvalue){
  echo($errorvalue);
}

为:

foreach ($errors as $key => $errorvalue){
  if(is_array($errorvalue)) {
    foreach ($errorvalue as $em) {
      echo $em;
    }
  }
}

修改 其实我现在感到很困惑。这三行意味着您需要 3 foreach循环:

$errors[] = "No files were added.";
$_SESSION[ 'errors' ][] = $errors;
$errors[] = $_SESSION[ 'errors' ];

但print_r语句指向 2 foreach:

print_r($errors)
Array ( [0] => Array ( [0] => No files were added. ) )

第一部分非常适合您的修复。你删除了一个括号对[],并使用了两个foreach,我认为如果从我复制的第三行中删除[],你的代码将会起作用。但我无法解释print_r输出。你确定不是来自print_r($ e)吗?

答案 1 :(得分:0)

你需要某种形式:

foreach ($_SESSION['errors'] as $result)  
    echo($result)

应该有效。原因是$ _SESSION是一个数组数组。

这样想:
您告诉PHP制作一个名为$ errors的项目列表。然后告诉PHP将此列表放入列表列表中。它不起作用的原因是你试图显示列表本身,而不是逐个显示项目。