J'ai (ou pas) 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 dans mon instruction if:
Ce que je fais et je pense n'est pas la meilleure façon de le faire:
if(isset($_GET['myvar']) && $_GET['myvar'] == 'something')
: faire quelque chose
Ma question est, existe-t-il un moyen de le faire sans déclarer la variable deux fois?
C'est un cas simple, mais imaginez devoir comparer plusieurs de ces variables $myvar
.
Malheureusement, c'est la seule façon de le faire. Mais il existe des approches pour gérer des tableaux plus grands. Par exemple quelque chose comme ça:
$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
La variable $ manquante contient maintenant une liste de valeurs requises, mais absentes du tableau $ _GET. Vous pouvez utiliser le tableau $ manquant 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;
}
Désormais, chaque élément requis a au moins une valeur par défaut. Vous pouvez maintenant utiliser if ($ _ GET ['myvar'] == 'quelque chose') sans vous soucier que la clé n'est 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 recherchez une ligne unique pour vérifier la valeur d'une variable dont vous n'êtes pas sûr qu'elle soit encore 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
.
Depuis PHP7, vous pouvez utiliser Null Coalescing Operator??
pour éviter la double référence:
$_GET['myvar'] = 'hello';
if (($_GET['myvar'] ?? '') == 'hello') {
echo "hello!";
}
Production:
hello!
En général, l'expression
$a ?? $b
est équivalent à
isset($a) ? $a : $b
Comme le suggère mellowsoon, vous pourriez envisager 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 reçus sur une valeur par défaut :)
J'utilise toute la fonction utile de tous les temps 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;
}
Merci Mellowsoon et Pekka, j'ai fait quelques recherches ici et j'ai trouvé ceci:
! isset ($ _ GET ['myvar'])? $ _GET ['myvar'] = 0: 0;
* ok celui-ci est simple mais fonctionne bien, vous pouvez commencer à utiliser la variable partout après cette ligne
$ 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: la fonction recevant un objet JSON devrait être meilleure (ou une simple chaîne avec séparateur pour exploser/imploser);
... 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;
<?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)
Ma question est, existe-t-il un moyen de le faire sans déclarer la variable deux fois?
Non, il n'y a aucun moyen de le faire correctement sans effectuer deux vérifications. Je déteste ça aussi.
Une façon de contourner ce problème serait d'importer toutes les variables GET pertinentes à un point central dans un tableau ou un objet quelconque (la plupart des frameworks MVC le font automatiquement) et de définir toutes les propriétés nécessaires ultérieurement. (Au lieu d'accéder aux variables de demande dans le code.)
Une solution que j'ai trouvée en jouant est de faire:
if($x=&$_GET["myvar"] == "something")
{
// do stuff with $x
}
Ceci est similaire à la réponse acceptée, mais utilise à la place in_array
. Je préfère utiliser empty()
dans cette situation. Je suggère également d'utiliser la nouvelle déclaration de tableau abrégé qui est disponible dans PHP 5.4. +.
$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;
}
pourquoi ne pas créer une fonction pour cela, convertir la variable que vous voulez vérifier en une vraie variable, ex.
function _FX($name) {
if (isset($$name)) return $$name;
else return null;
}
alors vous faites _FX('param') == '123'
, juste une pensée