PHP: “Notice: Undefined variable”, “Notice: Undefined index”, and “Notice: Undefined offset”


I am running a PHP script, and keep getting errors like:



Notice: Undefined variable: my_variable_name in C:wampwwwmypathindex.php on line 10



Notice: Undefined index: my_index C:wampwwwmypathindex.php on line 11



Line 10 and 11 looks like this:



What do these errors mean?



Why do they appear all of a sudden? I used to use this script for years and I've never had any problem.



What do I need to do to fix them?



This is a General Reference question for people to link to as duplicate, instead of having to explain the issue over and over again. I feel this is necessary because most real-world answers on this issue are very specific.



Related Meta discussion:



From the vast wisdom of the PHP Manual:



Relying on the default value of an uninitialized variable is problematic in the case of including one file into another which uses the same variable name. It is also a major security risk with register_globals turned on. E_NOTICE level error is issued in case of working with uninitialized variables, however not in the case of appending elements to the uninitialized array. isset() language construct can be used to detect if a variable has been already initialized. Additionally and more ideal is the solution of empty() since it does not generate a warning or error message if the variable is not initialized.



From PHP documentation:



No warning is generated if the variable does not exist. That means
empty() is essentially the concise equivalent to !isset($var) || $var
== false
.



This means that you could use only empty() to determine if the variable is set, and in addition it checks the variable against the following, 0,"",null.



Example:







Test the above snippet in the 3v4l.org online PHP editor



Although PHP does not require a variable declaration, it does recommend it in order to avoid some security vulnerabilities or bugs where one would forget to give a value to a variable that will be used later in the script. What PHP does in the case of undeclared variables is issue a very low level error, E_NOTICE, one that is not even reported by default, but the Manual advises to allow during development.



Ways to deal with the issue:



Recommended: Declare your variables, for example when you try to append a string to an undefined variable. Or use isset() / !empty() to check if they are declared before referencing them, as in:



This has become much cleaner as of PHP 7.0, now you can use the null coalesce operator:



Set a custom error handler for E_NOTICE and redirect the messages away from the standard output (maybe to a log file):



Disable E_NOTICE from reporting. A quick way to exclude just E_NOTICE is:



Suppress the error with the @ operator.



Note: It's strongly recommended to implement just point 1.



This notice appears when you (or PHP) try to access an undefined index of an array.



Ways to deal with the issue:



Check if the index exists before you access it. For this you can use isset() or array_key_exists():



The language construct list() may generate this when it attempts to access an array index that does not exist:



Two variables are used to access two array elements, however there is only one array element, index 0, so this will generate:



Notice: Undefined offset: 1



The notices above appear often when working with $_POST, $_GET or $_SESSION. For $_POST and $_GET you just have to check if the index exists or not before you use them. For $_SESSION you have to make sure you have the session started with session_start() and that the index also exists.



Also note that all 3 variables are superglobals and are uppercase.



Related:



Try these



Q1: this notice means $varname is not
defined at current scope of the
script.



Q2: Use of isset(), empty() conditions before using any suspicious variable works well.



Or, as a quick and dirty solution:



Note about sessions:



When using sessions, session_start(); is required to be placed inside all files using sessions.



http://php.net/manual/en/features.sessions.php



A (often discouraged) alternative is the error suppression operator @. It is a specific language construct to shut down undesired notices and warnings, but should be used with care.



First, it incurs a microperformance penalty over using isset. That's not measurable in real world applications, but should be considered in data heavy iterations. Secondly it might obstruct debugging, but at the same time suppressed errors are in fact passed on to custom error handlers (unlike isset decorated expressions).



It means you are testing, evaluating, or printing a variable that you have not yet assigned anything to. It means you either have a typo, or you need to check that the variable was initialized to something first. Check your logic paths, it may be set in one path but not in another.



Generally because of "bad programming", and a possibility for mistakes now or later.



I didn't want to disable notice because it's helpful, but wanted to avoid too much typing.



My solution was this function:



So if I want to reference to $name and echo if exists, I simply write:



For array elements:



In page if I want to refer to $_REQUEST['name']:



The best way for getting input string is:



This one-liner is almost equivalent to:



If you absolutely want string value, just like:



Its because the variable '$user_location' is not getting defined. If you are using any if loop inside which you are declaring the '$user_location' variable then you must also have an else loop and define the same. For example:



The above code will create error as The if loop is not satisfied and in the else loop '$user_location' was not defined. Still PHP was asked to echo out the variable. So to modify the code you must do the following:



In reply to ""Why do they appear all of a sudden? I used to use this script for years and I've never had any problem."



It is very common for most sites to operate under the "default" error reporting of "Show all errors, but not 'notices' and 'deprecated'". This will be set in php.ini and apply to all sites on the server. This means that those "notices" used in the examples will be suppressed (hidden) while other errors, considered more critical, will be shown/recorded.



The other critical setting is the errors can be hidden (i.e. display_errors set to "off" or "syslog").



What will have happened in this case is that either the error_reporting was changed to also show notices (as per examples) and/or that the settings were changed to display_errors on screen (as opposed to suppressing them/logging them).



Why have they changed?



The obvious/simplest answer is that someone adjusted either of these settings in php.ini, or an upgraded version of PHP is now using a different php.ini from before. That's the first place to look.



However it is also possible to override these settings in



and any of these could also have been changed.



There is also the added complication that the web server configuration can enable/disable .htaccess directives, so if you have directives in .htaccess that suddenly start/stop working then you need to check for that.



(.htconf / .htaccess assume you're running as apache. If running command line this won't apply; if running IIS or other webserver then you'll need to check those configs accordingly)



Summary



the quick fix is to assign your variable to null at the top of your code



I used to curse this error, but it can be helpful to remind you to escape user input.



For instance, if you thought this was clever, shorthand code:



...Think again! A better solution is:



(I use a custom html() function to escape characters, your mileage may vary)



I use all time own useful function exst() which automatically declare variables.



Your code will be -



In a very Simple Language.
The mistake is you are using a variable $user_location which is not defined by you earlier and it doesn't have any value So I recommend you to please declare this variable before using it, For Example:



In PHP 7.0 it's now possible to use Null coalescing operator:



Equals to:



PHP manual PHP 7.0



Over time, PHP has become a more security-focused language. Settings which used to be turned off by default are now turned on by default. A perfect example of this is E_STRICT, which became turned on by default as of PHP 5.4.0.



Furthermore, according to PHP documentation, by defualt, E_NOTICE is disabled in php.ini. PHP docs recommend turning it on for debugging purposes. However, when I download PHP from the Ubuntu repository–and from BitNami's Windows stack–I see something else.



Notice that error_reporting is actually set to the production value by default, not to the "default" value by default. This is somewhat confusing and is not documented outside of php.ini, so I have not validated this on other distributions.



To answer your question, however, this error pops up now when it did not pop up before because:



You installed PHP and the new default settings are somewhat poorly documented, but do not exclude E_NOTICE.



E_NOTICE warnings like undefined variables and undefined indexes actually help to make your code cleaner and safer. I can tell you that, years ago, keeping E_NOTICE enabled forced me to declare my variables. It made it a LOT easier to learn C, where not declaring variables is much bigger of a nuisance.



Turn off E_NOTICE by copying the "Default value" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED and replacing it with what is currently uncommented after the equals sign in error_reporting =. Restart Apache, or PHP if using CGI or FPM. Make sure you are editing the "right" php.ini. The correct one will be Apache if you are running PHP with Apache, fpm or php-fpm if running PHP-FPM, cgi if running PHP-CGI, etc. This is not the recommended method, but if you have legacy code that's going to be exceedingly difficult to edit, then it might be your best bet.



Turn off E_NOTICE on the file or folder level. This might be preferable if you have some legacy code but want to do things the "right" way otherwise. To do this, you should consult Apache2, nginx, or whatever your server of choice is. In Apache, you would use php_value inside of <Directory>.



Rewrite your code to be cleaner. If you need to do this while moving to a production environment, or don't want someone to see your errors, make sure you are disabling any display of errors, and only logging your errors (see display_errors and log_errors in php.ini and your server settings).



To expand on option 3: This is the ideal. If you can go this route, you should. If you are not going this route initially, consider moving this route eventually by testing your code in a development environment. While you're at it, get rid of ~E_STRICT and ~E_DEPRECATED to see what might go wrong in the future. You're going to see a LOT of unfamiliar errors, but it's going to stop you from having any unpleasant problems when you need to upgrade PHP in the future.



Undefined variable: my_variable_name - This occurs when a variable has not been defined before use. When the PHP script is executed, it internally just assumes a null value. However, in which scenario would you need to check a variable before it was defined? Ultimately, this is an argument for "sloppy code". As a developer, I can tell you that I love it when I see an open source project where variables are defined as high up in their scopes as they can be defined. It makes it easier to tell what variables are going to pop up in the future, and makes it easier to read/learn the code.



Undefined index: my_index - This occurs when you try to access a value in an array and it does not exist. To prevent this error, perform a conditional check.



Another option is to declare an empty array at the top of your function. This is not always possible.



why not keep things simple?



undefined index means in an array you requested for unavailable array index for example



undefined variable means you have used completely not existing variable or which is not defined or initialized by that name for example



undefined offset means in array you have asked for non existing key. And the
solution for this is to check before use



Regarding this part of the question:



Why do they appear all of a sudden? I used to use this script for years and I've never had any problem.



No definite answers but here are a some possible explanations of why settings can 'suddenly' change:



You have upgraded PHP to a newer version which can have other defaults for error_reporting, display_errors or other relevant settings.



You have removed or introduced some code (possibly in a dependency) that sets relevant settings at runtime using ini_set() or error_reporting() (search for these in the code)



You changed the webserver configuration (assuming apache here): .htaccess files and vhost configurations can also manipulate php settings.



Usually notices don't get displayed / reported (see PHP manual)
so it is possible that when setting up the server, the php.ini file could not be loaded for some reason (file permissions??) and you were on the default settings. Later on, the 'bug' has been solved (by accident) and now it CAN load the correct php.ini file with the error_reporting set to show notices.



If working with classes you need to make sure you reference member variables using $this:



Another reason why an undefined index notice will be thrown, would be that a column was omitted from a database query.



I.e.:



Then trying to access more columns/rows inside a loop.



I.e.:



or in a while loop:



Something else that needs to be noted is that on a *NIX OS and Mac OS X, things are case-sensitive.



Consult the followning Q&A's on Stack:



Are table names in MySQL case sensitive?



mysql case sensitive table names in queries



MySql - Case Sensitive issue of tables in different server



Probably you were using old PHP version until and now upgraded PHP thats the reason it was working without any error till now from years.
until PHP4 there was no error if you are using variable without defining it but as of PHP5 onwards it throws errors for codes like mentioned in question.



When dealing with files, a proper enctype and a POST method are required, which will trigger an undefined index notice if either are not included in the form.



The manual states the following basic syntax:



HTML



PHP



Reference:



Those notices are because you don't have the used variable defined and my_index key was not present into $my_array variable.



Those notices were triggered every time, because your code is not correct, but probably you didn't have the reporting of notices on.



Solve the bugs:



Another way to get this out:



In PHP you need fist to define the variable after that you can use it.
We can check variable is defined or not in very efficient way!.



Simple Explanation




Thank you for your interest in this question.
Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).


Would you like to answer one of these unanswered questions instead?

Popular posts from this blog

大跃进

马相伯