Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在$\u会话中存储和检索错误数组_Php_Html_Arrays_Http Redirect - Fatal编程技术网

Php 如何在$\u会话中存储和检索错误数组

Php 如何在$\u会话中存储和检索错误数组,php,html,arrays,http-redirect,Php,Html,Arrays,Http Redirect,我在重定向后存储和检索错误消息时遇到问题。因此,我只得到“Array”或“Array([0]=>未添加任何文件)。 下面我将详细描述我正在做的事情: 我正在编写一个php脚本,通过提交表单上传文件。但是,由于上传过程中可能会发生许多错误,因此我将这些错误存储在名为$errors的数组中。我如何将错误消息添加到阵列的示例: $errors[]=“错误消息放在这里” 在上传过程成功(或出错时失败)后,页面将重新加载以清除表单。(我认为)当用户提交一个空白表单时,还需要显示一个php错误(但可能还有其

我在重定向后存储和检索错误消息时遇到问题。因此,我只得到“Array”或“Array([0]=>未添加任何文件)。
下面我将详细描述我正在做的事情:

我正在编写一个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)