我在重定向后存储和检索错误消息时遇到问题。我只得到'数组'或'数组([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']数组中保存的错误消息?或者是否有更好的方法通过重定向发送(多个)错误消息?
答案 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将此列表放入列表列表中。它不起作用的原因是你试图显示列表本身,而不是逐个显示项目。