41

I have (or not) a variable $_GET['myvar'] coming from my query string and I want to check if this variable exists and also if the value corresponds to something inside my if statement:

What I'm doing and think is not the best way to do:

if(isset($_GET['myvar']) && $_GET['myvar'] == 'something'): do something

My question is, exist any way to do this without declare the variable twice?

That is a simple case but imagine have to compare many of this $myvar variables.

Michael Irigoyen
  • 21,233
  • 17
  • 82
  • 125
Mariz Melo
  • 740
  • 1
  • 11
  • 18
  • 2
    PHP doesn't have a solution for this, but it's a programming language. You can (and ought to) always write a subprogram to shorten a repetitive code. Not to mention that in a good program every variable should be defined before use... – Your Common Sense Oct 24 '10 at 10:09

13 Answers13

18

Sadly that's the only way to do it. But there are approaches for dealing with larger arrays. For instance something like this:

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));

The variable $missing now contains a list of values that are required, but missing from the $_GET array. You can use the $missing array to display a message to the visitor.

Or you can use something like that:

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
    $_GET[$m] = null;
}

Now each required element at least has a default value. You can now use if($_GET['myvar'] == 'something') without worrying that the key isn't set.

Update

One other way to clean up the code would be using a function that checks if the value is set.

function getValue($key) {
    if (!isset($_GET[$key])) {
        return false;
    }
    return $_GET[$key];
}

if (getValue('myvar') == 'something') {
    // Do something
}
mellowsoon
  • 18,863
  • 18
  • 51
  • 73
16

If you're looking for a one-liner to check the value of a variable you're not sure is set yet, this works:

if ((isset($variable) ? $variable : null) == $value) { }

The only possible downside is that if you're testing for true/false - null will be interpreted as equal to false.

trincot
  • 211,288
  • 25
  • 175
  • 211
15

As of PHP7 you can use the Null Coalescing Operator ?? to avoid the double reference:

$_GET['myvar'] = 'hello';
if (($_GET['myvar'] ?? '') == 'hello') {
    echo "hello!";
}

Output:

hello!

In general, the expression

$a ?? $b

is equivalent to

isset($a) ? $a : $b
Nick
  • 118,076
  • 20
  • 42
  • 73
1

As mellowsoon suggest, you might consider this approach:

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

You put the default values and set the not recieved parameters to a default value :)

Victor
  • 3,348
  • 2
  • 29
  • 55
0

I use all time own useful function exst() which automatically declare variables.

Example -

$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;
}
user2253362
  • 71
  • 1
  • 3
0

A solution that I have found from playing around is to do:

if($x=&$_GET["myvar"] == "something")
{
    // do stuff with $x
}
Sheldon Juncker
  • 497
  • 1
  • 5
  • 17
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) 
keithics
  • 7,560
  • 2
  • 43
  • 32
0

This is similar to the accepted answer, but uses in_array instead. I prefer to use empty() in this situation. I also suggest using the new shorthand array declaration which is available in PHP 5.4.0+.

$allowed = ["something","nothing"];
if(!empty($_GET['myvar']) && in_array($_GET['myvar'],$allowed)){..}

Here is a function for checking multiple values at once.

$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;
}
EternalHour
  • 7,327
  • 6
  • 31
  • 54
0

My question is, exist any way to do this without declare the variable twice?

No, there is no way to do this correctly without doing two checks. I hate it, too.

One way to work around it would be to import all relevant GET variables at one central point into an array or object of some sort (Most MVC frameworks do this automatically) and setting all properties that are needed later. (Instead of accessing request variables across the code.)

Community
  • 1
  • 1
Pekka
  • 418,526
  • 129
  • 929
  • 1,058
  • Just define all your variables. That's the point of all that mess. – Your Common Sense Oct 24 '10 at 10:05
  • Thank you Pekka, is really very boring do that. – Mariz Melo Oct 24 '10 at 10:14
  • Sometimes in a big system is difficult predict when the variable will appear, that why declare the variable may not help. But you're right in most of the cases. – Mariz Melo Oct 24 '10 at 10:15
  • 2
    @Mariz I disagree: It should never be difficult to predict when the variable will appear: If that is the case, you have bad code. – Pekka Oct 24 '10 at 10:17
  • Pekka this is the "ideal", but that is difficult in a rush world with people from different background working in the same project. Anyway thanks people. – Mariz Melo Oct 24 '10 at 10:31
0

Thanks Mellowsoon and Pekka, I did some research here and come up with this:

  • Check and declare each variable as null (if is the case) before start to use (as recommended):
!isset($_GET['myvar']) ? $_GET['myvar'] = 0:0;

*ok this one is simple but works fine, you can start to use the variable everywhere after this line

  • Using array to cover all cases:
$myvars = array( 'var1', 'var2', 'var3');
foreach($myvars as $key)
    !isset($_GET[$key]) ? $_GET[$key] =0:0;

*after that you are free to use your variables (var1, var2, var3 ... etc),

PS.: function receiving a JSON object should be better (or a simple string with separator for explode/implode);

... Better approaches are welcome :)


UPDATE:

Use $_REQUEST instead of $_GET, this way you cover both $_GET and $_POST variables.

!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
Mariz Melo
  • 740
  • 1
  • 11
  • 18
0

why not create a function for doing this, convert the variable your want to check into a real variable, ex.

function _FX($name) { 
  if (isset($$name)) return $$name;
  else return null; 
}

then you do _FX('param') == '123', just a thought

Alfred
  • 19,306
  • 58
  • 155
  • 232
windmaomao
  • 2,913
  • 23
  • 20
-1

Well, you could get by with just if($_GET['myvar'] == 'something') since that condition presumes that the variable also exists. If it doesn't, the expression will also result in false.

I think it's ok to do this inside conditional statements like above. No harm done really.

DanMan
  • 10,431
  • 3
  • 36
  • 57
  • And it fires a notice, if the myvar index doesn't exist. – erenon Oct 24 '10 at 12:30
  • 1
    True, but you're just testing for that index. IMHO it would only be really bad, if that if-clause didn't exist at all. A notice i can live with. After all, it's just a notice, which by definition are harmless (usually). – DanMan Oct 24 '10 at 12:35
  • 1
    Oof, I couldn't disagree more. If your goal is to create a sloppy PHP codebase full of sneaky/silent bugs, ignoring notices would be a great way to start. You should always develop with notices turned on, and you should always treat them as bugs to be fixed. – Ross Snyder Oct 24 '10 at 21:38
-3

No official reference but it worked when I tried this:

if (isset($_GET['myvar']) == 'something')
zafer
  • 1