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
- 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
Also, see:
Parse error: syntax error, unexpected T_VARIABLE
Possible scenario
I can't seem to find where my code has gone wrong. Here is my full error:
What I am trying
Answer
Parse error: A problem with the syntax of your program, such as leaving a semicolon off of the end of a statement or, like the case above, missing the
.
operator. The interpreter stops running your program when it encounters a parse error.In simple words this is a syntax error, meaning that there is something in your code stopping it from being parsed correctly and therefore running.
What you should do is check carefully at the lines around where the error is for any simple mistakes.
That error message means that in line x of the file, the PHP interpreter was expecting to see an open parenthesis but instead, it encountered something called
T_VARIABLE
. ThatT_VARIABLE
thing is called atoken
. It's the PHP interpreter's way of expressing different fundamental parts of programs. When the interpreter reads in a program, it translates what you've written into a list of tokens. Wherever you put a variable in your program, there is aT_VARIABLE
token in the interpreter's list.Good read: List of Parser Tokens
So make sure you enable at least
E_PARSE
in yourphp.ini
. Parse errors should not exist in production scripts.I always recommended to add the following statement, while coding:
PHP error reporting
Also, a good idea to use an IDE which will let you know parse errors while typing. You can use:
Related Questions:
Strict Standards: Non-static method [<class>::<method>] should not be called statically
Occurs when you try to call a non-static method on a class as it was static, and you also have the
E_STRICT
flag in yourerror_reporting()
settings.Example :
HTML::br()
or$html::br()
You can actually avoid this error by not adding
E_STRICT
toerror_reporting()
, egsince as for PHP 5.4.0 and above,
E_STRICT
is included inE_ALL
[ref]. But that is not adviceable. The solution is to define your intended static function as actualstatic
:or call the function conventionally :
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:
For further help see:
Notice: Undefined variable
Happens when you try to use a variable that wasn't previously defined.
A typical example would be
If you didn't define
$counter
before, the code above will trigger the notice.The correct way would be to set the variable before using it, even if it's just an empty string like
Notice: Undefined property
This error means much the same thing, but refers to a property of an object. Reusing the example above, this code would trigger the error because the
counter
property hasn't been set.Related Questions:
Fatal error: Cannot redeclare class [class name]
Fatal error: Cannot redeclare [function name]
This means you're either using the same function/class name twice and need to rename one of them, or it is because you have used
require
orinclude
where you should be usingrequire_once
orinclude_once
.When a class or a function is declared in PHP, it is immutable, and cannot later be declared with a new value.
Consider the following code:
class.php
index.php
The second call to
do_stuff()
will produce the error above. By changingrequire
torequire_once
, we can be certain that the file that contains the definition ofMyClass
will only be loaded once, and the error will be avoided.Notice: Uninitialized string offset:
*
As the name indicates, such type of error occurs, when you are most likely trying to iterate over or find a value from an array with a non-existing key.
Consider you, are trying to show every letter from
$string
The above example will generate (online demo):
And, as soon as the script finishes echoing
D
you'll get the error, because inside thefor()
loop, you have told PHP to show you the from first to fifth string character from'ABCD'
Which, exists, but since the loop starts to count from0
and echoesD
by the time it reaches to4
, it will throw an offset error.Similar Errors: