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 .

29
demandé sur Michael Irigoyen 2010-10-24 13:51:56

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
}
16
répondu mellowsoon 2010-10-24 10:17:25

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 .

7
répondu James Hastings-Trew 2016-08-18 17:37:07

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

1
répondu Victor 2011-10-05 13:36:59

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

0
répondu Pekka 웃 2017-05-23 12:02:36

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;
0
répondu Mariz Melo 2010-10-24 21:33:26

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

0
répondu windmaomao 2012-08-15 11:01:24

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;
}
0
répondu user2253362 2013-04-10 12:01:14

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

if($x=&$_GET["myvar"] == "something")
{
    // do stuff with $x
}
0
répondu Sheldon Juncker 2013-12-14 01:36:07
<?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
répondu keithics 2014-03-14 14:34:07

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;
}
0
répondu EternalHour 2014-11-11 20:56:08

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.

-1
répondu DanMan 2010-10-24 12:33:28

pas de référence officielle mais ça a fonctionné quand j'ai essayé ceci:

if (isset($_GET['myvar']) == 'something')
-3
répondu zafer 2014-03-04 21:40:58