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

Uruchamiam skrypt PHP i nadal otrzymuję błędy typu:

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

Linia 10 i 11 wygląda tak:

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

Jakie jest znaczenie tych komunikatów o błędach?

Dlaczego pojawiają się tak nagle? Używałem tego skryptu od lat i nigdy nie miałem żadnych problem. Jak je naprawić?

Jest to ogólne Pytanie referencyjne dla ludzi, którzy linkują do duplikatu, zamiast wyjaśniać problem w kółko. Uważam, że jest to konieczne, ponieważ większość rzeczywistych odpowiedzi na ten temat jest bardzo konkretna.

Related meta dyskusja:

Author: Pekka 웃, 2010-11-24

27 answers

Notice: Undefined variable

Z ogromnej mądrości podręcznika PHP:

Opieranie się na domyślnej wartości niezainicjalizowanej zmiennej jest problematyczne w przypadku włączenia jednego pliku do drugiego, który używa tej samej nazwy zmiennej. Jest to również poważne zagrożenie bezpieczeństwa z włączonym register_globals. e_notice błąd poziomu jest wyświetlany w przypadku pracy ze zmiennymi niezainicjalizowanymi, jednak nie w przypadku dołączania elementów do niezaangażowanej tablicy. konstrukcja języka isset () może być używana do wykrywania, czy zmienna została już zainicjowana. Dodatkowo ideałem jest rozwiązanie empty () , ponieważ nie generuje ostrzeżenia ani Komunikatu o błędzie, jeśli zmienna nie jest zainicjalizowana.

Z dokumentacja PHP :

Nie jest generowane ostrzeżenie, jeśli zmienna nie istnieje. To znaczy empty () jest zasadniczo zwięzłym odpowiednik !isset ($var) / / $var = = false .

Oznacza to, że można użyć tylko empty(), aby określić, czy zmienna jest ustawiona, a ponadto sprawdza zmienną pod kątem następującej, 0,"",null.

Przykład:

$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";
});

Przetestuj powyższy fragment w 3v4l.org edytor PHP online

Chociaż PHP nie wymaga deklaracji zmiennej, zaleca ją, aby uniknąć luk w zabezpieczeniach lub błędów gdzie można zapomnieć podać wartość zmiennej, która będzie używana później w skrypcie. To, co robi PHP w przypadku nierejestrowanych zmiennych, to błąd bardzo niskiego poziomu, E_NOTICE, który nie jest nawet domyślnie zgłaszany, ale instrukcja zaleca Zezwolenie podczas programowania.

Sposoby radzenia sobie z problemem:

  1. Zalecane: Zadeklaruj swoje zmienne, na przykład, gdy próbujesz dodać łańcuch znaków do niezdefiniowanej zmiennej. Lub użycie isset() / !empty() aby sprawdzić, czy są zadeklarowane przed odwołaniem się do nich, jak w:

    //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'] : '';
    

    Stało się to znacznie czystsze od PHP 7.0, teraz możesz użyć operatora null coalesce :

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
    
  2. Ustaw niestandardową obsługę błędów DLA E_NOTICE i przekieruj wiadomości z dala od standardowego wyjścia (może do pliku dziennika):

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  3. Wyłącza e_notice z raportowania. Szybki sposób na wykluczenie just E_NOTICE jest:

    error_reporting( error_reporting() & ~E_NOTICE )
    
  4. Wyłącz błąd za pomocą operatora @ .

Uwaga: zaleca się wdrożenie tylko punktu 1.

Notice: Undefined index / Undefined offset

Ta informacja pojawia się, gdy (lub PHP) próbujesz uzyskać dostęp do niezdefiniowanego indeksu tablicy.

Sposoby radzenia sobie z problemem:

  1. Sprawdź, czy indeks istnieje, zanim uzyskasz do niego dostęp. Do tego możesz użyć isset() lub 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. Konstrukcja języka list() może generować to, gdy próbuje uzyskać dostęp do indeksu tablicy, który nie istnieje:

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

Dwie zmienne są używane do dostępu do dwóch elementów tablicy, jednak istnieje tylko jeden element tablicy, index 0, więc wygeneruje to:

Notice: Undefined offset: 1

$_POST / $_GET / $_SESSION zmienna

Powyższe ogłoszenia pojawiają się często podczas pracy z $_POST, $_GET lub $_SESSION. Dla $_POST i $_GET musisz tylko sprawdzić, czy indeks istnieje, zanim go użyjesz. Dla $_SESSION musisz się upewnić, że sesja zaczyna się od session_start() i że indeks również istnieje.

Zauważ również, że wszystkie 3 zmienne są superglobalami i są wielkimi literami.

Powiązane:

 896
Author: Rizier123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-25 18:40:39

Spróbuj tych

Q1: ta informacja oznacza, że $varname nie jest określony w aktualnym zakresie scenariusz.

Q2: użycie warunków isset (), empty () przed użyciem podejrzanej zmiennej działa dobrze.

// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';

// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
     $user_name = $_SESSION['user_name'];
}

Lub, jako szybkie i brudne rozwiązanie:

// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);

Uwaga o sesjach:

 112
Author: Ish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 14:58:33

Wyświetlanie błędów @ operator

W przypadku niepożądanych i zbędnych ogłoszeń można użyć dedykowanego @ operator to " hide " undefined variable / index messages.

$var = @($_GET["optional_param"]);
  • jest to zazwyczaj zniechęcające. Przybysze mają tendencję do nadużywania go.
  • jest to bardzo nieodpowiednie dla kodu głęboko w logice aplikacji (ignorując niezgłoszone zmienne, gdzie nie powinieneś), np. dla parametrów funkcji lub w pętlach.
  • jest jedna przewaga nad isset?: lub ?? nad supresją. Ogłoszenia nadal mogą być rejestrowane. I można wskrzesić @-ukryte ogłoszenia z: set_error_handler("var_dump");
    • dodatkowo nie powinieneś używać/polecać if (isset($_POST["shubmit"])) w swoim początkowym kodzie.
    • nowicjusze nie zauważą takich literówek. To po prostu pozbawia Cię powiadomień o PHPs dla tych właśnie przypadków. Dodaj @ lub isset tylko po sprawdzaniu funkcjonalności.
    • Najpierw napraw przyczynę. Nie ogłoszenia.

  • @ jest akceptowalny głównie dla $_GET/$_POST parametry wejściowe, w szczególności , jeśli są opcjonalne .
Ponieważ dotyczy to większości takich pytań, rozwińmy najczęstsze przyczyny:]}

$_GET / $_POST / $_REQUEST undefined input

  • Pierwszą rzeczą, którą robisz, gdy napotkasz niezdefiniowany indeks/offset, jest sprawdzenie literówek:
    $count = $_GET["whatnow?"];

    • Czy to jest oczekiwana nazwa klucza i obecna na każdym żądaniu strony?
    • nazwy zmiennych i oznaczenia tablic są w PHP uwzględniające wielkość liter.
  • Po drugie, jeśli ogłoszenie nie ma oczywistej przyczyny, użyj var_dump lub print_r aby zweryfikować wszystkie tablice wejściowe dla ich zawartości curent:

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

    Oba ujawnią, czy skrypt został wywołany z odpowiednimi lub dowolnymi parametrami.

  • Alternativey or dodatkowo użyj swojego browser devtools (F12) i sprawdź kartę Sieć pod kątem żądań i parametrów:

    narzędzia dla programistów przeglądarek / Karta sieciowa

    Parametry POST I GET będą wyświetlane oddzielnie.

  • Dla $_GET parametrów można też zerknąć na QUERY_STRING W

    print_r($_SERVER);
    

    PHP ma pewne reguły do łączenia niestandardowych nazw parametrów w superglobale. Apache może też trochę przepisać. Możesz spójrz również na dostarczone raw $_COOKIES i inne nagłówki żądań HTTP w ten sposób.

  • Bardziej oczywiście spójrz na pasek adresu przeglądarki dla parametry GET :

    http://example.org/script.php?id=5&sort=desc

    Pary name=value po znaku zapytania ? są parametrami zapytania (GET). Tak więc ten adres URL może być tylko możliwe, $_GET["id"] i $_GET["sort"].

  • Wreszcie sprawdzić swoje <form> oraz <input> deklaracji, jeśli oczekujesz parametru, ale otrzymujesz brak

    • upewnij się, że każde wymagane wejście ma <input name=FOO>
    • atrybut id= lub title= nie wystarczy.
    • formularz method=POST powinien wypełnić $_POST.
    • podczas gdy a method=GET (lub go pomijając) dałoby $_GET zmienne.
    • możliwe jest również, aby formularz dostarczał action=script.php?get=param poprzez $_GET i pozostałe method=POST pola w $_POST obok.
    • z nowoczesnymi konfiguracjami PHP (≥5.6) stało się możliwe (nie modne) użycie $_REQUEST['vars'] ponownie, które mashes dostać i POST params.
  • Jeśli używasz mod_rewrite, powinieneś sprawdzić zarówno access.log, jak i włączyć RewriteLog aby dowiedzieć się, brak parametrów.

$_FILES

  • te same kontrole zdrowia psychicznego mają zastosowanie do przesyłania plików i $_FILES["formname"].
  • ponadto sprawdź dla enctype=multipart/form-data
  • oraz method=POST w deklaracji <form>.
  • Zobacz też: PHP Undefined index błąd $_FILES?

$_COOKIE

  • tablica $_COOKIE nigdy nie jest wypełniana bezpośrednio po setcookie(), ale tylko na każdym kolejnym żądaniu HTTP.
  • dodatkowo ich czas ważności może być ograniczony do subdomen lub poszczególnych ścieżek, a użytkownik i przeglądarka mogą je po prostu odrzucić lub usunąć.
 49
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-22 21:16:29

Oznacza to, że testujesz, oceniasz lub drukujesz zmienną, do której jeszcze nic nie przypisałeś. Oznacza to, że albo masz literówkę, albo musisz najpierw sprawdzić, czy zmienna została zainicjowana. Sprawdź swoje ścieżki logiczne, może być ustawiona w jednej ścieżce, ale nie w innej.

 37
Author: DGM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-24 02:43:04

Ogólnie z powodu "złego programowania" i możliwości błędów teraz lub później.

  1. jeśli jest to błąd, zrób najpierw odpowiednie przypisanie zmiennej: $varname=0;
  2. Jeśli naprawdę jest zdefiniowany tylko czasami, przetestuj go: if (isset($varname)), przed użyciem
  3. Jeśli to dlatego, że źle napisałeś, popraw to
  4. może nawet włączyć ostrzeżenia w tobie PHP-settings
 36
Author: Erik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 08:46:21

Nie chciałem wyłączać powiadomienia, ponieważ jest to pomocne, ale chciałem uniknąć zbyt dużego pisania.

Moim rozwiązaniem była ta funkcja:

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

Więc jeśli chcę odwołać się do $name I echo jeśli istnieje, po prostu piszę:

<?=ifexists('name')?>

Dla elementów tablicy:

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

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

<?=ifexistsidx($_REQUEST,'name')?>
 32
Author: Ferenci Zoltán László,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-30 14:14:59

Najlepszym sposobem na uzyskanie input string jest:

$value = filter_input(INPUT_POST, 'value');

Ta jednowierszowa jest prawie równoważna:

if (!isset($_POST['value'])) {
    $value = null;
} elseif (is_array($_POST['value'])) {
    $value = false;
} else {
    $value = $_POST['value'];
}

Jeśli chcesz string wartość, tak jak:

$value = (string)filter_input(INPUT_POST, 'value');
 25
Author: mpyw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-26 22:15:35

Its ponieważ zmienna '$ user_location' nie jest zdefiniowana. Jeśli używasz dowolnej pętli if, wewnątrz której deklarujesz zmienną '$user_location', musisz również mieć pętlę else I zdefiniować to samo. Na przykład:

$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;

Powyższy kod spowoduje błąd, ponieważ pętla if nie jest spełniona, a w pętli else '$user_location ' nie została zdefiniowana. Mimo to PHP zostało poproszone o wysłanie ECHA zmiennej. Aby zmodyfikować kod należy wykonać następujące czynności:

$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;
 24
Author: Roger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-22 12:55:31

W odpowiedzi na ""Dlaczego pojawiają się tak nagle? Używałem tego skryptu od lat i nigdy nie miałem żadnego problemu."

Bardzo często większość witryn działa w ramach" domyślnego "raportowania błędów" Pokaż wszystkie błędy, ale nie "powiadomienia" i "przestarzałe"". Zostanie to ustawione w php.ini i zastosować do wszystkich stron na serwerze. Oznacza to, że te "uwagi" użyte w przykładach będą tłumione (ukryte), podczas gdy inne błędy, uważane za bardziej krytyczne, będą pokazane/nagrane.

Drugim krytycznym ustawieniem jest możliwość ukrycia błędów (np. display_errors ustawione na "off" lub "syslog").

To, co się stanie w tym przypadku, to albo error_reporting został zmieniony, aby wyświetlać również powiadomienia (jak na przykładach) i/lub ustawienia zostały zmienione na display_errors Na ekranie (w przeciwieństwie do ich tłumienia/rejestrowania).

Dlaczego się zmienili?

Oczywistą/najprostszą odpowiedzią jest to, że ktoś skorygował jedno z tych ustawień w php.ini, czyli ulepszona wersja PHP używa teraz innego php.ini z przeszłości. To pierwsze miejsce.

Jednak możliwe jest również nadpisanie tych ustawień w

  • .htconf (webserver configuration, including vhosts and sub-configurations) *
  • .htaccess
  • w samym kodzie php

I każda z nich również mogła zostać zmieniona.

Istnieje również dodatkowa komplikacja, że konfiguracja serwera www może Włącz/Wyłącz .dyrektywy htaccess, więc jeśli masz dyrektywy whtaccess, który nagle zaczyna / przestaje działać, musisz to sprawdzić.

(.htconf /htaccess Załóżmy, że działasz jako apache. Jeśli uruchomiona linia poleceń nie będzie miała zastosowania; jeśli uruchomiona usługa IIS lub inny serwer WWW, musisz odpowiednio sprawdzić te konfiguracje)

Podsumowanie

  • Sprawdź error_reporting i display_errors dyrektywy php w php.ini się nie zmieniło, albo że nie używasz innego php.ini z przeszłości.
  • Sprawdź error_reporting i display_errors dyrektywy php w .htconf (lub vhosts itp.) nie zmienił się
  • Sprawdź error_reporting i display_errors dyrektywy php w .htaccess nie uległo zmianie
  • / Align = "left" / htaccess, sprawdź, czy nadal są dozwolone wplik htconf
  • na koniec sprawdź swój kod; prawdopodobnie niepowiązaną bibliotekę; aby sprawdzić, czy error_reporting i display_errors dyrektywy php zostały tam ustawione.
 24
Author: Robbie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 01:44:03

Szybką poprawką jest przypisanie zmiennej do null u góry kodu

$user_location = null;
 17
Author: Shahin Mammadzada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-12 19:02:26

Kiedyś przeklinałem ten błąd, ale pomocne może być przypomnienie o unikaniu wprowadzania danych przez użytkownika.

Na przykład, jeśli uważasz, że to sprytne, Skrót kodu:

// Echo whatever the hell this is
<?=$_POST['something']?>

...Pomyśl jeszcze raz! Lepszym rozwiązaniem jest:

// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>

(używam niestandardowej funkcji html() do ucieczki znaków, twój przebieg może się różnić)

 15
Author: rybo111,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-28 19:12:50

Używam all time own useful function exst () która automatycznie deklaruje zmienne.

Twój kod będzie -

$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}
 13
Author: user2253362,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-09 14:07:38

W BARDZO prostym języku .
błąd polega na tym, że używasz zmiennej $user_location, która nie jest wcześniej zdefiniowana przez Ciebie i nie ma żadnej wartości, więc zalecam, aby zadeklarować tę zmienną Przed używając it, na przykład:


$user_location = '';
lub
$user_location = 'Los Angles';
Jest to bardzo częsty błąd, który możesz face.So nie martw się po prostu zadeklaruj zmienną i Ciesz się kodowaniem .
 13
Author: Rishabh Seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 11:06:24

W PHP 7.0 jest teraz możliwe użycie operatora null:

echo "My index value is: " . ($my_array["my_index"] ?? '');

Równa się:

echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');

PHP manual PHP 7.0

 12
Author: Lachezar Lechev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 13:34:57

Dlaczego nie zachować rzeczy prostych?

<?php
error_reporting(E_ALL); // making sure all notices are on

function idxVal(&$var, $default = null) {
         return empty($var) ? $var = $default : $var;
  }

echo idxVal($arr['test']);         // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice

?>
 7
Author: gts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-06 20:37:30

DLACZEGO TO SIĘ DZIEJE?

Z czasem PHP stał się językiem bardziej skoncentrowanym na bezpieczeństwie. Ustawienia, które były domyślnie wyłączone, są teraz domyślnie włączone. Doskonałym przykładem tego jest E_STRICT, który został włączony domyślnie od PHP 5.4.0 .

Ponadto, zgodnie z dokumentacją PHP, przez defualt, {[5] } jest wyłączony w php.ini. Dokumenty PHP zalecają włączenie go do celów debugowania . Jednak gdy ściągam PHP z Ubuntu repozytorium-a ze stosu Windows BitNami-widzę coś jeszcze.

; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

Zauważ, że error_reporting jest domyślnie ustawiona na wartość produkcyjną, a nie na wartość domyślną. Jest to nieco mylące i nie jest udokumentowane poza php.ini, więc mam nie potwierdzono to na innych dystrybucjach.

Aby odpowiedzieć na twoje pytanie, jednak ten błąd wyskakuje teraz, gdy nie wyskakiwał wcześniej, ponieważ:

  1. Zainstalowałeś PHP i nowe ustawienia domyślne są nieco słabo udokumentowane, ale nie wykluczają E_NOTICE.

  2. E_NOTICE Ostrzeżenia takie jak nieokreślone zmienne i nieokreślone indeksy pomagają uczynić kod czystszym i bezpieczniejszym. Mogę ci powiedzieć, że wiele lat temu utrzymywanie E_NOTICE włączone zmusiło mnie do zadeklarowania moich zmiennych. Znacznie ułatwiło to naukę języka C, gdzie nie deklarowanie zmiennych jest znacznie większym uciążliwością.

CO MOGĘ Z TYM ZROBIĆ?
  1. Wyłącz E_NOTICE by skopiowanie "wartości domyślnej" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED i zastąpienie jej tym, co jest obecnie nieakcentowane po znaku równości error_reporting =. Uruchom ponownie Apache lub PHP, jeśli używasz CGI lub FPM. Upewnij się, że edytujesz "prawo" php.ini. Poprawnym będzie Apache, jeśli używasz PHP z Apache, fpm lub php - fpm, jeśli używasz PHP-FPM, cgi, jeśli używasz PHP-CGI, itp. Nie jest to zalecana metoda, ale jeśli masz starszy kod, który będzie niezwykle trudny do edycji, to może być najlepszy zakład.

  2. Wyłącz E_NOTICE na poziomie pliku lub folderu. Może to być lepsze, jeśli masz trochę kodu starszego, ale chcesz robić rzeczy "prawo" sposób inaczej. Aby to zrobić, powinieneś skonsultować się z Apache2, nginx lub dowolnym wybranym serwerem. W Apache, można użyć php_value wewnątrz <Directory>.

  3. Przepisz kod, aby był czystszy. Jeśli musisz to zrobić podczas przechodzenia do środowiska produkcyjnego lub nie chcesz, aby ktoś widział Twoje błędy, upewnij się, że wyłączanie wyświetlania błędów i tylko rejestrowanie twoich błędów (zobacz display_errors i log_errors w php.INI i ustawienia serwera).

Aby rozwinąć wariant 3: jest to idealne rozwiązanie. Jeśli możesz iść tą drogą, powinieneś. Jeśli początkowo nie podążasz tą trasą, rozważ przeniesienie tej trasy, testując swój kod w środowisku deweloperskim. Skoro już przy tym jesteś, pozbądź się ~E_STRICT i ~E_DEPRECATED, aby zobaczyć, co może pójść nie tak w przyszłości. Zobaczysz wiele nieznane błędy, ale to powstrzyma cię przed nieprzyjemnymi problemami, gdy będziesz musiał uaktualnić PHP w przyszłości.

CO OZNACZAJĄ BŁĘDY?

Undefined variable: my_variable_name - dzieje się tak, gdy zmienna nie została zdefiniowana przed użyciem. Gdy skrypt PHP jest wykonywany, wewnętrznie przyjmuje tylko wartość null. W jakim jednak scenariuszu trzeba sprawdzić zmienną przed jej zdefiniowaniem? Ostatecznie jest to argument za "niechlujnym kodem". Jako deweloper mogę powiedzieć, że uwielbiam, gdy widzę projekt open source, w którym zmienne są zdefiniowane tak wysoko w swoich zakresach, jak można je zdefiniować. Ułatwia to określenie, jakie zmienne pojawią się w przyszłości i ułatwia czytanie/naukę kodu.

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: my_index - dzieje się tak, gdy próbujesz uzyskać dostęp do wartości w tablicy, która nie istnieje. Aby zapobiec temu błędowi, wykonaj sprawdzenie warunkowe.

// verbose way - generally better
if (isset($my_array['my_index'])) {
    echo "My index value is: " . $my_array['my_index'];
}

// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;   

Inną opcją jest zadeklarowanie pustej tablicy na górze funkcji. To nie zawsze jest to możliwe.

$my_array = array(
    'my_index' => ''
);

//...

$my_array['my_index'] = 'new string';

(dodatkowa wskazówka)

  • kiedy natknąłem się na te i inne problemy, użyłem NetBeans IDE (free) i dało mi mnóstwo ostrzeżeń i ostrzeżeń. Niektóre z nich oferują bardzo pomocne wskazówki. Nie jest to wymóg i nie używam już IDE z wyjątkiem dużych projektów. W dzisiejszych czasach Jestem bardziej [[22]] osobą:).
 7
Author: smcjones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 23:01:31

Undefined index oznacza w tablicy, o którą prosiłeś dla indeksu tablicy niedostępnej, na przykład

<?php 

$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);

?>

Undefined zmienna oznacza, że użyłeś całkowicie nieistniejącej zmiennej lub która nie jest zdefiniowana lub zainicjalizowana tą nazwą na przykład

<?php print_r($myvar); ?>

Undefined offset oznacza w tablicy, o którą prosiłeś o nieistniejący klucz. Oraz roztwór do tego celu należy sprawdzić przed użyciem

php> echo array_key_exists(1, $myarray);
 5
Author: Sintayehu Abaynhe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 01:02:18

Odnośnie tej części Pytania:

Dlaczego pojawiają się tak nagle? Używałem tego skryptu od lat i nigdy nie miałem żadnego problemu.

Brak jednoznacznych odpowiedzi, ale oto kilka możliwych wyjaśnień, dlaczego ustawienia mogą "nagle" zmienić:

  1. Zaktualizowałeś PHP do nowszej wersji, która może mieć inne domyślne ustawienia dla error_reporting, display_errors lub innych odpowiednich ustawień.

  2. Usunąłeś lub wprowadziłeś jakiś kod (prawdopodobnie w zależności), który ustawia odpowiednie ustawienia w czasie wykonywania za pomocą ini_set() lub error_reporting() (wyszukaj je w kodzie)

  3. Zmieniłeś konfigurację serwera www (zakładając tutaj apache): pliki i konfiguracje vhost mogą również manipulować ustawieniami php.

  4. Zazwyczaj ogłoszenia nie są wyświetlane / zgłaszane (zobacz podręcznik PHP ) jest więc możliwe, że podczas konfigurowania serwera, php.z jakiegoś powodu nie można załadować pliku ini (plik uprawnienia??) i byłeś na domyślnych ustawieniach. Później 'błąd' został rozwiązany (przez przypadek) i teraz może załadować poprawne php.plik ini z zestawem error_reporting do wyświetlania powiadomień.

 3
Author: Wouter de Winter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 19:31:39

Jeśli pracujesz z klasami, musisz się upewnić, że odwołujesz się do zmiennych członkowskich używając $this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}
 2
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 11:44:13

Innym powodem, dla którego zostanie wyrzucone nieokreślone powiadomienie o indeksie, byłoby pominięcie kolumny w zapytaniu bazy danych.

Czyli:

$query = "SELECT col1 FROM table WHERE col_x = ?";

Następnie próbuje uzyskać dostęp do większej liczby kolumn / wierszy wewnątrz pętli.

Czyli:

print_r($row['col1']);
print_r($row['col2']); // undefined index thrown

Lub w pętli while:

while( $row = fetching_function($query) ) {

    echo $row['col1'];
    echo "<br>";
    echo $row['col2']; // undefined index thrown
    echo "<br>";
    echo $row['col3']; // undefined index thrown

}

Należy jeszcze zauważyć, że w *NIX OS i Mac OS X rozróżnia się wielkość liter.

Zapoznaj się z poniższymi pytaniami na temat stosu:

 2
Author: Fred -ii-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 10:15:26

Używanie trójnika jest proste, czytelne i czyste:

Pre PHP 7
Przypisanie zmiennej do wartości innej zmiennej, jeśli jest ustawiona, w przeciwnym razie Przypisz null (lub dowolną wartość domyślną ):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP 7+
To samo z wyjątkiem użycia operatora Koalescencyjnego Null . Nie ma już potrzeby wywoływania isset(), ponieważ jest to wbudowane, i nie ma potrzeby dostarczania zmiennej do powrotu, ponieważ zakłada się, że zwróci wartość sprawdzanej zmiennej:

$newVariable = $thePotentialData ?? null;

Oba {[19] } zatrzymają powiadomienia z pytania OP, a oba {[19] } są dokładnym odpowiednikiem:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

 
Jeśli nie wymagasz ustawiania nowej zmiennej, możesz bezpośrednio użyć zwracanej wartości trójnika, na przykład z echo, argumentami funkcji, itd:

Echo:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

Funkcja:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

Powyższe będzie działać tak samo z tablicami, w tym sesje itp, zastępując sprawdzaną zmienną np.:
$_SESSION['checkMe']
lub jak wiele poziomów głębokich potrzebujesz, np.:
$clients['personal']['address']['postcode']


 

Tłumienie:

Możliwe jest wyłączenie powiadomień PHP za pomocą @ lub zmniejszenie poziomu raportowania błędów, ale nie rozwiązuje problemu, po prostu przestaje być raportowany w dzienniku błędów. Oznacza to, że kod nadal próbował użyć zmiennej, która nie została ustawiona, co może lub nie oznacza, że coś nie działa zgodnie z przeznaczeniem-w zależności od tego, jak ważna jest brakująca wartość.

Naprawdę powinieneś sprawdzać ten problem i odpowiednio go obsługiwać, albo obsługując inną wiadomość, albo nawet po prostu zwracając wartość null dla wszystkiego innego, aby zidentyfikować dokładny stan.

Jeśli zależy Ci tylko na tym, aby powiadomienie nie było w dzienniku błędów, możesz po prostu zignorować dziennik błędów.

 1
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-06 18:56:38

Prawdopodobnie używałeś starej wersji PHP, a teraz zaktualizowałeś PHP, dlatego działało bez żadnego błędu do tej pory od lat. do PHP4 nie było żadnego błędu, jeśli używasz zmiennej bez jej definiowania, ale od PHP5 wyrzuca błędy dla kodów, jak wspomniano w pytaniu.

 0
Author: phvish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 09:08:24

W przypadku plików wymagany jest odpowiedni enctype i metoda POST, które wywołają niezdefiniowany indeks, jeśli któryś z nich nie jest zawarty w formularzu.

Podręcznik zawiera następującą podstawową składnię:

HTML

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

PHP

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

Odniesienie:

 0
Author: Funk Forty Niner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-07 12:21:51

Jedną z najczęstszych przyczyn zmiennej nieistniejącej po przesłaniu formularza HTML jest to, że element formularza nie jest zawarty w znaczniku <form>:

Przykład: Element nie zawarty w <form>

<form action="example.php" method="post">
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>

<select name="choice">
    <option value="choice1">choice 1</option>
    <option value="choice2">choice 2</option>
    <option value="choice3">choice 3</option>
    <option value="choice4">choice 4</option>
</select>

Przykład: Element obecnie zawarty w <form>

<form action="example.php" method="post">
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    <p>
        <input type="text" name="name" />
        <input type="submit" value="Submit" />
    </p>
</form>
 0
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-05 20:46:04

Zadałem pytanie na ten temat i skierowano mnie do tego posta z wiadomością:

To pytanie ma już odpowiedź tutaj:

"Notice: Undefined variable", "Notice: Undefined index" I " Notice: Undefined offset " using PHP

Dzielę się moim pytaniem i rozwiązaniem tutaj:

To jest błąd:

Tutaj wpisz opis obrazka

Linia 154 jest problemem. Oto co mam w linii 154:
153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

Myślę, że problem w tym, że piszę warunki if dla zmiennej $city, która nie jest kluczem, ale wartością w $key => $city. Po pierwsze, czy może Pan potwierdzić, czy to jest przyczyna Ostrzeżenia? Po drugie, jeśli to jest problem, dlaczego nie mogę napisać warunku na podstawie wartości? Czy to musi być z kluczem, że muszę napisać warunek?

UPDATE 1: problem polega na tym, że podczas wykonywania $citiesCounterArray[$key], czasami $key odpowiada kluczowi, który nie istnieje w tablicy $citiesCounterArray, ale nie jest zawsze na podstawie danych z mojej pętli. To, czego potrzebuję, to ustawić warunek tak, że jeśli $key istnieje w tablicy, to Uruchom kod, w przeciwnym razie pomiń go.

UPDATE 2: tak to naprawiłem używając array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
 0
Author: Jaime Montoya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-01 18:31:57

Te uwagi są spowodowane tym, że nie masz używanej zmiennej defined i my_index klucz nie był obecny w zmiennej $my_array.

Te ogłoszenia były uruchamiane za każdym razem, ponieważ twoje {[5] } nie jest poprawne, ale prawdopodobnie nie miałeś zgłaszania ogłoszeń na.

Rozwiąż błędy:

$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;

if(isset($my_array["my_index"])){
    echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
}

Inny sposób na to:

ini_set("error_reporting", false)
 -1
Author: Andrei Todorut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 13:09:56

W PHP musisz najpierw zdefiniować zmienną, potem możesz jej użyć.
Możemy sprawdzić, czy zmienna jest zdefiniowana lub nie w bardzo efektywny sposób!.

//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.

if($my_variable_name){

}

//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){

}

Proste Wyjaśnienie

//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
    echo "true";
}else{
    echo "false";
}

//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
    echo "true";
}else{
    echo "false";
}
 -1
Author: Manish Goswami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 02:43:09