【问题标题】:Write text with echo() after reloading page with header()使用 header() 重新加载页面后使用 echo() 写入文本
【发布时间】:2015-04-05 11:28:49
【问题描述】:

我有一个名为account_settings.php 的页面,它包括更改密码、更改个人资料图片、更改用户详细信息(姓名、简历等)。我的问题是如何在使用header() 重定向页面后使用echo() 编写消息。

类似这样的:

if (true) 
{
    Do_Some_MySQL();
    header("Location: account_settings.php");
    echo "Success!";
}
else
{
    echo "Error!";
}

感谢您的所有回复。 ;-)

【问题讨论】:

  • 如果你重定向你重定向这是不可能的!
  • 你想显示什么标题?
  • 如果您使用Location 标头重定向到另一个页面,那么您无法从原始页面产生任何进一步的输出。一种选择是使用 JavaScript 重定向方法。
  • 你不能。 header()Location: 一起使用会将您重定向到另一个页面,因此您无法在其后显示某些内容。 第二种特殊情况是“Location:”标头。它不仅将此标头发送回浏览器,而且还会向浏览器返回一个 REDIRECT (302) 状态码,除非已经设置了 201 或 3xx 状态码。 source : php.net
  • 如果我将成功和错误字符串保存到会话中也不起作用?

标签: php if-statement header echo


【解决方案1】:

在发送 Location 标头后,您实际上无法执行任何操作 - 这是不可能的。

相反,您可以使用$_SESSION 数组值来执行您的任务。喜欢:

if (true) 
{
  Do_Some_MySQL();
  $_SESSION['message'] = 'Error!';
  header("Location: account_settings.php");
}

else
{
  echo "Error!";
}

然后在你的 account_setting.php 上:

<?php echo $_SESSION['message'] ?>

如果account_settings.php 与您当前所在的页面不同,那就太好了。否则,您可以使用以下代码:

if (true) 
{
  Do_Some_MySQL();
  $error = 'Success!';
  header("Location: account_settings.php");
}

else
{
  $error = "Error!";
}

在同一页面上:

<?php if($error) echo $error; ?>

如果您还没有在两个页面上添加session_start(),请不要忘记。

【讨论】:

  • 这个解决方案似乎不错,但是当我离开此页面并返回时,成功或错误文本仍然存在。
  • 然后在加载页面后尝试刷新成功/错误消息变量。或者只是让他们$message = NULL
【解决方案2】:

我会使用 SESSION 变量: 在重定向页面上:

<?php
@session_start();

if(true){
   $_SESSION['success'] = 1;
   header("Location: account-settings.php");
}
?>

在 account-settings.php 上:

<?php
@session_start();

if(isset($_SESSION['success'])){
   echo "Success!";
   unset($_SESSION['success']);
}

【讨论】:

    【解决方案3】:

    您刚重定向后无法回显任何内容。浏览器已经在处理重定向到另一个页面的请求,所以它不再需要显示消息了。您似乎正在寻找的是一种叫做 Flash 消息的东西。您可以在会话中设置一个临时消息并让它显示在新页面上。例如,在您的account_settings.php 页面中:

    // Make sure you have an actual session
    if (!session_id()) {
        session_start();
    }
    
    if (true) {
        Do_Some_MySQL();
        $_SESSION['flashMessage'] = 'Success!';
        header('Location: account_settings.php');
    }
    

    然后在您的 account_settings 模板文件中,检查是否有任何闪烁消息并相应地显示(并取消设置以避免循环):

    if (isset($_SESSION['flashMessage'])) {
        echo $_SESSION['flashMessage'];
        unset($_SESSION['flashMessage']);
    }
    

    【讨论】:

      【解决方案4】:

      这些人是正确的...您不能在重定向后发送标头。虽然我认为这将是一个有益的选择。在您的标头中发送 GET 请求并在接收页面上处理它。他们建议使用 $_SESSION 变量,但您可以使用 GET 变量。例如:

          if (true) 
      {
          //Do_Some_MySQL();
          header("Location: account_settings.php?message=success");
          //above has GET var message = Success
      }
      else
      {
          header("Location: account_settings.php?message=error");
      }
      

      在您的 account_settings.php 页面上有此代码:

      if (isset($_GET['message'])) {
          $message = $_GET['message'];
          if ($message == "success") {
               echo "Success";
          } else {
               echo "Error";
          }
      }
      

      这消除了对 CONSTANT SESSION 变量的需要。并为您提供足够的灵活性。

      header("Location: account_settings.php?message=No%20results%20found");
      //%20 are URL spaces. I don't know if these are necessary.
      

      如果您需要,可以添加多个。

      header("Location: account_settings.php?message=error&reason=No%20Results&timestamp=" . Date());
      

      那么account_settings.php可以是:

      if (isset($_GET['message'])) {
          $message = $_GET['message'];
          $reason = $_GET['reason'];
          $time = $_GET['timestamp'];
          if ($message == "success") {
               echo "Success";
          } else {
               echo "Error: <br/>";
               echo "Reason: $reason";
          }
      }
      

      但请记住,GET 会在浏览器 URL 中公开您的消息。所以不要发送敏感信息,除非你保护它。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 2019-02-03
        • 2013-07-07
        • 1970-01-01
        • 2020-04-02
        相关资源
        最近更新 更多