validar - php is null or empty
PHP: comprueba si existe la variable pero tambiƩn si tiene un valor igual a algo (12)
Mi pregunta es, ¿existe alguna forma de hacer esto sin declarar la variable dos veces?
No, no hay forma de hacer esto correctamente sin hacer dos controles. Yo también lo odio
Una forma de evitarlo sería importar todas las variables GET relevantes en un punto central a una matriz u objeto de algún tipo (la mayoría de los marcos MVC lo hacen automáticamente) y establecer todas las propiedades que se necesitan más adelante. (En lugar de acceder a las variables de solicitud a través del código).
Tengo (o no) una variable $_GET[''myvar'']
proviene de mi cadena de consulta y quiero verificar si esta variable existe y también si el valor corresponde a algo dentro de mi sentencia if:
Lo que estoy haciendo y creo que no es la mejor manera de hacerlo:
if(isset($_GET[''myvar'']) && $_GET[''myvar''] == ''something'')
: haz algo
Mi pregunta es, ¿existe alguna forma de hacer esto sin declarar la variable dos veces?
Ese es un caso simple, pero imagine que tiene que comparar muchas de estas variables $myvar
.
¿Por qué no crear una función para hacer esto? Convertir la variable que desea verificar en una variable real, ej.
function _FX($name) {
if (isset($$name)) return $$name;
else return null;
}
entonces haces _FX(''param'') == ''123''
, solo un pensamiento
Bueno, podrías salir con solo if($_GET[''myvar''] == ''something'')
ya que esa condición supone que la variable también existe. Si no lo hace, la expresión también dará como resultado false
.
Creo que está bien hacerlo dentro de sentencias condicionales como la anterior. No hay daño hecho realmente.
Como sugiere el clima suave, podría considerar este enfoque:
required = array(''myvar'' => "defaultValue1", ''foo'' => "value2", ''bar'' => "value3", ''baz'' => "value4");
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $key => $default ) {
$_GET[$key] = $default ;
}
Usted pone los valores predeterminados y establece los parámetros no recibidos en un valor predeterminado :)
Esto es similar a la respuesta aceptada, pero en in_array
lugar usa in_array
. Prefiero usar empty()
en esta situación. También sugiero usar la nueva declaración de matriz de taquigrafía, que está disponible en PHP 5.4.0 +.
$allowed = ["something","nothing"];
if(!empty($_GET[''myvar'']) && in_array($_GET[''myvar''],$allowed)){..}
Aquí hay una función para verificar múltiples valores a la vez.
$arrKeys = array_keys($_GET);
$allowed = ["something","nothing"];
function checkGet($arrKeys,$allowed) {
foreach($arrKeys as $key ) {
if(in_array($_GET[$key],$allowed)) {
$values[$key];
}
}
return $values;
}
Gracias Mellowsoon y Pekka, investigué aquí y presenté esto:
- Verifique y declare cada variable como nula (si es el caso) antes de comenzar a usar (como se recomienda):
!isset($_GET[''myvar'']) ? $_GET[''myvar''] = 0:0;
* ok este es simple pero funciona bien, puedes comenzar a usar la variable en todas partes después de esta línea
- Usando una matriz para cubrir todos los casos:
$myvars = array( ''var1'', ''var2'', ''var3''); foreach($myvars as $key) !isset($_GET[$key]) ? $_GET[$key] =0:0;
* después de eso, puedes usar tus variables (var1, var2, var3 ... etc),
PD: la función que recibe un objeto JSON debería ser mejor (o una cadena simple con separador para explotar / implosionar);
... Mejores enfoques son bienvenidos :)
ACTUALIZAR:
Use $ _REQUEST en lugar de $ _GET, de esta forma puede cubrir las variables $ _GET y $ _POST.
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
Lamentablemente, esa es la única forma de hacerlo. Pero hay enfoques para lidiar con arreglos más grandes. Por ejemplo algo como esto:
$required = array(''myvar'', ''foo'', ''bar'', ''baz'');
$missing = array_diff($required, array_keys($_GET));
La variable $ missing ahora contiene una lista de valores que se requieren, pero que faltan en la matriz $ _GET. Puede usar la matriz $ missing para mostrar un mensaje al visitante.
O puedes usar algo como eso:
$required = array(''myvar'', ''foo'', ''bar'', ''baz'');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
$_GET[$m] = null;
}
Ahora cada elemento requerido al menos tiene un valor predeterminado. Ahora puede usar if ($ _ GET [''myvar''] == ''something'') sin preocuparse de que la clave no esté configurada.
Actualizar
Otra forma de limpiar el código sería usar una función que verifique si el valor está establecido.
function getValue($key) {
if (!isset($_GET[$key])) {
return false;
}
return $_GET[$key];
}
if (getValue(''myvar'') == ''something'') {
// Do something
}
Si está buscando un trazador de líneas para verificar el valor de una variable que aún no está seguro, esta funciona:
if ((isset($variable) ? $variable : null) == $value) { }
El único inconveniente posible es que si está probando true
/ false
, null
se interpretará como igual a false
.
Sin referencia oficial, pero funcionó cuando probé esto:
if (isset($_GET[''myvar'']) == ''something'')
Una solución que he encontrado jugando es hacer:
if($x=&$_GET["myvar"] == "something")
{
// do stuff with $x
}
Utilizo todo el tiempo la propia función útil exst () que declara automáticamente las variables.
Ejemplo -
$element1 = exst($arr["key1"]);
$val2 = exst($_POST["key2"], ''novalue'');
/**
* Function exst() - Checks if the variable has been set
* (copy/paste it in any place of your code)
*
* If the variable is set and not empty returns the variable (no transformation)
* If the variable is not set or empty, returns the $default value
*
* @param mixed $var
* @param mixed $default
*
* @return mixed
*/
function exst( & $var, $default = "")
{
$t = "";
if ( !isset($var) || !$var ) {
if (isset($default) && $default != "") $t = $default;
}
else {
$t = $var;
}
if (is_string($t)) $t = trim($t);
return $t;
}
<?php
function myset(&$var,$value=false){
if(isset($var)):
return $var == $value ? $value : false;
endif;
return false;
}
$array[''key''] = ''foo'';
var_dump(myset($array[''key''],''bar'')); //bool(false)
var_dump(myset($array[''key''],''foo''));//string(3) "foo"
var_dump(myset($array[''baz''],''bar''));//bool(false)