如何在 $_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 数组中的值
PHP:$_SESSION - 在 $_SESSION 变量中存储临时使用的数据的优缺点是啥