如何在 $_SESSION 中存储和检索错误数组

Posted

技术标签:

【中文标题】如何在 $_SESSION 中存储和检索错误数组【英文标题】:How to store and retrieve error arrays in $_SESSION 【发布时间】:2018-01-06 08:39:09 【问题描述】:

我在重定向后存储和检索错误消息时遇到问题。结果,我只得到 'Array' 或 'Array ( [0] => No files were added. )'。 下面我描述了我到底在做什么:

我正在编写一个 php 脚本,该脚本借助提交表单上传文件。但是,由于在上传过程中可能会出现许多错误,因此我将这些错误存储在一个名为 $errors 的数组中。我如何将错误消息添加到数组的示例:

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

上传过程成功(或失败,如果出现错误)后,页面会重新加载以清除表单等。当用户提交空白表单时,这(我认为)也需要显示 php 错误(但也许还有另一种方法可以做到这一点,但我不知道)。为了通知用户上传过程中可能出现的错误,我想将此 $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'] 代码放在我想显示错误的地方(在我的正文标签中,在菜单下方)。代码如下:

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>";

但是,这仅将“数组”作为值。我尝试了其他选项,例如 print_r 或:

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

但我仍然只得到“数组”或“数组([0] => 未添加文件。)”。

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

【问题讨论】:

"页面被重新加载以清除表单等" 我的建议是避免在会话中存储错误状态并改善丢失错误数据的原因,页面刷新。如果您在错误情况下不重新打印默认值,则无需此行为即可清除表单。 【参考方案1】:

正如 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) 吗?

【讨论】:

不完全是您的答案,但我现在可以正常工作了。我将 $_SESSION[ 'errors' ] = $errors 与 foreach > if > foreach 循环结合使用。你能解释一下为什么会这样吗? 我还必须将 if(isset($errors)) 更改为 if(isset($errors[0])),否则 div 错误日志会一直显示。跨度> 回读会话时,您使用$errors[] = $_SESSION[ 'errors' ];。这会将会话数组添加到错误数组中,如果不存在则创建 $errors。它还解释了为什么需要 foreach > if > foreach 和 $errors[0]。但我不记得以前见过它。请给我几分钟时间来浏览您的编辑,并尝试更好地解释它。 也许这有帮助,我已将当前(工作)脚本添加到 jsfiddle。不是向您展示我的代码的最佳方式,但它是一些东西,哈哈。只需检查 jsfiddle 的 html 部分。 jsfiddle.net/75ndg4h8 太棒了。我认为我们可以忽略 2 或 3 个循环的问题。 1 更清洁。玩得开心开发您的应用程序。【参考方案2】:

你需要某种 foreach:

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

应该可以。原因是 $_SESSION 是一个数组数组。

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

【讨论】:

其实你需要一个双foreach

以上是关于如何在 $_SESSION 中存储和检索错误数组的主要内容,如果未能解决你的问题,请参考以下文章

存储在 $_SESSION 但显示在 $_COOKIES 数组中的值

在 $_SESSION 中存储 Doctrine 对象

PHP:$_SESSION - 在 $_SESSION 变量中存储临时使用的数据的优缺点是啥

如何在matlab中存储和检索多个决策树

如何在 userdefault 中存储和检索数据? (例如:结构数组)

如何在 laravel 6 中存储和检索嵌套的 JSON 数组