PHP: vérifier si la variable existe mais aussi si elle a une valeur égale à quelque chose
j'AI (ou non) une variable $_GET['myvar']
provenant de ma chaîne de requête et je veux vérifier si cette variable existe et aussi si la valeur correspond à quelque chose à l'intérieur de ma déclaration if:
Ce que je suis en train de faire et de penser n'est pas la meilleure façon de le faire:
if(isset($_GET['myvar']) && $_GET['myvar'] == 'something')
: faire quelque chose
ma question Est, existe un moyen de le faire sans déclarer la variable deux fois?
C'est un cas simple mais imaginez il faut comparer plusieurs de ces variables $myvar
.
12 réponses
C'est malheureusement la seule façon de le faire. Mais il y a des approches pour traiter avec des tableaux plus grands. Par exemple quelque chose comme ceci:
$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
la variable $missing contient maintenant une liste de valeurs nécessaires, mais manquantes dans le tableau $_GET. Vous pouvez utiliser le tableau $missing pour afficher un message au visiteur.
Ou vous pouvez utiliser quelque chose comme ça:
$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
$_GET[$m] = null;
}
Maintenant, chaque élément requis au moins a une valeur par défaut. Vous pouvez maintenant utiliser si ($_GET ['myvar'] = = 'quelque chose') sans vous inquiéter que la clé ne soit pas définie.
mise à Jour
Une autre façon de nettoyer le code serait d'utiliser une fonction qui vérifie si la valeur est définie.
function getValue($key) {
if (!isset($_GET[$key])) {
return false;
}
return $_GET[$key];
}
if (getValue('myvar') == 'something') {
// Do something
}
si vous cherchez une doublure unique pour vérifier la valeur d'une variable que vous n'êtes pas sûr d'avoir définie, cela fonctionne:
if ((isset($variable) ? $variable : null) == $value) { }
le seul inconvénient possible est que si vous testez pour true
/ false
- null
sera interprété comme égal à false
.
comme mellowsoon le suggère, vous pourriez considérer cette approche:
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 ;
}
vous mettez les valeurs par défaut et définissez les paramètres NON recieved à une valeur par défaut:)
ma question Est, existe un moyen de le faire sans déclarer la variable deux fois?
Non, il n'y a aucun moyen de le faire correctement sans faire deux chèques. je le déteste aussi.
une façon de contourner cela serait d'importer toutes les variables GET pertinentes à un point central dans un tableau ou un objet quelconque (la plupart des cadres MVC le font automatiquement) et de définir toutes les propriétés qui sont besoin plus tard. (Au lieu d'accéder aux variables request à travers le code.)
Merci Mellowsoon et Pekka, j'ai fait quelques recherches ici et de venir avec ceci:
- cochez et déclarez chaque variable comme nulle (si tel est le cas) avant de commencer à utiliser (comme recommandé):
!isset($_GET['myvar']) ? $_GET['myvar'] = 0:0;
*ok c'est simple mais fonctionne bien, vous pouvez commencer à utiliser la variable partout après cette ligne
- utilisant un tableau pour couvrir tous les cas:
$myvars = array( 'var1', 'var2', 'var3'); foreach($myvars as $key) !isset($_GET[$key]) ? $_GET[$key] =0:0;
*après cela vous êtes libre d'utiliser vos variables (var1, var2, var3 ... etc),
PS.: fonction recevant un objet JSON devrait être mieux (ou une chaîne simple avec séparateur pour exploser/implode);
... De meilleures approches sont les bienvenues:)
mise à jour:
utilisez $_REQUEST au lieu de $_GET, de cette façon vous couvrez les variables $_GET et $_POST.
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
pourquoi ne pas créer une fonction pour faire ceci, convertir la variable que vous voulez vérifier en une variable réelle, ex.
function _FX($name) {
if (isset($$name)) return $$name;
else return null;
}
puis vous faites _FX('param') == '123'
, juste une pensée
j'utilise à tout moment propre fonction utile exst () qui déclare automatiquement les variables.
exemple -
$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;
}
une solution que j'ai trouvée en jouant est de faire:
if($x=&$_GET["myvar"] == "something")
{
// do stuff with $x
}
<?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)
c'est semblable à la réponse acceptée, mais utilise in_array
à la place. Je préfère utiliser empty()
dans cette situation. Je suggère également d'utiliser la nouvelle déclaration shorthand array qui est disponible en PHP 5.4.0 +.
$allowed = ["something","nothing"];
if(!empty($_GET['myvar']) && in_array($_GET['myvar'],$allowed)){..}
Voici une fonction pour vérifier plusieurs valeurs à la fois.
$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;
}
Eh bien, vous pourriez obtenir avec juste if($_GET['myvar'] == 'something')
puisque cette condition présume que la variable existe également. Si ce n'est pas le cas, l'expression donnera aussi false
.
je pense qu'il est correct de faire ceci à l'intérieur des déclarations conditionnelles comme ci-dessus. Pas de mal à cela, vraiment.
pas de référence officielle mais ça a fonctionné quand j'ai essayé ceci:
if (isset($_GET['myvar']) == 'something')