Korzystam ze skryptu PHP i nadal otrzymuję błędy, takie jak:
Uwaga: Niezdefiniowana zmienna: moja_nazwa_zmiennej w C: \ wamp \ www \ mypath \ index.php w linii 10
Uwaga: Niezdefiniowany indeks: mój_indeks C: \ wamp \ www \ mypath \ index.php w linii 11
Linia 10 i 11 wygląda następująco:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
Co oznaczają te komunikaty o błędach?
Dlaczego pojawiają się nagle? Używałem tego skryptu od lat i nigdy nie miałem żadnych problemów.
Jak je naprawić?
To jest ogólne pytanie referencyjne dla osób, które należy połączyć jako duplikat, bez konieczności ciągłego wyjaśniania problemu. Uważam, że jest to konieczne, ponieważ większość rzeczywistych odpowiedzi na ten temat jest bardzo konkretna.
Powiązana meta dyskusja:
and-notice-undef
, tylko sugestia, aby adres URL nie został odcięty. Może nawet usunięcie (zbyt wielu) cytatów. LubPHP: “Undefined variable/index/offset” notices
and-notice-undef
. To była tylko (kilka) sugestia. To po prostu się powtarzaNotice: Undefined
.Odpowiedzi:
Uwaga: Niezdefiniowana zmienna
Z ogromnej mądrości podręcznika PHP :
Z dokumentacji PHP :
Oznacza to, że można użyć wyłącznie
empty()
w celu określenia, czy zmienna jest ustawiona, a ponadto sprawdza zmienną przed Poniżej0
,0.0
,""
,"0"
,null
,false
lub[]
.Przykład:
Przetestuj powyższy fragment kodu w internetowym edytorze PHP 3v4l.org
Chociaż PHP nie wymaga deklaracji zmiennej, zaleca się ją, aby uniknąć niektórych luk w zabezpieczeniach lub błędów, w których zapomniałby podać wartość zmiennej, która będzie używana później w skrypcie. To, co PHP robi w przypadku niezadeklarowanych zmiennych, powoduje błąd o bardzo niskim poziomie
E_NOTICE
, który nie jest nawet domyślnie zgłaszany, ale Podręcznik zaleca, aby zezwolić na to podczas programowania.Sposoby rozwiązania problemu:
Zalecane: zadeklaruj zmienne, na przykład, gdy próbujesz dołączyć ciąg do niezdefiniowanej zmiennej. Lub użyj
isset()
/,!empty()
aby sprawdzić, czy zostały zadeklarowane przed odwołaniem się do nich, jak w:To stało się znacznie czystsze od PHP 7.0, teraz możesz użyć operatora zerowania koalesce :
Ustaw niestandardową procedurę obsługi błędów dla E_NOTICE i przekieruj wiadomości poza standardowe wyjście (być może do pliku dziennika):
Wyłącz E_NOTICE z raportowania. Szybki sposób na wykluczenie
E_NOTICE
to:Pomiń błąd za pomocą operatora @ .
Uwaga: Zdecydowanie zaleca się wdrożenie tylko punktu 1.
Uwaga: Niezdefiniowany indeks / Niezdefiniowane przesunięcie
To powiadomienie pojawia się, gdy Ty (lub PHP) próbujesz uzyskać dostęp do niezdefiniowanego indeksu tablicy.
Sposoby rozwiązania problemu:
Sprawdź, czy indeks istnieje, zanim uzyskasz do niego dostęp. W tym celu możesz użyć
isset()
lubarray_key_exists()
:Konstrukcja języka
list()
może to wygenerować, gdy próbuje uzyskać dostęp do nieistniejącego indeksu tablicowego:Dwie zmienne są używane do uzyskania dostępu do dwóch elementów tablicy, jednak istnieje tylko jeden element tablicy, indeks
0
, więc to wygeneruje:$_POST
/$_GET
/$_SESSION
zmiennaPowyższe uwagi pojawiają się często podczas pracy z
$_POST
,$_GET
lub$_SESSION
. Na$_POST
i$_GET
po prostu trzeba sprawdzić, czy indeks istnieje lub przed ich użyciem nie. Dla$_SESSION
trzeba upewnić się, że sesja rozpoczęła sięsession_start()
i że indeks istnieje również.Zauważ też, że wszystkie 3 zmienne są superglobalami i są dużymi literami.
Związane z:
źródło
@
) ma pewne problemy z wydajnością. Ponadto, ponieważ pomija wszystkie błędy w określonym zakresie, używanie go bez ostrożności może maskować wiadomości, które chciałbyś widzieć.$var = @$_GET['nonexisting'];
wciąż powoduje zawiadomienie ..$value = isset($_POST['value']) ? $_POST['value'] : '';
zamiast używania 4.$value = @$_POST['value'];
?Spróbuj tych
Lub jako szybkie i brudne rozwiązanie:
Uwaga na temat sesji:
Podczas korzystania z sesji
session_start();
należy umieścić je we wszystkich plikach korzystających z sesji.http://php.net/manual/en/features.sessions.php
źródło
E_NOTICE
zphp.ini
pliku konfiguracyjnego, wykonajerror_reporting = (E_ALL & ~E_NOTICE)
Błąd wyświetlania
@
operatoraW przypadku niepożądanych i nadmiarowych powiadomień można użyć
@
operatora dedykowanego , aby » ukryć « niezdefiniowane komunikaty zmiennych / indeksów.isset?:
lub??
supresji. Powiadomienia nadal mogą być rejestrowane. I można wskrzesić@
ukryte powiadomienia za pomocą:set_error_handler("var_dump");
if (isset($_POST["shubmit"]))
w swoim początkowym kodzie.@
lubisset
dopiero po zweryfikowaniu funkcjonalności.@
jest głównie akceptowalny dla$_GET
/$_POST
parametrów wejściowych, szczególnie jeśli są one opcjonalne .A ponieważ obejmuje to większość takich pytań, omówmy najczęstsze przyczyny:
$_GET
/$_POST
/$_REQUEST
niezdefiniowane wejściePierwszą rzeczą, jaką robisz, gdy napotykasz niezdefiniowany indeks / offset, jest sprawdzanie literówek:
$count = $_GET["whatnow?"];
Po drugie, jeśli zawiadomienie nie ma oczywistej przyczyny, użyj
var_dump
lubprint_r
zweryfikuj wszystkie tablice wejściowe pod kątem ich bieżącej zawartości:Oba ujawnią, czy skrypt został wywołany z właściwymi parametrami lub w ogóle.
Alternatywnie lub dodatkowo użyj devtools przeglądarki ( F12) i sprawdź kartę sieci pod kątem żądań i parametrów:
Parametry POST i GET zostaną wyświetlone osobno.
Dla
$_GET
parametrów można również zerknąć naQUERY_STRING
INPHP ma pewne zasady łączenia niestandardowych nazw parametrów w superglobale. Apache może również trochę przepisać. Możesz także w ten sposób spojrzeć na dostarczone nieprzetworzone
$_COOKIES
i inne nagłówki żądań HTTP.Bardziej oczywiście spójrz na pasek adresu przeglądarki, aby uzyskać parametry GET :
http://example.org/script.php?id=5&sort=desc
Do
name=value
pary po?
znakiem zapytania są zapytania (GET) parametry. Tak więc ten adres URL może tylko przynieść$_GET["id"]
i$_GET["sort"]
.Na koniec sprawdź swoje
<form>
i<input>
deklaracje, jeśli oczekujesz parametru, ale go nie otrzymujesz.<input name=FOO>
id=
Lubtitle=
atrybut nie wystarczyć.method=POST
Formularz powinien wypełnić$_POST
.method=GET
(lub pominięcie go) dałoby$_GET
zmienne.action=script.php?get=param
za pomocą $ _GET i pozostałychmethod=POST
pól w $ _POST obok.$_REQUEST['vars']
ponowne użycie , które łączy parametry GET i POST.Jeśli korzystasz z mod_rewrite, powinieneś sprawdzić zarówno,
access.log
jak i umożliwićRewriteLog
wykrycie nieobecnych parametrów.$_FILES
$_FILES["formname"]
.enctype=multipart/form-data
method=POST
w<form>
deklaracji.$_COOKIE
$_COOKIE
Tablica nie jest wypełniana tuż posetcookie()
, ale tylko na każde żądanie nawiązanie HTTP.źródło
Zasadniczo z powodu „złego programowania” i możliwości popełnienia błędów teraz lub później.
if (isset($varname))
przed użyciemźródło
Oznacza to, że testujesz, oceniasz lub drukujesz zmienną, do której jeszcze niczego nie przypisałeś. Oznacza to, że albo masz literówkę, albo musisz najpierw sprawdzić, czy zmienna została zainicjowana. Sprawdź ścieżki logiczne, może być ustawione w jednej ścieżce, ale nie w innej.
źródło
Nie chciałem wyłączać powiadomienia, ponieważ jest to pomocne, ale chciałem unikać zbyt częstego pisania.
Moim rozwiązaniem była ta funkcja:
Więc jeśli chcę odwoływać się do $ name i echo, jeśli istnieje, po prostu piszę:
W przypadku elementów tablicy:
Na stronie, jeśli chcę odwoływać się do $ _REQUEST ['name']:
źródło
$foo = "BABAR"; ifexists('foo');
ogólnie zwróci wartość null. (Kursywa to rozdziałyif( !empty($user) and !empty($location) ) echo "hello $user ..."
Najlepszym sposobem na uzyskanie ciągu wejściowego jest:
Ten jednowarstwowy jest prawie równoważny z:
Jeśli absolutnie chcesz wartość ciągu , podobnie jak:
źródło
Jest tak, ponieważ zmienna „$ user_location” nie jest definiowana. Jeśli używasz dowolnej pętli if, w której deklarujesz zmienną „$ user_location”, musisz także mieć pętlę else i zdefiniować ją. Na przykład:
Powyższy kod spowoduje błąd, ponieważ Pętla if nie jest spełniona, aw pętli else „$ user_location” nie został zdefiniowany. Nadal poproszono PHP o echo zmiennej. Aby zmodyfikować kod, musisz wykonać następujące czynności:
źródło
W odpowiedzi na „” Dlaczego nagle się pojawiają? Używałem tego skryptu od lat i nigdy nie miałem żadnych problemów ”.
Bardzo często w większości witryn działa „domyślne” raportowanie błędów „Pokaż wszystkie błędy, ale nie„ powiadomienia ”i„ przestarzałe ”. Zostanie to ustawione w php.ini i będzie dotyczyć wszystkich stron na serwerze. Oznacza to, że te „powiadomienia” użyte w przykładach zostaną ukryte (ukryte), podczas gdy inne błędy, uważane za bardziej krytyczne, zostaną pokazane / zarejestrowane.
Innym krytycznym ustawieniem jest to, że błędy mogą być ukryte (tj.
display_errors
Ustawione na „off” lub „syslog”).W tym przypadku wydarzy się to, że albo
error_reporting
zostały zmienione, aby wyświetlały również powiadomienia (jak w przykładach) i / lub ustawienia zostały zmienionedisplay_errors
na ekran (w przeciwieństwie do ich pomijania / rejestrowania).Dlaczego się zmienili?
Oczywistą / najprostszą odpowiedzią jest to, że ktoś zmienił którekolwiek z tych ustawień w php.ini lub ulepszona wersja PHP używa teraz innego php.ini niż wcześniej. To pierwsze miejsce do obejrzenia.
Można jednak również zastąpić te ustawienia w
i każdy z nich mógł również zostać zmieniony.
Istnieje również dodatkowa komplikacja polegająca na tym, że konfiguracja serwera WWW może włączać / wyłączać dyrektywy .htaccess, więc jeśli masz dyrektywy w .htaccess, które nagle zaczynają / kończą działanie, musisz to sprawdzić.
(.htconf / .htaccess zakłada, że działasz jako apache. Jeśli uruchomisz wiersz poleceń, to nie będzie miało zastosowania; jeśli uruchomisz IIS lub inny serwer WWW, musisz odpowiednio sprawdzić te konfiguracje)
Podsumowanie
error_reporting
idisplay_errors
php w php.ini nie uległy zmianie lub nie używasz innej wersji php.ini niż wcześniej.error_reporting
idisplay_errors
php w .htconf (lub vhosts itp.) Nie uległy zmianieerror_reporting
idisplay_errors
php w .htaccess nie uległy zmianieerror_reporting
idisplay_errors
dyrektyw php zostały tam ustawione.źródło
szybka poprawka polega na przypisaniu zmiennej do wartości null u góry kodu
źródło
Kiedyś przeklinałem ten błąd, ale pomocne może być przypomnienie, abyś uniknął wprowadzania danych przez użytkownika.
Na przykład, jeśli uważasz, że to sprytne, skróć kod:
... Pomyśl jeszcze raz! Lepszym rozwiązaniem jest:
(Używam niestandardowej
html()
funkcji do ucieczki znaków, twój przebieg może się różnić)źródło
W PHP 7.0 można teraz używać operatora koalescencji Null:
Równa:
Podręcznik PHP PHP 7.0
źródło
if (is_array($my_array['idontexist'] ?? '')) { dosomething(); }
isset()
, jeśli zdaszis_array()
- co jest wartością logiczną, nastąpi nieoczekiwane zachowanie.Używam zawsze własnej przydatnej funkcji exst (), która automatycznie deklaruje zmienne.
Twój kod będzie -
źródło
W bardzo prostym języku .
Błąd polega na tym, że używasz zmiennej,
$user_location
która nie została wcześniej zdefiniowana i nie ma żadnej wartości. Zalecam więc zadeklarowanie tej zmiennej przed użyciem , na przykład:$user_location = '';
Lub
$user_location = 'Los Angles';
Jest to bardzo częsty błąd, z którym możesz się spotkać. Nie martw się, po prostu zadeklaruj zmienną i ciesz się kodowaniem .
źródło
dlaczego nie uprościć sprawy?
źródło
DLACZEGO TO SIĘ DZIEJE?
Z czasem PHP stało się językiem bardziej skoncentrowanym na bezpieczeństwie. Ustawienia, które wcześniej były domyślnie wyłączone, teraz są domyślnie włączone. Doskonałym tego przykładem jest
E_STRICT
, który został domyślnie włączony od wersji PHP 5.4.0 .Ponadto, zgodnie z dokumentacją PHP, domyślnie
E_NOTICE
jest wyłączona w php.ini. Dokumenty PHP zalecają włączenie go w celu debugowania . Jednak gdy pobieram PHP z repozytorium Ubuntu - i ze stosu Windows BitNami - widzę coś innego.Zauważ, że
error_reporting
tak naprawdę domyślnie jest ustawiona wartość produkcyjna, a nie domyślna wartość „domyślna”. Jest to nieco mylące i nie jest udokumentowane poza php.ini, więc nie sprawdziłem tego w innych dystrybucjach.Aby odpowiedzieć na twoje pytanie, ten błąd pojawia się teraz, gdy nie pojawiał się wcześniej, ponieważ:
Zainstalowałeś PHP i nowe ustawienia domyślne są nieco słabo udokumentowane, ale nie wykluczają
E_NOTICE
.E_NOTICE
ostrzeżenia takie jak niezdefiniowane zmienne i niezdefiniowane indeksy faktycznie pomagają uczynić kod czystszym i bezpieczniejszym. Mogę ci powiedzieć, że lata temu utrzymywanieE_NOTICE
włączone zmusiło mnie do zadeklarowania moich zmiennych. Dzięki temu dużo łatwiej było nauczyć się C, ponieważ nie deklarowanie zmiennych jest znacznie bardziej uciążliwe.CO MOGĘ Z TYM ZROBIĆ?
Wyłącz
E_NOTICE
, kopiując „Wartość domyślną”E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
i zastępując ją tym, co jest obecnie niezakomentowane po zalogowaniu do znaku równościerror_reporting =
. Uruchom ponownie Apache lub PHP, jeśli używasz CGI lub FPM. Upewnij się, że edytujesz „właściwy” plik php.ini. Prawidłowym będzie Apache, jeśli używasz PHP z Apache, fpm lub php-fpm, jeśli używasz PHP-FPM, cgi, jeśli uruchamiasz PHP-CGI itp. To nie jest zalecana metoda, ale jeśli masz starszy kod, który będzie być wyjątkowo trudnym do edycji, to może być twój najlepszy zakład.Wyłącz
E_NOTICE
na poziomie pliku lub folderu. Może to być lepsze, jeśli masz jakiś starszy kod, ale chcesz robić rzeczy „we właściwy” sposób. Aby to zrobić, powinieneś skonsultować się z Apache2, Nginx lub jakimkolwiek innym wybranym serwerem. W Apache można użyćphp_value
wewnątrz<Directory>
.Przepisz kod, aby był czystszy. Jeśli musisz to zrobić podczas przenoszenia do środowiska produkcyjnego lub nie chcesz, aby ktoś zobaczył Twoje błędy, upewnij się, że wyłączasz wyświetlanie błędów i rejestrujesz tylko błędy (zobacz
display_errors
ilog_errors
w php.ini i ustawieniach serwera) .Aby rozwinąć opcję 3: Jest to ideał. Jeśli możesz wybrać tę trasę, powinieneś. Jeśli początkowo nie wybierasz tej trasy, rozważ przemieszczenie tej trasy, testując kod w środowisku programistycznym. Gdy już to robisz, pozbądź się
~E_STRICT
i~E_DEPRECATED
zobacz, co może pójść nie tak w przyszłości. Zobaczysz Mnóstwo nieznanych błędów, ale powstrzyma Cię to od nieprzyjemnych problemów, kiedy będziesz musiał zaktualizować 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. Kiedy skrypt PHP jest wykonywany, wewnętrznie przyjmuje po prostu wartość zerową. Jednak w jakim scenariuszu trzeba by sprawdzić zmienną przed jej zdefiniowaniem? Ostatecznie jest to argument za „niechlujnym kodem”. Jako programista mogę powiedzieć, że uwielbiam, gdy widzę projekt typu open source, w którym zmienne są zdefiniowane tak wysoko, jak to możliwe. Ułatwia określenie, które zmienne będą się pojawiać w przyszłości, oraz ułatwia czytanie / uczenie się kodu.Undefined index: my_index
- Dzieje się tak, gdy próbujesz uzyskać dostęp do wartości w tablicy i nie istnieje ona. Aby zapobiec temu błędowi, wykonaj sprawdzenie warunkowe.Inną opcją jest zadeklarowanie pustej tablicy u góry funkcji. Nie zawsze jest to możliwe.
(dodatkowa wskazówka)
vim
dzisiejszych czasach jestem bardziej osobą :).źródło
niezdefiniowany indeks oznacza na przykład w tablicy, o którą prosiłeś o niedostępny indeks tablicy
niezdefiniowana zmienna oznacza, że użyto całkowicie nieistniejącej zmiennej lub która nie jest zdefiniowana lub zainicjowana na przykład przez tę nazwę
niezdefiniowane przesunięcie oznacza w tablicy, o którą prosiłeś o nieistniejący klucz. A rozwiązaniem tego jest sprawdzenie przed użyciem
źródło
W odniesieniu do tej części pytania:
Brak jednoznacznych odpowiedzi, ale oto kilka możliwych wyjaśnień, dlaczego ustawienia mogą „nagle” zmienić:
Zaktualizowałeś PHP do nowszej wersji, która może mieć inne ustawienia domyślne dla raportowania błędów, błędów wyświetlania lub innych odpowiednich ustawień.
Usunąłeś lub wprowadziłeś jakiś kod (być może zależny), który ustawia odpowiednie ustawienia w czasie wykonywania, używając
ini_set()
luberror_reporting()
(wyszukaj je w kodzie)Zmieniłeś konfigurację serwera WWW (zakładając tutaj apache):
.htaccess
pliki i konfiguracje vhostów mogą również manipulować ustawieniami php.Zwykle powiadomienia nie są wyświetlane / zgłaszane (patrz instrukcja PHP ), więc możliwe jest, że podczas konfigurowania serwera plik php.ini nie mógł zostać załadowany z jakiegoś powodu (uprawnienia do pliku?) I masz ustawienia domyślne . Później „błąd” został rozwiązany (przez przypadek), a teraz MOŻE załadować poprawny plik php.ini z zestawem raportowania błędów wyświetlającym powiadomienia.
źródło
Jeśli pracujesz z klasami, musisz upewnić się, że odwołujesz się do zmiennych członka za pomocą
$this
:źródło
Innym powodem, dla którego zostanie wyświetlone niezdefiniowane powiadomienie o indeksie, jest pominięcie kolumny w zapytaniu do bazy danych.
To znaczy:
Następnie próbuje uzyskać dostęp do większej liczby kolumn / wierszy w pętli.
To znaczy:
lub w
while
pętli:Należy również zauważyć, że w systemach * NIX OS i Mac OS X rozróżniana jest wielkość liter.
Zapoznaj się z poniższymi pytaniami i odpowiedziami na stosie:
Czy w nazwach tabel w MySQL rozróżniana jest wielkość liter?
W tabelach mysql rozróżniana jest wielkość liter
MySql - rozróżnianie wielkości liter w tabelach na różnych serwerach
źródło
Używanie trójki jest proste, czytelne i czyste:
Przed PHP 7
Przypisz zmienną do wartości innej zmiennej, jeśli jest ustawiona, w przeciwnym razie przypisz
null
(lub dowolnąinną domyślną wartość):PHP 7+
To samo, z wyjątkiem korzystania z Null Coalescing Operator . Nie ma już potrzeby wywoływania,
isset()
ponieważ jest ono wbudowane, i nie trzeba podawać zmiennej do zwrócenia, ponieważ zakłada się, że zwróci wartość sprawdzanej zmiennej:Oba zatrzymają powiadomienia od pytania PO i oba są dokładnym odpowiednikiem:
Jeśli nie potrzebujesz ustawiać nowej zmiennej, możesz bezpośrednio użyć zwróconej wartości trójki, takiej jak
echo
argumenty funkcji, itd:Echo:
Funkcjonować:
Powyższe będzie działać tak samo z tablicami, w tym sesjami itp., Zamieniając sprawdzaną zmienną na np .:
$_SESSION['checkMe']
lub jak wiele poziomów potrzebujesz, np .:
$clients['personal']['address']['postcode']
Tłumienie:
Możliwe jest pomijanie powiadomień PHP za pomocą
@
lub zmniejszanie poziomu zgłaszania błędów, ale to nie rozwiązuje problemu , po prostu przestaje być zgłaszane w dzienniku błędów. Oznacza to, że Twój kod nadal próbował użyć zmiennej, która nie została ustawiona, co może oznaczać, że coś nie działa zgodnie z przeznaczeniem - w zależności od tego, jak istotna jest brakująca wartość.Naprawdę powinieneś sprawdzić ten problem i odpowiednio go obsłużyć, albo dostarczając inny komunikat, albo nawet zwracając wartość zerową 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.
źródło
Jedną z częstych przyczyn zmiennej nieistniejącej po przesłaniu formularza HTML jest to, że element formularza nie jest zawarty w
<form>
znaczniku:Przykład: element nie zawarty w
<form>
Przykład: element zawarty w
<form>
źródło
Prawdopodobnie korzystałeś ze starej wersji PHP do tej pory, a teraz zaktualizowałeś PHP, dlatego od lat działa bezbłędnie. do PHP4 nie było błędu, jeśli używasz zmiennej bez jej zdefiniowania, ale od PHP5 wyrzuca ona błędy dla kodów takich jak wspomniane w pytaniu.
źródło
Podczas pracy z plikami wymagany jest odpowiedni kod i metoda POST, która wyzwoli niezdefiniowane powiadomienie o indeksie, jeśli którekolwiek z nich nie zostanie zawarte w formularzu.
Podręcznik zawiera następującą podstawową składnię:
HTML
PHP
Odniesienie:
źródło
Zadałem pytanie na ten temat i zostałem skierowany do tego postu z komunikatem:
Tutaj dzielę się moim pytaniem i rozwiązaniem:
To jest błąd:
Problem stanowi linia 154. Oto co mam w linii 154:
Myślę, że problem polega na tym, że piszę, jeśli warunki dla zmiennej
$city
, która nie jest kluczem, ale wartością w$key => $city
. Po pierwsze, czy możesz potwierdzić, czy to jest przyczyną ostrzeżenia? Po drugie, jeśli to jest problem, dlaczego nie mogę napisać warunku na podstawie wartości? Czy to musi być klucz, który muszę napisać warunek?AKTUALIZACJA 1: Problem polega na tym, że podczas wykonywania
$citiesCounterArray[$key]
czasami$key
odpowiada on kluczowi, który nie istnieje w$citiesCounterArray
tablicy, ale nie zawsze tak jest w oparciu o dane mojej pętli. Potrzebuję ustawić warunek, aby jeśli$key
istnieje w tablicy, uruchom kod, w przeciwnym razie pomiń go.AKTUALIZACJA 2: Tak to naprawiłem, używając
array_key_exists()
:źródło
Błędy te występują zawsze, gdy używamy zmiennej, która nie jest ustawiona.
Najlepszym sposobem radzenia sobie z nimi jest ustawianie raportowania błędów podczas programowania.
Aby ustawić raportowanie błędów:
Na serwerach produkcyjnych raportowanie błędów jest wyłączone, dlatego nie otrzymujemy tych błędów.
Na serwerze deweloperskim możemy jednak ustawić raportowanie błędów.
Aby pozbyć się tego błędu, widzimy następujący przykład:
Możemy zainicjować zmienne
NULL
przed przypisaniem ich wartości lub użyciem.Możemy więc zmodyfikować kod jako:
Nie zakłóci to żadnej logiki programu i nie wygeneruje Powiadomienia, nawet jeśli
$test
nie ma wartości.Zasadniczo zawsze lepiej jest WŁĄCZYĆ raportowanie błędów w celu opracowania.
I napraw wszystkie błędy.
W przypadku produkcji raportowanie błędów powinno być wyłączone.
źródło
Te powiadomienia są spowodowane tym, że nie masz użytej zmiennej,
defined
amy_index
klucz nie był obecny w$my_array
zmiennej.Te powiadomienia były uruchamiane za każdym razem, ponieważ Twoje dane
code
nie są poprawne, ale prawdopodobnie nie masz włączonego raportowania powiadomień.Rozwiąż błędy:
Innym sposobem na uzyskanie tego:
źródło
W PHP potrzebujesz pięści, aby zdefiniować zmienną, po której możesz jej użyć.
Możemy sprawdzić, czy zmienna jest zdefiniowana lub nie w bardzo wydajny sposób!
Proste objaśnienie
źródło