tags:

views:

4015

answers:

4

Since PHP is a dynamic language what's the best way of checking to see if a provided field is empty?

I want to ensure that:

  1. null is considered an empty string
  2. a white space only string is considered empty
  3. that "0" is not considered empty

This is what I've got so far:

$question = trim($_POST['question']);

if ("" === "$question") {
    // Handle error here
}

There must be a simpler way of doing this?

+7  A: 
function IsNullOrEmptyString($question){
    return (!isset($question) || trim($question)==='')
}
Michael Haren
Although this solves it, I'm not sure if it's simpler. +1 anyway
Allain Lalonde
Since OP is asking for a 'simpler' version of an extremely simple operation, I'm going to say that 'better' is what's actually warranted.
chaos
I turned it into a function. this should make your validation code simpler
Michael Haren
Using a function is the best way to simplify this, I do the same exact thing
TravisO
what is the purpose of !isset() here? how is it different to is_null()?
nickf
+1  A: 

There is no better way but since it's an operation you usually do quite often, you'd better automatize the process.

Most frameworks offer a way to make arguments parsing an easy task. You can build you own object for that. Quick and dirty example :

class Request
{

    // This is the spirit but you may want to make that cleaner :-)
    function get($key, $default=null, $from=null)
    {
         if ($from) :
             if (isset(${'_'.$from}[$key]));
                return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
         else
             if isset($_REQUEST[$key])
                return sanitize($_REQUEST[$key]);

         return $default;
    }

    // basics. Enforce it with filters according to your needs
    function sanitize($data)
    {
          return addslashes(trim($data));
    }

    // your rules here
    function isEmptyString($data)
    {
        return (trim($data) === "" or $data === null);
    }


    function exists($key) {}

    function setFlash($name, $value) {}

    [...]

}

$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);

Symfony use that kind of sugar massively.

But you are talking about more than that, with your "// Handle error here ". You are mixing 2 jobs : getting the data and processing it. This is not the same at all.

There are other mechanisms you can use to validate data. Again, frameworks can show you best pratices.

Create objects that represent the data of your form, then attach processses and fall back to it. It sounds far more work that hacking a quick PHP script (and it is the first time), but it's reusable, flexible, and much less error prone since form validation with usual PHP tends to quickly become spaguetti code.

e-satis
You did the exact opposite of what he wanted... simplicity.
TravisO
+1  A: 

Beware false negatives from the trim() function — it performs a cast-to-string before trimming, and thus will return e.g. "Array" if you pass it an empty array. That may not be an issue, depending on how you process your data, but with the code you supply, a field named question[] could be supplied in the POST data and appear to be a non-empty string. Instead, I would suggest:

$question = $_POST['question'];

if (!is_string || ($question = trim($question))) {
    // Handle error here
}

// If $question was a string, it will have been trimmed by this point
Ben Blank
Id say if you get an array where you expected a string it should be an error. If you expect an array then you should have a separate filtering function for that.
OIS
+1  A: 

Old post but someone might need it as I did ;)

if (strlen($str) == 0){ do what ever }

replace $str with your variable. NULL and "" both return 0 when using strlen.

jrowe
if (strlen($str) == 0){ do what ever } ; //i guess you mean
zzapper