Php 如何在$\u会话中存储和检索错误数组
我在重定向后存储和检索错误消息时遇到问题。因此,我只得到“Array”或“Array([0]=>未添加任何文件)。Php 如何在$\u会话中存储和检索错误数组,php,html,arrays,http-redirect,Php,Html,Arrays,Http Redirect,我在重定向后存储和检索错误消息时遇到问题。因此,我只得到“Array”或“Array([0]=>未添加任何文件)。 下面我将详细描述我正在做的事情: 我正在编写一个php脚本,通过提交表单上传文件。但是,由于上传过程中可能会发生许多错误,因此我将这些错误存储在名为$errors的数组中。我如何将错误消息添加到阵列的示例: $errors[]=“错误消息放在这里” 在上传过程成功(或出错时失败)后,页面将重新加载以清除表单。(我认为)当用户提交一个空白表单时,还需要显示一个php错误(但可能还有其
下面我将详细描述我正在做的事情: 我正在编写一个php脚本,通过提交表单上传文件。但是,由于上传过程中可能会发生许多错误,因此我将这些错误存储在名为$errors的数组中。我如何将错误消息添加到阵列的示例:
$errors[]=“错误消息放在这里”代码>
在上传过程成功(或出错时失败)后,页面将重新加载以清除表单。(我认为)当用户提交一个空白表单时,还需要显示一个php错误(但可能还有其他方法,但我不知道)。为了通知用户在上传过程中可能出现的错误,我想将这个$errors数组存储在会话变量#(u 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()之上,没有其他内容)
我通过在会话_start()的正下方包含以下代码来测试数组是否已发送:
我发现需要unset,否则同样的错误会在刷新后一次又一次地保存在$\u会话['errors']中。print\r($errors)提供了以下输出:
Array ( [0] => Array ( [0] => No files were added. ) )
我猜$errors数组在重定向过程中幸存了下来,对吧
因此,接下来是实际错误的显示。我将$errors=$\u 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”或“Array([0]=>未添加任何文件。)”作为结果
我做错了什么?如何正确存储和检索保存在$errors和$\u SESSIONS['errors']数组中的错误消息?或者有没有更好的方法通过重定向发送(多个)错误消息?正如print\r所示,$error是一个数组数组,它包含在消息中。您必须更改(不要将错误推送到另一个数组):
致:
或修复来自的for循环(迭代内部数组):
致:
编辑
实际上我现在有点困惑。这三行表示每个循环都需要3foreach循环:
$errors[] = "No files were added.";
$_SESSION[ 'errors' ][] = $errors;
$errors[] = $_SESSION[ 'errors' ];
但print\r语句指向每个人的2
print_r($errors)
Array ( [0] => Array ( [0] => No files were added. ) )
第一部分非常适合您的修复。您删除了一个括号对[],并使用了两个foreach,如果您从我复制的第三行中删除[],我认为您的代码将正常工作。但我无法解释打印输出。你确定这不是印刷品吗?你需要某种形式的foreach:
foreach ($_SESSION['errors'] as $result)
echo($result)
应该有用。原因是$\u会话是一个数组数组
这样想:
您告诉PHP制作一个名为$errors的项目列表。然后告诉PHP将这个列表放入一个列表列表中。它不起作用的原因是您试图显示列表本身,而不是一个接一个地显示项目。实际上,您需要一个双重foreach不完全是您的答案,但我现在已经让它起作用了。我将$\u会话['errors']=$errors与foreach>if>foreach循环结合使用。你能解释一下原因吗?我不得不将if(isset($errors))也更改为if(isset($errors[0]),否则div errorlog会一直显示出来。当读回会话时,你使用$errors[]=$\u会话['errors'代码>。这会将会话数组添加到errors数组中,并在不存在时创建$errors。它还解释了为什么需要foreach>if>foreach和$errors[0]。但我不记得以前见过它。请给我几分钟时间浏览您的编辑,并尝试更好地解释。也许这会有所帮助,我已经将当前(工作)脚本添加到JSFIDLE中。这不是向你展示我的代码的最好方式,但它确实有意义,哈哈。只需检查JSFIDLE的HTML部分。伟大的我认为我们可以忽略关于2或3个循环的问题。1英寸更干净。在开发应用程序时玩得开心。“重新加载页面是为了清除表单,除此之外”我的建议是避免在会话中存储错误状态,并改进丢失错误数据的原因,即页面刷新。如果在错误条件下不重新打印默认值,则可以在不需要此行为的情况下清除表单。
$_SESSION[ 'errors' ] = $errors;
foreach ($errors as $key => $errorvalue){
echo($errorvalue);
}
foreach ($errors as $key => $errorvalue){
if(is_array($errorvalue)) {
foreach ($errorvalue as $em) {
echo $em;
}
}
}
$errors[] = "No files were added.";
$_SESSION[ 'errors' ][] = $errors;
$errors[] = $_SESSION[ 'errors' ];
print_r($errors)
Array ( [0] => Array ( [0] => No files were added. ) )
foreach ($_SESSION['errors'] as $result)
echo($result)