Search code examples
phpboolean-operations

Using 'or die()' to stop on errors in PHP


Often in PHP, I see:

$result = mysql_query($query) or die();

Coming from python, I know why this should work, because or returns the first value if it is true in a boolean context, and the second value otherwise (see this).

But when I try the above technique in PHP in another context, for example something like:

$name = "John Doe";
echo $name or "Anonymous";

The or doesn't return the first value ("John Doe"), it returns 1.

Why does this work in the mysql_query() result case, but not in other cases? Is it bad to use in a mysql_query() case (ignore the fact that I am not returning a useful error to the user)?


Solution

  • In PHP, variable assignment (the equals sign) and functions both take precedence over the or operator. That means a function gets executed first, then the return value of the function is used in the or comparison. In turn when you use two values/variables together with an or operator, it compares the two values first then returns a Boolean value.

    Therefore, the order of evaluation in this example is:

    $result = mysql_query($query) or die();
    
    1. mysql_query($query)
      Returns either a result set for DQL queries such as SELECT, or a Boolean value for DDL, DML or DCL queries such as CREATE, DROP, INSERT, UPDATE, DELETE and ALTER.

    2. $result = mysql_query($query)
      The result of this query execution is assigned to the variable $result.

    3. $result /* = ... */ or die();
      If it's either a result set or true, it's considered true (aka "truthy") so the or condition is satisfied and the statement ends here. Otherwise the script would die() instead.


    echo is a language construct and therefore doesn't actually return a value, so it doesn't run like a function before the or comparison is made.

    As $name or "Anonymous" is always true because the string "Anonymous" is non-empty and therefore truthy, the echo implicitly converts true to 1, hence that output.

    The order of evaluation in this example is:

    $name = "John Doe";
    echo $name or "Anonymous";
    
    1. $name = "John Doe";
      Pretty straightforward — assigns the string John Doe to $name.

    2. $name or "Anonymous"
      PHP discovers that $name contains the string John Doe, so what ends up being evaluated is the following:

    3. "John Doe" or "Anonymous"
      Since at least one string is non-empty here, it's considered truthy and the condition is satisfied. This evaluation then returns true.

    4. echo true /* $name or... */;
      Converts true to 1 and prints the number 1.