1

発送先住所郵便番号

必須ではなく、空白の場合でも実行されます:

if (!is_null($_POST['personal_info_first_name']) && 
    !is_null($_POST['personal_info_surname']) && 
    !is_null($_POST['personal_info_email']) && 
    !is_null($_POST['personal_info_telephone']) && 
    !is_null($_POST['dispatch_address_country']) && 
    !is_null($_POST['dispatch_address_first_name']) &&
    !is_null($_POST['dispatch_address_surname']) && 
    !is_null($_POST['dispatch_address_address']) && 
    !is_null($_POST['dispatch_address_town']) && 
    !is_null($_POST['dispatch_address_postcode']) && 
    !is_null($_POST['dispatch_address_county']) && 
    (   ($_POST['payment_method'] == "Pay by credit card.") ||
        (
            ($_POST['payment_method'] == "Pay by new credit card.") && 
            !is_null($_POST['card_number']) && 
            !is_null($_POST['expiration_date']) && 
            !is_null($_POST['security_code'])
        )
    )
)

何を与える?

4

6 に答える 6

8

"dispatch_address_postcodeは必須ではなく、空白の場合でも実行されます..."

その文をもう一度見てください。フィールドが必須でない場合、フィールドが空白の場合にコードが実行されてもまったく問題ありません。フィールドが必須でない場合は、必須としてテストしないでください。

ただし、実際の問題はis_null、変数が であるかどうかのみをテストすることですnull。POST された値は になることはなくnull、空の場合は''(空の文字列) になります。すべての!is_nullテストは常にになりtrue、変数が設定されていない場合は警告が表示されます (発生したくないこと)。より適切なテストは!empty.

さらに適切なテストには、値が有効であると思われるかどうかのテストが含まれます (電子メールは電子メール アドレスのように見えますか、電話番号には少なくとも x 桁が含まれていますか?)。また、コードを読みやすくするためにフィールドをループする必要があります。エンドレスにネストされ、チェーンされたif条件は見ていて楽しいものではありません。

$mandatoryFields = array('foo' => 'email', 'bar' => 'telephone');

foreach ($mandatoryFields as $field => $rule) {
    if (empty($_POST[$field]) || !validateByRule($_POST[$field], $rule)) {
        raiseHell();
    }
}
于 2010-07-19T23:27:53.570 に答える
8

すべての投稿変数が送信されていることを確認しようとしているようです。それを手伝ってくれませんか?

!empty() を使用することは、特定の質問に対する答えではないかもしれませんが、あなたがやろうとしているように見えることには間違いなく役立ちます.

empty() は、$_POST キーが設定されていない場合、空の配列の場合、または空の文字列の場合でも TRUE を返すため、!empty() を使用すると、ユーザーが情報を入力したことを確認できます。 .

于 2010-07-19T22:40:23.707 に答える
1

独自のis_valid関数を作成して、 ではなくそれを使用してみてくださいis_null

例 (これは決して包括的なものではありません):

function is_valid(&$array, $key, $required=false) {
    if(!array_key_exists($array))
        return false;
    $value = trim($array[$key]);
    if(empty($value) && $required)
        return false;
    return true;
}

次のように使用します。

if(is_valid($_POST, 'personal_info_first_name', true) && ...)

于 2010-07-19T22:46:36.547 に答える
0

使用するarray_key_exists('card_number', $_POST) && !empty($_POST['card_number'])

于 2010-07-19T22:41:32.860 に答える
0

編集:反対票を投じる前にこれを考慮してください。これは「やってはいけないこと」としてここに残しておきます。悪いので削除しますが、誰も私の過ちから学ぶことはありません.

これをしないでください- なぜこれが悪いのかについての素晴らしい情報についてはコメントを読んでください

私の答えは大きく異なりますが、私は大きく異なる男です...

これが機能することがわかりました。すべての isset などの代わりに、プログラムで変数を割り当てるだけです! リファクタリングが必要だと思います...すべてのコードを知っています...

if (!is_array($_POST)){exit "$_POST isn't an array";}
foreach ($_POST as $param => $value){
    ${$param} = secure($value);
}

//now you have a set of variables that are named exactly as the posted param
//for example, $_POST['personal_info_first_name'] == $personal_info_first_name

if ($payment_method == "Pay by credit card."){
    //do stuff that you were gonna do anyways
} else if ($payment_method == "Pay by new credit card.") {
    if ($card_number && $expiration_date && $security_code){
        //do stuff that you were gonna do anyways
    } else {
        exit("info missing for credit card transaction");
    }
} else {
    exit("unknown payment method")
}

function secure($input){
    //sanitize user input
}

このコードを使用すると、何が null で何が foreach 内にないかは問題になりません。なぜなら、null のものは作成されないからです。次に、見栄えの良いコード (およびおそらくより高速なコード) を使用して、必要なものを確認できます。

于 2010-07-19T23:35:17.343 に答える
0
!is_null($_POST['personal_info_first_name']) && !isset($_POST['personal_info_first_name'])
于 2010-07-19T22:35:53.133 に答える