2012-02-06 18 views
19
if(isset($_POST['submit'])) { 
    if(!isset($_POST['userName'])) { 
     $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 

No puedo obtener el $username como "Anónimo"? Está en blanco o el valor de $_POST['userName'].

+1

isset value comprueba si la variable ya se ha establecido. sin embargo, cuando envía un formulario, una variable será una cadena vacía. – miki725

Respuesta

35

isset() devolverá verdadero si la variable se ha inicializado. Si tiene un campo de formulario con su valor name establecido en userName, cuando se envía ese formulario, el valor siempre se "establecerá", aunque es posible que no contenga ningún dato.

En cambio, trim() la cadena y poner a prueba su longitud

if("" == trim($_POST['userName'])){ 
    $username = 'Anonymous'; 
}  
+0

¿Es seguro usar variables globales directamente sin desinfectarlas o escapar de ellas? –

+3

@edwardtorvalds en el ejemplo anterior la variable no se usa más allá de ser comparada. Si cambiara el contexto (es decir, salida a HTML/JSON, utilizado en una consulta de almacén de datos, etc.), entonces debería tratarse como no confiable y tratarse con el contexto de manera apropiada. – Andy

35

Si el formulario se ha enviado correctamente, $_POST['userName'] debe establecerse siempre, a pesar de que puede contener una cadena vacía, que es diferente de no ser ajustada a todos . En lugar comprobar si es empty()

if(isset($_POST['submit'])){ 

    if(empty($_POST['userName'])){ 
     $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 
+3

+1 Para completar, consulte http://php.net/empty lo que se considera "vacío". – deceze

0

isset está probando si la tecla o no se está comprobando en el hash (o matriz asociativa) se "ajuste". Establecer en este contexto solo significa si conoce el valor. Nada es un valor. Por lo tanto, se define como una cadena vacía.

Por esa razón, siempre que tenga un campo de entrada llamado userName, independientemente de si lo completan, esto será cierto. Lo que realmente quiere hacer es comprobar si el nombre de usuario es igual a una cadena vacía ''

7

Para comprobar si la propiedad está presente, independientemente del valor, utilice:

if (array_key_exists('userName', $_POST)) {} 

Para comprobar si la propiedad se establece (propiedad está presente y el valor no es null o false), utilice:

if (isset($_POST['userName'])) {} 

Para comprobar si la propiedad se establece y no está vacío (no una cadena vacía, 0 (número entero), 0.0 (float), '0' (cadena), null, false o [] (matriz vacía)), utilice:

if (!empty($_POST['userName'])) {} 
1

cambiar esta situación:

if(isset($_POST['submit'])){ 

    if(!(isset($_POST['userName']))){ 
    $username = 'Anonymous'; 
    }  
    else $username = $_POST['userName']; 
} 

A esto:

if(!empty($_POST['userName'])){ 
    $username = $_POST['userName']; 
} 

if(empty($_POST['userName'])){ 
    $username = 'Anonymous'; 
} 
+0

Es posible que desee probar esto por sí mismo – jprofitt

+0

Sí una buena llamada debería haber estado vacía(). –

3

Pregunta: Comprobar si un valor $ _POST es vacío.

Traducción: Compruebe si una matriz clave/índice tiene un valor asociado.

Respuesta: Depende de su énfasis en la seguridad. Depende de lo que está permitido como entrada válida.

1. Some people say use empty(). 

Desde el Manual de PHP: "[vacío] determina si una variable es considerada como vacía Una variable se considera vacía si no existe o si su valor es igual a FALSO.". Los siguientes se consideran vacíos.

"" (an empty string) 
0 (0 as an integer) 
0.0 (0 as a float) 
"0" (0 as a string) 
NULL 
FALSE 
array() (an empty array) 
$var; (a variable declared, but without a value) 

Si ninguno de estos valores son válidos para el control de entrada y, a continuación empty() funcionaría. El problema aquí es que empty() podría ser demasiado amplio para ser utilizado de manera consistente (de la misma manera, por la misma razón, en diferentes envíos de control de entrada a $_POST o $_GET). Un buen uso de empty() es comprobar si una matriz completa está vacía (no tiene elementos).

2. Some people say use isset(). 

isset() (una construcción del lenguaje) no pueden funcionar en matrices de enteros, como en isset($myArray). Solo puede operar en variables y elementos de matriz (mediante el índice/clave): isset($var) y isset($_POST['username']). El constructo de lenguaje isset() hace dos cosas. Primero comprueba si una variable o matriz índice/clave tiene un valor asociado. En segundo lugar, verifica para asegurarse de que el valor no sea igual al valor PHP NULL.

En resumen, la comprobación más precisa se puede realizar mejor con isset(), ya que algunos controles de entrada ni siquiera se registran con $ _POST cuando no están seleccionados o marcados. Nunca he conocido un formulario que envió el valor PHP NULL. Ninguno de los míos lo hace, entonces uso isset() para verificar si una clave $_POST no tiene ningún valor asociado (y eso no es NULO). isset() es un prueba mucho más estricta de vacío (en el sentido de su pregunta) que empty().

3. Some people say just do if($var), if($myArray), or if($myArray['userName']) to determine emptiness. 

usted puede probar todo lo que se evalúa como verdadera o falsa en una sentencia if. Las matrices vacías evalúan a falso y también lo hacen las variables que no están establecidas. Las variables que contienen el valor PHP NULL también evalúan a falso. Desafortunadamente en este caso, como con empty(), muchas cosas más también se evalúan como falsas: 1. la cadena vacía '', cero (0), cero.zero (0.0), la cadena cero '0', booleano falso y cierto vacío Objetos XML

--Doyle, a partir de PHP 5.3

En conclusión, el uso isset() y considerar la combinación con otras pruebas. Ejemplo:

Puede que no funcione debido a la atornilladura superglobal, pero funcionaría para otras matrices sin dudarlo.

if(is_array($_POST) && !empty($_POST)) 
{ 
    //Now test for your successful controls in $_POST with isset() 
} 

Esto debería funcionar también.

if(is_array($_POST) && $_POST) 
{ 
    //Now test for your successful controls in $_POST with isset() 
    //Always validate your input. 
} 

Por lo tanto, ¿por qué buscar un valor asociado a una clave incluso antes de saber con certeza que $_POST representa una matriz y ha cualquier valor almacenado en ella en absoluto (algo que muchas personas no tienen en cuenta)? Recuerde, las personas pueden enviar datos a su formulario sin usar un navegador web. Es posible que algún día llegues al punto de probar que $_POST solo tiene las teclas permitidas, pero esa conversación es para otro día.

Referencia útil:

PHP Manual: Type Testing Comparison Tables

1

que haría uso de un simple comparisant una línea para estos casos de uso

$username = trim($_POST['userName'])?:'Anonymous'; 

Esto es para el caso de uso que esté seguro de registro de errores se encuentre apagado para no recibe una advertencia de que la variable no está inicializada.

esta es la versión paranoica:

$username = trim(isset($_POST['userName'])?$_POST['userName']:'')?:'Anonymous'; 

Esto implementa una comprobación de si se ha establecido la variable $_POST. antes de acceder a ella

+0

Si el valor es "0", la variable será NULL. No lo uses. – Erikas