返回负值

时间:2009-07-31 13:50:18

标签: php

我有这个非常简单的功能......

function send_mail($to, $from, $from_mail, $subject, $message) {

  if ( empty($from) || empty($from_mail) || empty($subject) || empty($message) ) {
      return -1;
  }

  if ( isset ($_SESSION['last_mailed']) )
  {
    if ( $_SESSION['last_mailed'] + 180 < time() )
        return -2;
  }
  $_SESSION['last_mailed'] = time();

  if ( !validEmail($from_mail) )
     return -3;

  $from = strip_mail_headers_single($from);
  $from_mail = strip_mail_headers_single($from_mail);
  $subject = strip_mail_headers_single($subject);
  $message = strip_mail_headers_multi($message);

  return mail($to, $subject, $message, "From: $from <$from_mail>\r\n");

}

if ( !empty($_POST) ) {
  $result = send_mail($mail_to, $_POST['from'], $_POST['from_mail'], $_POST['subject'], $_POST['message']);

  if ( $result == -1 ) 
  {
      echo "<p>You need to complete all the fields.</p>";
  } 
  elseif ( $result == -2 ) 
  {
      echo "<p>You can only send one mail every three minutes.</p>";
  } 
  elseif ( $result == -3 ) 
  {
      echo "<p>Please enter a valid email address.</p>";
  } 
  else 
  {
      echo "<p>Mail sent successfully!</p>";
  }
}

我得到了一些奇怪的结果。 mail()函数返回,结果设置为1并发送邮件。但是,“if ( $result == -1 )”由于某种原因计算结果为true,并打印出相应的错误消息。为什么是这样?有什么想法吗?

3 个答案:

答案 0 :(得分:3)

这是因为你正在返回mail()的结果,在成功的情况下是true,并且PHP有这个非常愚蠢的东西,其中true的语义是它与每个布尔值表达式(包括==相同)(在弱-1比较中)。

建议:

return mail($to, $subject, $message, "From: $from <$from_mail>\r\n") ? 1 : 0;

并为0案例添加处理,表明mail()失败。

使用===代替==进行比较也可以。

答案 1 :(得分:3)

对于初学者来说,你的逻辑是错误的:

if ( $_SESSION['last_mailed'] + 180 < time() )
    return -2;
}
$_SESSION['last_mailed'] = time();

// snip

elseif ( $result == -2 ) 
{
    echo "<p>You can only send one mail every three minutes.</p>";
} 

用普通英语说,如果自上次发送电子邮件以来已超过3分钟,则返回-2。

其次PHP中的mail function返回bool true或false。不要试图将其与-1进行比较。

答案 2 :(得分:0)

在第一行,您要检查空值,但忘记检查$to

if ( empty($from) || empty($from_mail) || empty($subject) || empty($message) ) 

然后跳过那个if-condition因为,即使它是空白的,你也不会检查它,所以没有什么是真的错。

然后当你到达mail()函数时,电子邮件被成功发送,无论在这种情况下是否为to名称,然后返回布尔值true或{{1 }}

此外,因为你正在测试这个:

1

它始终会评估为if ($result == -1) ,因为PHP, boolean types的世界是true,除非它们是true或为空。

将这些支票更改为引用,如下所示:

false