Domanda

.

dispatch_address_postcode

non è obbligatorio e funzionerà ancora se è vuoto:

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'])
        )
    )
)
.

Cosa dà?

È stato utile?

Soluzione

.

"dispatch_address_postcode non è obbligatorio e funzionerà ancora anche se è vuoto ..."

guarda di nuovo quella frase. Se il campo non è obbligatorio, è perfettamente a posto se il codice funziona se il campo è vuoto. Se un campo non è obbligatorio, non testarlo come obbligatorio.

Il problema reale è però, is_null Solo test Se la variabile è null. I valori pubblicati non saranno mai generatodicetagcode, se sono vuoti saranno null (una stringa vuota). Tutti i test '' SEMPRE sono !is_null, e riceverai un avviso se la variabile non è impostata (qualcosa che non si vuole accadere). Il test più appropriato sarebbe true .

Ancora più test appropriati includerebbe un test se il valore sembra valido (l'e-mail è come un indirizzo email, il telefono ha almeno due cifre in esso?). Dovresti anche loop attraverso i campi per rendere il tuo codice più leggibile, le condizioni generali di generazione ingidulata e incatenate e incatenati non sono gioia da guardare.

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

foreach ($mandatoryFields as $field => $rule) {
    if (empty($_POST[$field]) || !validateByRule($_POST[$field], $rule)) {
        raiseHell();
    }
}
.

Altri suggerimenti

Sembra che tu stia cercando di assicurarsi che siano state inviate tutte le variabili post.Ti piacerebbe aiutare con questo?

Usando! vuoto () potrebbe non essere la risposta alla tua specifica domanda, ma avrebbe sicuramente aiutato con quello che sembra che tu stia cercando di fare.

vuoto () restituisce true se il tasto $ _post non è impostato, se è un array vuoto, o anche se è una stringa vuota, così usando! vuoto () è un buon modo per assicurarsi che l'utente abbia riempitonelle informazioni.

prova a scrivere la tua funzione is_valid e usa quella anziché is_null.

Ad esempio (e questo non è affatto completo):

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;
}
.

Usa come così:

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

!is_null($_POST['personal_info_first_name']) && !isset($_POST['personal_info_first_name'])
.

Usa array_key_exists('card_number', $_POST) && !empty($_POST['card_number'])

Modifica: si prega di considerarlo prima di un downvote.Lo sto lasciando qui per servire come "cosa non fare".Lo cancellerei perché è brutto, ma poi nessuno imparerebbe dai miei errori.

Non fare questo - Leggi i commenti per grandi informazioni sul perché questo è cattivo

La mia risposta sarà selvaggiamente diversa, ma sono un ragazzo selvaggiamente diverso ...

I Just ha scoperto che questo funzionerà.Invece di tutto ciò che il fesset e le cose, assegnare a livello programmaticamente le variabili!Penso di averne alcuni refactoring da fare ... sai su tutto il mio codice ...

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
}
.

Se si utilizza questo codice, non importa ciò che è nullo e ciò che non è all'interno del foreach perché tutto ciò che è nullo semplicemente non sarà fatto.Quindi puoi usare il codice più bello (e probabilmente il codice più veloce) per verificare tutto ciò che è richiesto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top