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()PHP5.3が必要です。

または、それぞれの完全な比較を使用して、それらを手書きで書きます。

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

これをあなたのやり方で行うと、PHPの短絡評価が引き継がれ、リストの最初のnull以外の値がTRUEを返し、すべてがTRUEになります。

于 2012-04-09T19:09:34.477 に答える
2

これらの変数が$_POSTから直接取得されている場合、それらがnullになることはありません。たとえば、次のようなURL

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

を生成します

$_GET['field'] = '';

null値ではなく、空の文字列が含まれています。

それを超えて、あなたのロジックは欠陥があり、それは次のように解析されています:

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

各リファラー変数を個別にチェックして、それらがnullかどうかを確認する必要があります。

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
}

すべての値が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 に答える