【问题标题】:Php header not working in functionPHP标头在功能中不起作用
【发布时间】:2015-09-23 10:17:15
【问题描述】:

我正在尝试从函数发送邮件,在发送邮件后我想将页面重定向到 index.php。

我正在使用 php 标头来执行此操作。但标题似乎不起作用。如果邮件已成功发送,则页面也保持不变。它没有被重定向到 index.php

我该怎么做?

<?php
   function sendInvitation($user_email,$invited_by)
    {
        $mail = new PHPMailer;
        if (EMAIL_USE_SMTP) {
            $mail->IsSMTP();
            $mail->SMTPAuth = EMAIL_SMTP_AUTH;
            if (defined(EMAIL_SMTP_ENCRYPTION)) {
                $mail->SMTPSecure = EMAIL_SMTP_ENCRYPTION;
            }
            $mail->Host = EMAIL_SMTP_HOST;
            $mail->Username = EMAIL_SMTP_USERNAME;
            $mail->Password = EMAIL_SMTP_PASSWORD;
            $mail->Port = EMAIL_SMTP_PORT;
        } else {
            $mail->IsMail();
        }
        $mail->From = EMAIL_VERIFICATION_FROM;
        $mail->FromName = $invited_by;
        $mail->AddAddress($user_email);
        $mail->Subject = APP_INVITE;
        $link = INVITE_LINK;
        $mail->Body = $invited_by." ".FRIEND_INVITE." ".$link;
        if(!$mail->Send()) {
            $this->errors[] = MESSAGE_VERIFICATION_MAIL_NOT_SENT . $mail->ErrorInfo;
            return false;            
        } else {        
            return true;            
            header("Location: index.php");
        }
    }
?>

【问题讨论】:

  • 正确,因为您在调用header();之前退出了函数

标签: php phpmailer


【解决方案1】:

未测试,但我认为问题在于您在 header(); 之前有一个 return();,因此该函数实际上在更改标题之前就退出了.. 尝试改变

} else {        
            return true;            
            header("Location: index.php");
        }

} else {        

            header("Location: index.php");
            return true;        
        }

在 PHP 中,return 实际上是在特定点停止函数执行的命令..

【讨论】:

    【解决方案2】:

    删除返回真。 你用返回退出你的函数,所以你的代码永远不会进入 header() :)

    【讨论】:

    • 回报是有道理的。它只需要在 header-call 之后调用。
    • @HansGerber 不完全正确,因为 return true 在页面重定向之前不能算作执行?还是我错了?
    • @HansGerber 那么可以安全地假设无论是离开return true(在标题之后)还是删除它,都会产生相同的结果?
    • 即使您之前调用了标头函数,返回 true 仍会传递给执行该函数的代码。
    【解决方案3】:

    设置出口;在标头()之后。

    【讨论】:

    • 与此无关,只是因为他在到达header();之前退出了函数
    • 如果它没有到达标题,它也不会到达出口:)
    【解决方案4】:

    你有两个选择:

    1) 删除return true 并设置:

    else {
        header("location: index.php");
        exit;
    }
    

    (这就是这个答案的原因,而不是这里的其他好答案)

    您调用函数并在函数返回后设置标题。

    所以函数中的代码是:

    else {
            return true;
        }
    

    你的函数调用是:

    if(sendInvitation($user_email,$invited_by)){
        //function returns true, mail has been sent
        header("location:index.php");
       exit;
     }
    

    在标头位置重定向之后立即放置exitdie 语句也是一种很好的做法,以停止服务器上正在处理的PHP 页面的其余部分。

    【讨论】:

      【解决方案5】:

      这样使用

      if(!$mail->Send())
      {
          $this->errors[] = 'MESSAGE_VERIFICATION_MAIL_NOT_SENT'. $mail->ErrorInfo;
      
      }
      else
      {
          header('Location: '.$_SERVER['SERVER_NAME']); //redirect to index.php
      }
      

      【讨论】:

      • 无论你使用什么函数,return 都会阻止它执行。返回需要在标头函数之后。
      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2013-07-04
      • 2019-06-16
      • 2015-02-26
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多