0

referral_1我有一个处理表单的 PHP 脚本,但如果用户输入了一组特定字段( 、、referral_2等)的任何信息,我想发送一封特定的确认电子邮件。

现在我有这个来检查用户是否在推荐字段(文本输入)中输入了任何信息:

if($referral_1 or $referral_2 or $referral_3 or $referral_4 or $referral_5 == null) {
    $autosubject = stripslashes($autosubject);
    $automessage = stripslashes($automessage);
    mail($email,"$autosubject","$automessage","From: $recipientname <$recipientemail>");
}

if($referral_1 or $referral_2 or $referral_3 or $referral_4 or $referral_5 != null) {
    $autosubject = stripslashes($autosubject);
    $automessage = stripslashes($automessage);
    mail($email,"$autosubject2","$automessage2","From: $recipientname <$recipientemail>");
}

但是当用户完成推荐字段时,它会发送两封电子邮件。当他们不输入任何推荐信息时,它似乎工作得很好(他们只会收到指定的确认电子邮件)。知道我做错了什么吗?

4

4 回答 4

2

PHP 布尔比较不能以这种方式工作。您不能将它们与第一个或最后一个参数进行比较。相反,您需要类似的东西:

// Build an array of all the values and test NULL appears in the array
if(in_array(NULL, array($referral_1, $referral_2, $referral_3, $referral_4, $referral_5)) {

// ADDED:
// To test if any value is NOT NULL, you can't use in_array(). Instead you can use
// array_filter() and check if the output array has any values
// This is complicated, and unless there are a lot of values to check, I'd probably just write
// out all each one longhand...
if (count(array_filter(array($referral_1, $referral_2, $referral_3, $referral_4, $referral_5), function($v) {return !is_null($v);})) > 0) {
   // There's a non-null
}

注意要像这样使用匿名函数array_filter()需要 PHP 5.3。

或者把它们写出来,并对它们进行完整的比较:

if($referral_1 === NULL or $referral_2 === NULL or $referral_3 === NULL or $referral_4 === NULL or $referral_5 === null) {

按照您的方式进行操作,PHP 的短路评估接管,列表中的第一个非空值返回 TRUE,使整个事情为 TRUE。

于 2012-04-09T19:09:34.477 回答
2

如果这些变量直接来自 $_POST,那么它们永远不会为空,例如像这样的 url

http://example.com/script.php?field=

会产生

$_GET['field'] = '';

并包含一个空字符串,而不是一个空值。

除此之外,您的逻辑有问题,它被解析为:

if (($referral_1 != '') or ($referral_2 != '') etc...)

为了使您的语句起作用,您需要将这些or位括起来,因为or它的优先级低于==,所以...

if (($referral_1 or .... or $referal_5) == null) {
    ^---                              ^--- new brackets

这打开了另一罐蠕虫。该or序列将产生一个布尔值 true 或 false,而不是null. 所以,你真正想要的只是:

if ($referral_1 or ... $referal_5) {
   ... a referal was specified in at least ONE of those fields.
}
于 2012-04-09T19:13:36.303 回答
1

您必须单独检查每个引用变量以查看它们是否为空:

if(is_null($referral_1) || is_null($referral_2) || is_null($referral_3) || is_null($referral_4) || is_null($referral_5)) {

我也建议使用is_null而不是== null

于 2012-04-09T19:09:25.747 回答
1

我会利用 isset() 如果值为 null 则返回 false 的事实,并且它可以检查多个值:

if (isset($referral_1, $referral_2, $referral_3, $referral_4, $referral_5)) {
 // all values are not-null
} else {
 // at least one value is not null
}

如果要检查所有值是否为空:

if (is_null($referral_1) and is_null($referral_2) and is_null($referral_3) and is_null($referral_4) and is_null($referral_5)) {
// all values are null
}
于 2012-04-09T19:12:08.390 回答