Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)?

like image 560
rjmunro Avatar asked Jul 21 '10 12:07

rjmunro


People also ask

What does die () do in PHP?

die() function in PHP The die() function prints a message and exits the current script.

How do I ignore PHP errors?

Prepend functions with the '@' symbol to suppress certain errors, as opposed to turning off all error reporting. PHP supports one error control operator: the at sign (@). When prepended to an expression in PHP, any error messages that might be generated by that expression will be ignored.

Is die () and exit () functions in PHP do the exact same thing give an example?

?> Note: The output for the above program will be an empty screen because it is similar to exit(), die() can print only string values. The exit() method is only used to exit the process. The die() function is used to print the message.

Which character can be used to suppress errors in PHP?

PHP supports the @ error control operator (also called STFU operator with mixed feelings), that suppresses errors just for the expression that immediately follows. For example, the unlink function emits a warning if the file does not exist, and calling it with the @ operator can suppress these errors.


3 Answers

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.

like image 162
BoltClock Avatar answered Sep 27 '22 20:09

BoltClock


The reason actually occurred to me shortly after asking the question. It's about operator precedence. The = happens before the or, so:

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

is equivalent to:

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

not:

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

as it would be in Python. So this:

$a = false or true;

will set $a to false, not true, which is bound to catch me out at some point in the future.

like image 43
rjmunro Avatar answered Sep 27 '22 22:09

rjmunro


Why should or return anything? or is a normal boolean operator. $a or $b is true if either $a or $b evaluates to true and false otherwise.

The difference between || and or is, that or has a lower operator precedance, even lower than =. This is why

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

is same as

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

whereas

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

is same as

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

In your case

echo $name or "Anonymous";

gets

(echo $name) or ("Anonymous");

What you are looking for probably is the ternary operator:

echo $name ?: 'Anonymous';

The above will work as of PHP 5.3, if you have only PHP 5.2 use:

echo $name ? $name : 'Anonymous';
like image 40
NikiC Avatar answered Sep 27 '22 20:09

NikiC