43

I've seen a lot of php code that does the following to check whether a string is valid by doing:

$str is a string variable.

if (!isset($str) || $str !== '') {
 // do something
}

I prefer to just do

if (strlen($str) > 0) {
 // something
}

Is there any thing that can go wrong with the second method? Are there any casting issues I should be aware of?

asked Dec 25, 2010 at 19:00
8
  • 4
    Um.. php.net/manual/en/function.empty.php? Commented Dec 25, 2010 at 19:04
  • Good points. I should be aware of strings with trailing whitespaces Commented Dec 25, 2010 at 19:06
  • 1
    yup, there is. An error would be thrown if $str is undefined. Commented Dec 25, 2010 at 19:07
  • 2
    You're also presuming in the 2nd method that $str is previously defined - if not, you'll get an 'undefined variable' notice. The use of isset() in the first method checks this. Commented Dec 25, 2010 at 19:07
  • @richsage no, not isset(), but empty(). Commented Dec 25, 2010 at 19:07

9 Answers 9

54

Since PHP will treat a string containing a zero ('0') as empty, it makes the empty() function an unsuitable solution.

Instead, test that the variable is explicitly not equal to an empty string:

$stringvar !== ''

As the OP and Gras Double and others have shown, the variable should also be checked for initialization to avoid a warning or error (depending on settings):

isset($stringvar)

This results in the more acceptable:

if (isset($stringvar) && $stringvar !== '') {
}

PHP has a lot of bad conventions. I originally answered this (over 9 years ago) using the empty() function, as seen below. I've long since abandoned PHP, but since this answer attracts downvotes and comments every few years, I've updated it. Should the OP wish to change the accepted answer, please do so.

Original Answer:

if(empty($stringvar))
{
 // do something
}

You could also add trim() to eliminate whitespace if that is to be considered.

Edit:

Note that for a string like '0', this will return true, while strlen() will not.

answered Dec 25, 2010 at 19:04
Sign up to request clarification or add additional context in comments.

7 Comments

is there any different between if(empty(trim($str))) and if (strlen(trim($strim))> 0) ?
Yes. Consider the string '0' on which empty() will return true while strlen() will not.
This is worse than strlen( $str ) > 0 because it considers "0" to be an empty string.
@ToolmakerSteve I've edited this (again) to hopefully avoid having any newcomers stumble upon the horrific mistakes made 9+ years ago.
|
16

You need isset() in case $str is possibly undefined:

if (isset($str) && $str !== '') {
 // variable set, not empty string
}

Using !empty() would have an important caveat: the string '0' evaluates to false.


Also, sometimes one wants to check, in addition, that $str is not something falsy, like false or null[1]. The previous code doesn't handle this. It's one of the rare situations where loose comparison may be useful:

if (isset($str) && $str != '') {
 // variable set, not empty string, not falsy
}

The above method is interesting as it remains concise and doesn't filter out '0'. But make sure to document your code if you use it.

Otherwise you can use this equivalent but more verbose version:

if (isset($str) && (string) $str !== '') {
 // variable set, not empty string, not falsy
}


Of course, if you are sure $str is defined, you can omit the isset($str) from the above codes.


Finally, considering that '' == false, '0' == false, but '' != '0', you may have guessed it: PHP comparisons aren't transitive (fun graphs included).


[1] Note that isset() already filters out null.

answered Apr 25, 2014 at 22:01

Comments

10

This will safely check for a string containing only whitespace:

// Determines if the supplied string is an empty string. 
// Empty is defined as null or containing only whitespace. 
// '0' is NOT an empty string! 
function isEmptyString($str) {
 return !(isset($str) && (strlen(trim($str)) > 0));
}
answered Aug 17, 2014 at 0:35

Comments

4

What about this:

if( !isset($str[0]) )
 echo "str is NULL or an empty string";

I found it on PHP manual in a comment by Antone Roundy

I posted it here, because I did some tests and it seems to work well, but I'm wondering if there is some side effect I'm not considering. Any suggestions in comments here would be appreciated.

Gras Double
16.5k9 gold badges61 silver badges56 bronze badges
answered Feb 21, 2012 at 18:46

3 Comments

Note this method also supports '0', false, null (gives respectively true, false, false) as in the loose comparison == '' stuff in my answer.
@GrasDouble: yep, you are right. The problem would be ehn string is '0'
There was a misunderstanding. I meant your code considers '0' to be a non-empty string, just like any other string. So it's working fine actually :)
2

According to PHP empty() doc (https://www.php.net/empty):

Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

Instead, use trim($name) == false.

answered May 8, 2014 at 3:56

1 Comment

No wonder my empty code is always return error in PHP 5.3. Thanks.
2

This simple old question is still tricky.

strlen($var) works perfectly ONLY if you're absolutely sure the $var is a string.

isset($var) and empty($var) result are based on type of the variable, and could be tricky at some cases (like empty string ""). View the table in this page for more details.

UPDATE

There are actually 2 cases for this question:

Case 1: You're sure that your variable is always going to be a "string":

In this case, just test the length:

if(strlen($str) > 0) {
 // do something..
}

Case 2: Your variable may and may not be a "string":

In this case, it depends on what you want to do. For me (most of the time), if it's not a string then I validate it as "false". You can do it this way:

if(is_string($var) && $var !== '') {// true only if it's a string AND is not empty
 // do something ...
}

And to make it shorter and in 1 condition instead of 2 (specially useful if you're testing more than 1 string in same if condition), I made it into function:

function isNonEmptyString($var) {
 return is_string($var) && $var !== '';
}
// Somewhere else..
// Reducing conditions to half
if(isNonEmptyString($var1) && isNonEmptyString($var2) && isNonEmptyString($var3)) {
 // do something
}
answered Aug 14, 2017 at 6:45

Comments

1

If your variable $str is not defined then your strlen() method will throw an exception. That is the whole purpose of using isset() first.

answered Mar 21, 2014 at 17:27

Comments

0

trimming the string will also help if there are string with white spaces.

if (isset($str) && trim($str) !== '') {
 // code
}
answered May 30, 2021 at 7:48

Comments

-3

I think not, because strlen (string lenght) returns the lenght (integer) of your $str variable. So if the variable is empty i would return 0. Is 0 greater then 0. Don't think so. But i think the first method might be a little more safer. Because it checks if the variable is init, and if its not empty.

answered Dec 25, 2010 at 19:05

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.