Thursday 9 November 2017

arrays - "Notice: Undefined variable", "Notice: Undefined index", and "Notice: Undefined offset" using PHP

itemprop="text">

I'm running a PHP script and continue
to receive errors
like:






Notice: Undefined variable: my_variable_name in C:\wamp\www\mypath\index.php on
line 10



Notice: Undefined index: my_index
C:\wamp\www\mypath\index.php on line
11




Line 10 and 11
looks like this:



echo "My variable
value is: " . $my_variable_name;

echo "My index value is: " .
$my_array["my_index"];


What
is the meaning of these error messages?



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



How do I 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:






itemprop="text">
class="normal">Answer







From the
vast wisdom of the href="http://php.net/manual/en/language.variables.basics.php#example-112"
rel="noreferrer">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 rel="noreferrer">security risk with href="http://www.php.net/manual/en/ini.core.php#ini.register-globals"
rel="noreferrer">register_globals turned on. href="http://www.php.net/manual/en/errorfunc.constants.php#errorfunc.constants.errorlevels.e-notice"
rel="noreferrer">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. rel="noreferrer">isset() language construct can be used to detect if a
variable has been already initialized. Additionally and more ideal is the solution of
rel="noreferrer">empty() since it does not generate a warning or error
message if the variable is not initialized.




From href="http://php.net/manual/en/function.empty.php" rel="noreferrer">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, 0.0, "",
"0", null,
false or
[].



Example:



$o
= [];

@$var =
["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v)
{
echo (!isset($v) || $v == false) ? 'true ' : 'false';
echo ' ' .
(empty($v) ? 'true' : 'false');
echo
"\n";
});


Test
the above snippet in the rel="noreferrer">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 href="http://www.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting"
rel="noreferrer">advises to allow during
development.



Ways to deal with the
issue:




  1. Recommended:
    Declare your variables, for example when you try to append a string to an undefined
    variable. Or use rel="noreferrer">isset() / href="http://php.net/manual/en/function.empty.php"
    rel="noreferrer">!empty() to check if they are
    declared before referencing them, as
    in:



    //Initializing
    variable
    $value = ""; //Initialization value; Examples
    //"" When
    you want to append stuff later

    //0 When you want to add numbers
    later
    //isset()
    $value = isset($_POST['value']) ? $_POST['value'] :
    '';
    //empty()
    $value = !empty($_POST['value']) ? $_POST['value'] :
    '';


    This has become
    much cleaner as of PHP 7.0, now you can use the href="https://wiki.php.net/rfc/isset_ternary" rel="noreferrer">null coalesce
    operator:



    // Null
    coalesce operator - No need to explicitly initialize the
    variable.

    $value = $_POST['value'] ??
    '';

  2. Set a
    rel="noreferrer">custom error handler for E_NOTICE and redirect the
    messages away from the standard output (maybe to a log file):



    set_error_handler('myHandlerForMinorErrors',
    E_NOTICE |
    E_STRICT)

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



    error_reporting(
    error_reporting() & ~E_NOTICE
    )


  4. Suppress
    the error with the href="http://php.net/manual/en/language.operators.errorcontrol.php"
    rel="noreferrer">@
    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:





  1. Check
    if the index exists before you access it. For this you can use href="http://php.net/manual/en/function.isset.php"
    rel="noreferrer">isset() or href="http://php.net/manual/en/function.array-key-exists.php"
    rel="noreferrer">array_key_exists():



    //isset()
    $value
    = isset($array['my_index']) ? $array['my_index'] :
    '';
    //array_key_exists()
    $value = array_key_exists('my_index',
    $array) ? $array['my_index'] :
    '';

  2. The
    language construct rel="noreferrer">list() may generate this when it
    attempts to access an array index that does not
    exist:




    list($a, $b) =
    array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test
    string');



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 rel="noreferrer">session_start() and that the
index also exists.



Also note that all 3
variables are rel="noreferrer">superglobals and are
uppercase.



Related:






No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...