Pregunta

dirección_despacho_código postal

no es obligatorio y seguirá ejecutándose incluso si está en blanco:

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

¿Lo que da?

¿Fue útil?

Solución

"dispatch_address_postcode no es obligatorio y seguirá ejecutándose incluso si está en blanco..."

Basta con mirar esa frase de nuevo.Si el campo no es obligatorio, está perfectamente bien si el código se ejecuta si el campo está en blanco.Si un campo no es obligatorio, no lo pruebe como obligatorio.

Sin embargo, el verdadero problema es is_null solo prueba si la variable es null.Los valores publicados nunca serán null, si están vacíos lo estarán '' (una cadena vacía).Todo tu !is_null las pruebas siempre ser true, y recibirá una advertencia si la variable no está configurada (algo que no desea que suceda).La prueba más apropiada sería !empty.

Pruebas aún más apropiadas incluirían una prueba si el valor parece ser válido (¿el correo electrónico parece una dirección de correo electrónico? ¿El teléfono tiene al menos x dígitos?).También debe recorrer los campos para que su código sea más legible, anidado y encadenado sin fin. if Las condiciones no son agradables de ver.

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

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

Otros consejos

Parece que está tratando de asegurarse de que todas las variables post se envíen.¿Te gustaría ayuda con eso?

¡Usando! Vacío () puede que no sea la respuesta a su pregunta específica, pero definitivamente ayudaría con lo que parece que está tratando de hacer.

vacío () devuelve verdadero Si la clave de $ _post no está configurada, si es una matriz vacía, o incluso si es una cadena vacía, ¡así que use! Vaciar () es una buena manera de asegurarse de que el usuario haya llenadoen la información.

Intenta escribir el tuyo propio is_valid funcionar y utilizarlo en lugar de is_null.

Por ejemplo (y esto de ninguna manera es exhaustivo):

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

Úselo así:

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

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

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

Editar: Por favor, considere esto antes de un downvote.Estoy dejando esto aquí para servir como "lo que no hacer".Lo eliminaría porque es malo, pero nadie aprendería de mis errores.

no hagas esto - Lea los comentarios para una gran información sobre por qué esto es malo

Mi respuesta va a ser salvajemente diferente, pero soy un chico salvajemente diferente ...

i solo encontró que esto funcionará.En lugar de todo lo que Is Isset y las cosas, ¡simplemente asigne las variables programáticamente!Creo que tengo algo de refactorización para hacer ... Ya sabes en todo mi código ...

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
}

Si usa este código, entonces no importa lo que sea nulo y lo que no está dentro del foreach porque no se hará nada que sea nulo.Luego, puede usar un código de aspecto mejor (y un código más rápido) para verificar cualquier cosa que sea necesaria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top