Reference – What does this error mean in PHP?
What is this?
This is a number of answers about warnings, errors, and notices you might encounter while programming PHP and have no clue how to fix them. This is also a Community Wiki, so everyone is invited to participate adding to and maintaining this list.
Why is this?
Questions like “Headers already sent” or “Calling a member of a non-object” pop up frequently on Stack Overflow. The root cause of those questions is always the same. So the answers to those questions typically repeat them and then show the OP which line to change in their particular case. These answers do not add any value to the site because they only apply to the OP’s particular code. Other users having the same error cannot easily read the solution out of it because they are too localized. That is sad because once you understood the root cause, fixing the error is trivial. Hence, this list tries to explain the solution in a general way to apply.
What should I do here?
If your question has been marked as a duplicate of this one, please find your error message below and apply the fix to your code. The answers usually contain further links to investigate in case it shouldn’t be clear from the general answer alone.
If you want to contribute, please add your “favorite” error message, warning or notice, one per answer, a short description what it means (even if it is only highlighting terms to their manual page), a possible solution or debugging approach and a listing of existing Q&A that are of value. Also, feel free to improve any existing answers.
The List
- Nothing is seen. The page is empty and white. (also known as White Page/Screen Of Death)
- Code doesn’t run/what looks like parts of my PHP code are output
- Warning: Cannot modify header information – headers already sent
- Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given a.k.a.
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource a.k.a.
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given (or similar variations) - Warning: [function] expects parameter 1 to be resource, boolean given
- Warning: [function]: failed to open stream: [reason]
- Warning: open_basedir restriction in effect
- Warning: Division by zero
- Warning: Illegal string offset ‘XXX’
- Warning: count(): Parameter must be an array or an object that implements Countable
- Parse error: syntax error, unexpected ‘[‘
- Parse error: syntax error, unexpected T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
- Parse error: syntax error, unexpected ‘require_once’ (T_REQUIRE_ONCE), expecting function (T_FUNCTION)
- Parse error: syntax error, unexpected T_VARIABLE
- Fatal error: Allowed memory size of XXX bytes exhausted (tried to allocate XXX bytes)
- Fatal error: Call to a member function … on a non-object or null
- Fatal Error: Call to Undefined function XXX
- Fatal Error: Cannot redeclare XXX
- Fatal error: Can’t use function return value in write context
- Fatal error: Declaration of AAA::BBB() must be compatible with that of CCC::BBB()‘
- Fatal error: Using $this when not in object context
- Fatal error: Object of class Closure could not be converted to string
- Fatal error: Undefined class constant
- Notice: Array to string conversion
- Notice: Trying to get property of non-object error
- Notice: Undefined variable or property
- Notice: Undefined Index
- Notice: Undefined offset XXX [Reference]
- Notice: Uninitialized string offset: XXX
- Notice: Use of undefined constant XXX – assumed ‘XXX’
- MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near … at line …
- Strict Standards: Non-static method [<class>::<method>] should not be called statically
- Warning: function expects parameter X to be boolean/string/integer
- HTTP Error 500 – Internal server error
- Deprecated: Array and string offset access syntax with curly braces is deprecated
Also, see:
Warning: Cannot modify header information – headers already sent
Happens when your script tries to send an HTTP header to the client but there already was output before, which resulted in headers to be already sent to the client.
This is an E_WARNING
and it will not stop the script.
A typical example would be a template file like this:
<html> <?php session_start(); ?> <head><title>My Page</title> </html> ...
The session_start()
function will try to send headers with the session cookie to the client. But PHP already sent headers when it wrote the <html>
element to the output stream. You’d have to move the session_start()
to the top.
You can solve this by going through the lines before the code triggering the Warning and check where it outputs. Move any header sending code before that code.
An often overlooked output is new lines after PHP’s closing ?>
. It is considered a standard practice to omit ?>
when it is the last thing in the file. Likewise, another common cause for this warning is when the opening <?php
has an empty space, line, or invisible character before it, causing the web server to send the headers and the whitespace/newline thus when PHP starts parsing won’t be able to submit any header.
If your file has more than one <?php ... ?>
code block in it, you should not have any spaces in between them. (Note: You might have multiple blocks if you had code that was automatically constructed)
Also make sure you don’t have any Byte Order Marks in your code, for example when the encoding of the script is UTF-8 with BOM.
Related Questions:
Fatal error: Call to a member function … on a non-object
Happens with code similar to xyz->method()
where xyz
is not an object and therefore that method
can not be called.
This is a fatal error which will stop the script (forward compatibility notice: It will become a catchable error starting with PHP 7).
Most often this is a sign that the code has missing checks for error conditions. Validate that an object is actually an object before calling its methods.
A typical example would be
// ... some code using PDO $statement = $pdo->prepare('invalid query', ...); $statement->execute(...);
In the example above, the query cannot be prepared and prepare()
will assign false
to $statement
. Trying to call the execute()
method will then result in the Fatal Error because false
is a “non-object” because the value is a boolean.
Figure out why your function returned a boolean instead of an object. For example, check the $pdo
object for the last error that occurred. Details on how to debug this will depend on how errors are handled for the particular function/object/class in question.
If even the ->prepare
is failing then your $pdo
database handle object didn’t get passed into the current scope. Find where it got defined. Then pass it as a parameter, store it as property, or share it via the global scope.
Another problem may be conditionally creating an object and then trying to call a method outside that conditional block. For example
if ($someCondition) { $myObj = new MyObj(); } // ... $myObj->someMethod();
By attempting to execute the method outside the conditional block, your object may not be defined.
Related Questions:
Nothing is seen. The page is empty and white.
Also known as the White Page Of Death or White Screen Of Death. This happens when error reporting is turned off and a fatal error (often syntax error) occurred.
If you have error logging enabled, you will find the concrete error message in your error log. This will usually be in a file called “php_errors.log”, either in a central location (e.g. /var/log/apache2
on many Linux environments) or in the directory of the script itself (sometimes used in a shared hosting environment).
Sometimes it might be more straightforward to temporarily enable the display of errors. The white page will then display the error message. Take care because these errors are visible to everybody visiting the website.
This can be easily done by adding at the top of the script the following PHP code:
ini_set('display_errors', 1); error_reporting(~0);
The code will turn on the display of errors and set reporting to the highest level.
Since the ini_set()
is executed at runtime it has no effects on parsing/syntax errors. Those errors will appear in the log. If you want to display them in the output as well (e.g. in a browser) you have to set the display_startup_errors
directive to true
. Do this either in the php.ini
or in a .htaccess
or by any other method that affects the configuration before runtime.
You can use the same methods to set the log_errors and error_log directives to choose your own log file location.
Looking in the log or using the display, you will get a much better error message and the line of code where your script comes to halt.
Related questions:
- PHP’s white screen of death
- White screen of death!
- PHP Does Not Display Error Messages
- PHP emitting 500 on errors – where is this documented?
- How to get useful error messages in PHP?
- All PHP “White Page of Death” Questions on Stackoverflow
Related errors:
Notice: Undefined Index
Happens when you try to access an array by a key that does not exist in the array.
A typical example of an Undefined Index
notice would be (demo)
$data = array('foo' => '42', 'bar'); echo $data['spinach']; echo $data[1];
Both spinach
and 1
do not exist in the array, causing an E_NOTICE
to be triggered.
The solution is to make sure the index or offset exists prior to accessing that index. This may mean that you need to fix a bug in your program to ensure that those indexes do exist when you expect them to. Or it may mean that you need to test whether the indexes exist using array_key_exists
or isset
:
$data = array('foo' => '42', 'bar'); if (array_key_exists('spinach', $data)) { echo $data['spinach']; } else { echo 'No key spinach in the array'; }
If you have code like:
<?php echo $_POST['message']; ?> <form method="post" action=""> <input type="text" name="message"> ...
then $_POST['message']
will not be set when this page is first loaded and you will get the above error. Only when the form is submitted and this code is run a second time will the array index exist. You typically check for this with:
if ($_POST) .. // if the $_POST array is not empty // or if ($_SERVER['REQUEST_METHOD'] == 'POST') .. // page was requested with POST
Related Questions:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given
First and foremost:
Please, don’t use
mysql_*
functions in new code. They are no longer maintained and are officially deprecated. See the red box? Learn about prepared statements instead, and use PDO or MySQLi – this article will help you decide which. If you choose PDO, here is a good tutorial.
This happens when you try to fetch data from the result of mysql_query
but the query failed.
This is a warning and won’t stop the script, but will make your program wrong.
You need to check the result returned by mysql_query
by
$res = mysql_query($sql); if (!$res) { die(mysql_error()); } // after checking, do the fetch
Related Questions:
- mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
- All “mysql_fetch_array() expects parameter 1 to be resource, boolean given” Questions on Stackoverflow
Related Errors:
Other mysql*
functions that also expect a MySQL result resource as a parameter will produce the same error for the same reason.
Fatal error: Using $this when not in object context
$this
is a special variable in PHP which can not be assigned. If it is accessed in a context where it does not exist, this fatal error is given.
This error can occur:
-
If a non-static method is called statically. Example:
class Foo { protected $var; public function __construct($var) { $this->var = $var; } public static function bar () { // ^^^^^^ echo $this->var; // ^^^^^ } } Foo::bar();
How to fix: review your code again,
$this
can only be used in an object context, and should never be used in a static method. Also, a static method should not access the non-static property. Useself::$static_property
to access the static property. -
If code from a class method has been copied over into a normal function or just the global scope and keeping the
$this
special variable.
How to fix: Review the code and replace$this
with a different substitution variable.
Related Questions:
- Call non-static method as static: PHP Fatal error: Using $this when not in object context
- Copy over code: Fatal error: Using $this when not in object context
- All “Using $this when not in object context” Questions on Stackoverflow
Fatal error: Call to undefined function XXX
Happens when you try to call a function that is not defined yet. Common causes include missing extensions and includes, conditional function declaration, function in a function declaration or simple typos.
Example 1 – Conditional Function Declaration
$someCondition = false; if ($someCondition === true) { function fn() { return 1; } } echo fn(); // triggers error
In this case, fn()
will never be declared because $someCondition
is not true.
Example 2 – Function in Function Declaration
function createFn() { function fn() { return 1; } } echo fn(); // triggers error
In this case, fn
will only be declared once createFn()
gets called. Note that subsequent calls to createFn()
will trigger an error about Redeclaration of an Existing function.
You may also see this for a PHP built-in function. Try searching for the function in the official manual, and check what “extension” (PHP module) it belongs to, and what versions of PHP support it.
In case of a missing extension, install that extension and enable it in php.ini. Refer to the Installation Instructions in the PHP Manual for the extension your function appears in. You may also be able to enable or install the extension using your package manager (e.g. apt
in Debian or Ubuntu, yum
in Red Hat or CentOS), or a control panel in a shared hosting environment.
If the function was introduced in a newer version of PHP from what you are using, you may find links to alternative implementations in the manual or its comment section. If it has been removed from PHP, look for information about why, as it may no longer be necessary.
In case of missing includes, make sure to include the file declaring the function before calling the function.
In case of typos, fix the typo.
Related Questions:
Parse error: syntax error, unexpected T_XXX
Happens when you have T_XXX
token in unexpected place, unbalanced (superfluous) parentheses, use of short tag without activating it in php.ini, and many more.
Related Questions:
- Reference: PHP Parse/Syntax Errors; and How to solve them?
- Parse Error: syntax error: unexpected ‘{‘
- Parse error: Syntax error, unexpected end of file in my PHP code
- Parse error: syntax error, unexpected ‘<‘ in – Fix?
- Parse error: syntax error, unexpected ‘?’
For further help see:
- http://phpcodechecker.com/ – Which does provide some more helpful explanations on your syntax woes.
Fatal error: Can’t use function return value in write context
This usually happens when using a function directly with empty
.
Example:
if (empty(is_null(null))) { echo 'empty'; }
This is because empty
is a language construct and not a function, it cannot be called with an expression as its argument in PHP versions before 5.5. Prior to PHP 5.5, the argument to empty()
must be a variable, but an arbitrary expression (such as a return value of a function) is permissible in PHP 5.5+.
empty
, despite its name, does not actually check if a variable is “empty”. Instead, it checks if a variable doesn’t exist, or == false
. Expressions (like is_null(null)
in the example) will always be deemed to exist, so here empty
is only checking if it is equal to false. You could replace empty()
here with !
, e.g. if (!is_null(null))
, or explicitly compare to false, e.g. if (is_null(null) == false)
.
Related Questions:
MySQL: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near … at line …
This error is often caused because you forgot to properly escape the data passed to a MySQL query.
An example of what not to do (the “Bad Idea”):
$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}"; mysqli_query($db, $query);
This code could be included in a page with a form to submit, with an URL such as http://example.com/edit.php?id=10 (to edit the post n°10)
What will happen if the submitted text contains single quotes? $query
will end up with:
$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';
And when this query is sent to MySQL, it will complain that the syntax is wrong, because there is an extra single quote in the middle.
To avoid such errors, you MUST always escape the data before use in a query.
Escaping data before use in a SQL query is also very important because if you don’t, your script will be open to SQL injections. An SQL injection may cause alteration, loss or modification of a record, a table or an entire database. This is a very serious security issue!
Documentation: