View RSS Feed

Jordan

PHP: Testing Variables for Values using isset()

Rate this Entry
by , 02-16-2009 at 10:47 AM (1164 Views)
A recent blog post got me thinking about the various ways to test variables in PHP. There are several functions that do this:

The Methods

  • isset()
  • is_null()
  • empty()
  • boolean (if ($var) )


How they Compare:
<table class="doctable table"><thead valign="middle"><tr valign="middle"><th>Expression</th> <th>gettype()</th> <th>empty()</th> <th>is_null()</th> <th>isset()</th> <th>boolean : if($x)</th> </tr> </thead> <tbody class="tbody" valign="middle"> <tr valign="middle"> <td align="left">$x = "";</td> <td align="left">string</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = null;</td> <td align="left">NULL</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left">var $x;</td> <td align="left">NULL</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left"><var class="varname">$x</var> is undefined</td> <td align="left">NULL</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = array();</td> <td align="left">array</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = false;</td> <td align="left">boolean</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = true;</td> <td align="left">boolean</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = 1;</td> <td align="left">integer</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = 42;</td> <td align="left">integer</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = 0;</td> <td align="left">integer</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = -1;</td> <td align="left">integer</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = "1";</td> <td align="left">string</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = "0";</td> <td align="left">string</td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = "-1";</td> <td align="left">string</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = "php";</td> <td align="left">string</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = "true";</td> <td align="left">string</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> </tr> <tr valign="middle"> <td align="left">$x = "false";</td> <td align="left">string</td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">FALSE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td> <td align="left"><tt class="constant">TRUE</tt></td></tr></tbody></table>
Copied directly from: http://www.php.net/manual/en/types.comparisons.php

What is the point?
Notice the differences? Using isset() on an empty string will return true while comparing it in a boolean will return false. Not what you expected, is it? This means that using isset() to test the value of $_GET can cause unexpected results.

Let's say you execute PHPScript.php?x=3&subject=

x was a hidden form value that equals 3 and subject would be a text box input. The user leaves the subject blank but isset() will always return true, that it is set.

Case and Point
To prove my point I created a sample, the HTML form and a PHP script to test the value:

The Form:
HTML Code:
<html>
<head>
	<title>WebmasterTalkForums Testing</title>
</head>
<body>
<form action="test_form.php" method="GET">
	<input type="hidden" name="x" value="3" />
	<input type="text" name="subject" />

	<input type="submit" value="Go" />
</form>

</body>
</html>
The PHP:
PHP Code:
 /**
 * Test our variables and then print
 * them out
 */
if (isset($_GET["x"])) {
    echo 
"x is set to {$_GET["x"]} 
"
;
} else {
    die(
"x was not set, die....");
}

if (isset(
$_GET["subject"])) {
    echo 
"subject is set to {$_GET["subject"]} 
"
;
} else {
    
/*
     * You will never see this messages because
     * subject will always return true with isset()
     * and collecting the value from the super-global
     * $_GET
     */
    
die("subject was not set, die....");
}

?> 
If you read my comment from above in the second conditional test, the else clause will never be executed when submitting from the form. subject will always be "" or contain a valid value.

Point?
Don't use isset() to test $_GET[] or $_POST[] values......

Submit "PHP: Testing Variables for Values using isset()" to Digg Submit "PHP: Testing Variables for Values using isset()" to del.icio.us Submit "PHP: Testing Variables for Values using isset()" to StumbleUpon Submit "PHP: Testing Variables for Values using isset()" to Google

Updated 10-27-2010 at 08:25 PM by Jordan

Tags: None Add / Edit Tags
Categories
Uncategorized