PHP: Testing Variables for Values using isset()
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:
The PHP: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>
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.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....");
}
?>
Point?
Don't use isset() to test $_GET[] or $_POST[] values......
















Email Blog Entry