我有这个非常简单的功能......
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,并打印出相应的错误消息。为什么是这样?有什么想法吗?
答案 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