web-dev-qa-db-fra.com

PHP: Vérifier si la variable existe mais aussi si a une valeur égale à quelque chose

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.

35
Mariz Melo

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
}
18
mellowsoon

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.

12
James Hastings-Trew

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
3
Nick

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 :)

1
Victor

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

Merci Mellowsoon et Pekka, j'ai fait quelques recherches ici et j'ai trouvé ceci:

  • Vérifiez et déclarez chaque variable comme nulle (si c'est le cas) avant de commencer à utiliser (comme recommandé):
! 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

  • Utilisation du 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: 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; 
0
Mariz Melo
<?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) 
0
keithics

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.)

0
Pekka 웃

Une solution que j'ai trouvée en jouant est de faire:

if($x=&$_GET["myvar"] == "something")
{
    // do stuff with $x
}
0
Sheldon Juncker

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

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

0
windmaomao