Variabile - php "notice undefined variable", "notice undefined index" și "notice undefined

Rulează scriptul PHP și continu să primesc astfel de erori:

Notă: variabila nedefinită: my_variable_name în C: \ wamp \ www \ mypath \ index.php în rândul 10







Notă: Indicele nedefinit: my_index C: \ wamp \ www \ mypath \ index.php în rândul 11

Linile 10 și 11 arată astfel:

Ce înseamnă aceste greșeli?

De ce apar brusc? Am folosit acest scenariu ani de zile și nu am avut niciodată o problemă.

Ce trebuie să fac pentru a le repara?

Aceasta este o întrebare generală de referință, la care oamenii se referă ca un duplicat, în loc să explice problema din nou și din nou. Cred că acest lucru este necesar, deoarece majoritatea răspunsurilor reale la această întrebare sunt foarte specifice.

Discuții legate de meta:

a fost cerut de Pekka 웃 20 mai 17 la 23:08

Este doar o notificare, astfel încât să o utilizați în mod corect, și nu este o tipografie sau ceva de genul asta. - Amir Surnay 20 mai la 17:08

Este posibil ca o variabilă să nu fie inițializată. Inițializați o variabilă dintr-un mesaj sau o intrare sau alt tablou? Dacă da, este posibil să nu aveți câmpuri în acest câmp. Acesta este accesul dvs. - Întrebați 20 mai 17 la ora 23:08

"De ce apar brusc? Am folosit acest script de ani de zile și nu am avut niciodată o problemă. La momentul redactării acestui răspuns, nici unul dintre răspunsurile de mai jos nu rezolvă această problemă. Încep să fiu generos pentru asta. - ChrisJJ 20 mai 17 la 11:08

@ChrisJJ, răspunsul lui Robbie explică foarte bine acest lucru. - Leith 20 mai la 17:08

Ce sa schimbat recent? Ce versiune de php folosiți? Configurația sa schimbat? Acesta poate fi de mai multe probleme care cauzează sursa de eroare, deoarece, de exemplu, și includerea php-dosarul necesar nu mai funcționează, ca, de exemplu, tag-uri deschise scurte nu vor mai fi permise, funcțiile sunt depășite și așa D. -. Fabs 20 mai '17 la 23:08

@Fred presupun că poate fi făcut un argument pentru ambele opțiuni. Există o șansă ca noii veniți să intre pe întreaga linie, inclusiv "Notă:" în interogarea lor de căutare, care sunt sigur că este principalul generator de trafic pentru această problemă. În cazul în care mesajele sunt prezente în întregime, este posibil să se îmbunătățească vizibilitatea în motoarele de căutare - Pekka 웃 20 mai 2008 la 23:08

@ Fred-ii - Solicitarea întrebării, trimiterea imediat a unui răspuns și cererea moderatorului să pună o întrebare că Wiki-ul comunitar ar trebui să funcționeze. Simțiți-vă liber să copiați și să lipiți blocul de responsabilitate de mai sus. - Pekka 웃 20 mai la 17:08

Din înțelepciunea vastă a Manualului PHP

Pe baza valorii implicite a unei variabile neinitializate, este problematică dacă un fișier este inclus în altul, care utilizează același nume de variabilă. Acesta este, de asemenea, principalul risc de securitate cu activarea registrului_global. nivel de eroare E_NOTICE În cazul lucrului cu variabile neinitializate, dar nu și în cazul adăugării elementelor într-o matrice neinitializată. isset () Construcția de limbă poate fi utilizată pentru a determina dacă o variabilă a fost deja inițializată. În plus, soluția empty () este mai potrivită. deoarece nu generează un mesaj de avertizare sau de eroare dacă variabila nu este inițializată.

Dacă variabila nu există, nu se generează niciun avertisment. Aceasta înseamnă că gol () este, în esență, un echivalent scurt. Isset ($ var) || $ var == false.

Acest lucru înseamnă că puteți utiliza numai gol (). pentru a determina dacă o variabilă este setată și, în plus, verifică variabila pentru următoarea, 0, "", null.

Modalități de rezolvare a problemei:

Vă recomandăm: Declarați variabilele dvs., de exemplu, când încercați să adăugați un șir unei variabile nedefinite. Sau utilizați isset () /! Empty (). Pentru a verifica dacă sunt declarate înainte de referință, de exemplu:

Acest lucru a devenit mult mai curat cu PHP 7.0, acum puteți utiliza operatorul de coalescență gol

Setați propriul handler de eroare. Pentru E_NOTICE și redirecționarea mesajelor de la ieșirea standard (posibil la un fișier jurnal):

Dezactivați E_NOTICE din rapoarte. O modalitate rapidă de a exclude numai E_NOTICE:

Înlăturați eroarea cu operatorul @.

Notă. Se recomandă cu tărie implementarea numai a punctului 1.

Această notificare apare atunci când încercați (sau PHP) să accesați un indice matrice nedefinit.

Modalități de rezolvare a problemei:

Verificați dacă indicatorul există înainte de a fi accesat. Pentru aceasta puteți folosi isset () sau array_key_exists ():

Designul limbii list () poate genera aceasta atunci când se testează pentru a accesa un indice matrice care nu există:

Două variabile sunt folosite pentru a accesa două elemente ale matricei, dar există doar un element al matricei, indicele 0. Prin urmare, va genera:

Notă: Offset nedefinat: 1

Notele de mai sus apar deseori când lucrezi cu $ _POST. $ _GET sau $ _SESSION. Pentru $ _POST și $ _GET, trebuie doar să verificați dacă indexul există sau nu înainte de a le utiliza. Pentru $ _SESSION, trebuie să vă asigurați că sesiunea a început cu session_start () și că există și indexul.

De asemenea, rețineți că toate cele trei variabile sunt superglobale. Aceasta înseamnă că acestea trebuie să fie scrise cu majuscule.

@ dieselpower44 Câteva considerente: "Operatorul taci" (@) are unele probleme de performanță. În plus, deoarece suprimă toate erorile dintr-o anumită zonă, folosirea acesteia fără griji poate masca mesajele pe care doriți să le vedeți. - IMSoP 20 mai la 17:07

Problemele de ascundere NU este o modalitate de a rezolva probleme. Elementele # 2. # 4 pot fi folosite numai pe serverele de producție și nu în general. - Salman A 20 mai la 17:07

Este posibil să dezactivați mesajul inline (nu în handler), dacă este folosit și un handler de eroare special? $ var = @ $ _ GET ['nonexisting']; încă provoacă o notificare. - Alph.Dev 20 mai la 17:07

De ce se recomandă utilizarea 1. valoarea $ = isset ($ _ POST ['value']). $ _POST ['value']. ''; în loc să folosească valoarea 4. $ value = @ $ _ POST ['value']; - forsvunnet 20 mai 17 la 11:07 pm

@twistedpixel Aceste 4 moduri sunt independente, nu este un ghid în 4 pași. Deci, dacă vă decideți să utilizați metoda 4, înseamnă că nu ați implementat primele 3 metode, astfel încât nu ați suprimat erorile. - Aycan Yașıt 20 mai la 17:07







Utilizarea isset () nu funcționează pentru mine. Dar array_key_exists () și @ funcționează - Mugoma J. Okomba 20 mai 2008 la 23:07

Nu recomand utilizarea isset () pentru array-uri, de exemplu $ str = '111'; (Știu că trebuie să fie o matrice) isset ($ str [0]) va reveni la adevărat. Este mai bine să folosiți array_key_exist () în loc de isset () - Mb Rostami Mai 20 '17 la 23:07

Și (adesea nu se recomandă), alternativa este operatorul de suprimare a erorilor @. Acesta este un design de limbă specială care închide notificările și avertismentele nedorite, dar trebuie folosit cu prudență.

În primul rând, el ia pedeapsa pentru controlul microprocesorului asupra utilizării issetului. Acest lucru nu este măsurabil în aplicațiile reale, dar ar trebui luat în considerare în iterațiile grele de date. În al doilea rând, aceasta poate interfera cu depanare, dar în același timp suprimata manipulatorii de eroare sunt de fapt transmise erori de utilizator (spre deosebire de expresii decorate cu isset).

Răspuns dat mario 20 mai 17 la 23:07

Dacă vă întrebați ce afectează performanța, în acest articol este bine descris. derickrethans.nl/. - Gajus 20 mai 17 la 11:07

Mulțumesc @mario, mă interesează. Dacă cineva era destul de bun pentru a compara cele două. 3v4l.org/CYVOn/perf#tabs 3v4l.org/FLp3D/perf#tabs În conformitate cu acest test, se pare că acestea sunt identice (rețineți că zoom). - Gajus 20 mai 17 la 11:07

Am testat cu PHP 5.4, iar performanța este încă rea. - Brynner Ferreira 20 mai la 17:07

În general, din cauza "programării proaste" și a posibilității de erori acum sau mai târziu.

  1. Dacă aceasta este o eroare, mai întâi efectuați asignarea corectă a variabilei: $ varname = 0;
  2. Dacă acest lucru este într-adevăr determinat uneori, verificați acest lucru: if (isset ($ varname)). înainte de ao folosi
  3. Dacă aceasta se datorează ortografiei incorecte, reparați-o.
  4. Este posibil chiar să întoarceți avertismente în setările dvs. PHP

răspunsul dat de Erik la 20 mai 17 la 23:07

Nu opriți avertizarea. Limbile stricte de multe ori înseamnă „poate fi o eroare, verificați mai bine această linie de două ori“ - în limba permisă în PHP, de multe ori înseamnă „acest cod este o prostie și este dictat de eroare, voi încerca să facă un anumit sens, dar este mai bine să-l corecteze cât mai curând posibil. " - delnan 20 mai 17 la 23:07

Deși sunt de acord cu primele trei puncte, numărul 4 este pur și simplu greșit. Ascunderea problemei nu va face ca aceasta să dispară și acest lucru poate provoca chiar și probleme suplimentare în viitor. - Valentin Flachsel 20 mai la 17:07

@Freek este absolut adevărat, dar în unele scenarii (scenariu achiziționat, la zero cunoștințe tehnice, ar trebui să fie executați pentru a doua zi.) Este soluția pentru benzi transportoare - foarte rău, este întotdeauna necesar să se sublinieze, dar opțiunea - Pekka 웃 20 mai în '17 23:07

Bandă de banda este bună. uneori. Din punct de vedere istoric, avertismentele au fost transformate în setări standard ale PHP, dar parametrii defult au devenit mai stricți. Păcat, mulți se întorc la setările vechi, pentru a nu deranja clienții. - Erik 20 mai la 17:07

Ca răspuns la întrebarea: "De ce apar brusc? Am folosit acest scenariu de mai mulți ani și nu am avut niciodată o problemă.

Pentru majoritatea site-urilor, este foarte des folosit mesajul de eroare implicit "Afișați toate erorile, dar nu" notificările "și" depășite ". Acesta va fi instalat în php.ini și va fi aplicat tuturor site-urilor de pe server. Aceasta înseamnă că aceste "notificări" folosite în exemple vor fi ascunse (ascunse), în timp ce alte erori considerate mai critice vor fi afișate / înregistrate.

Un alt parametru critic este faptul că erorile pot fi ascunse (adică, display_errors setate la "off" sau "syslog").

În acest caz, fie raportul de eroare va fi modificat pentru a afișa, de asemenea, notificări (ca în exemple) și / sau ca setările au fost modificate pe display_errors pe ecran (în loc să le suprime / înregistrate).

De ce s-au schimbat?

Răspunsul evident / simplu este că cineva a corectat oricare dintre acești parametri în php.ini, sau o versiune actualizată a PHP utilizează acum un alt php.ini din mai devreme. Acesta este primul loc de căutat.

Cu toate acestea, este posibil să eliminați și acești parametri în

  • .htconf (configurația serverului web, inclusiv gazde virtuale și subconfigurații) *
  • .htaccess
  • În codul php

Și oricare dintre ele ar putea fi schimbat.

Există, de asemenea, complicație suplimentară că configurația serverului Web poate activa / dezactiva directiva .htaccess, cu toate acestea, dacă aveți directive în .htaccess, care pornesc dintr-o dată funcționare / oprire, trebuie să-l verifice.

(.htconf / .htaccess presupune că rulezi ca apache.În cazul în care linia de comandă se execută, acest lucru nu se va aplica dacă utilizați IIS sau un alt server web, atunci va trebui să verificați aceste config-uri)

  • Verificați dacă directivele php.ini error_reporting și display_errors nu s-au modificat sau nu utilizați un alt php.ini mai devreme.
  • Verificați erorile de raport și erorile de afișare ale directivei php în .htconf (sau vhosts, etc.) Nu sa schimbat
  • Verificați că directivele php error_reporting și display_errors în .htaccess nu sunt modificate
  • Dacă aveți o directivă în .htaccess, verificați dacă acestea sunt permise în fișierul .htconf
  • În cele din urmă, verificați codul; Poate o bibliotecă fără legătură; Pentru a vedea dacă raportarea erorilor și erorile de afișare sunt setate la directivele php.

răspunsul dat de Robbie la 20 mai 17 la 23:07

De ce se întâmplă acest lucru?

În timp, PHP a devenit mai orientat spre limbă. Setările dezactivate anterior în mod prestabilit sunt acum activate în mod prestabilit. Un exemplu excelent este E_STRICT. care a fost activat implicit, ca în PHP 5.4.0.

În plus, conform documentației PHP, prin defualt, E_NOTICE este dezactivat în php.ini. Documentele PHP recomandă includerea acestora în scopuri de depanare. Cu toate acestea, când încărc PHP din depozitul Ubuntu și din stiva Windows BitNami, văd altceva.

Rețineți că, în mod implicit, error_reporting este setat implicit la valoarea de producție, nu la valoarea implicită. Acest lucru este oarecum confuz și nu este documentat în afara php.ini, așa că nu am verificat-o pe alte distribuții.

Cu toate acestea, pentru a răspunde la întrebarea dvs., această eroare apare atunci când nu a apărut mai devreme, deoarece:

Ați instalat PHP, iar setările implicite noi sunt puțin documentate, dar nu excludeți E_NOTICE.

Ce pot face?

Dezactivați E_NOTICE. prin copierea valorii "Valoare implicită" E_ALL

Dezactivați E_NOTICE la nivel de fișier sau de folder. Acest lucru poate fi preferabil dacă aveți un cod depășit, dar doriți să faceți ceva "corect" altfel. Pentru aceasta, trebuie să consultați Apache2, nginx sau orice alt server ales de dumneavoastră. În Apache, ar trebui să utilizați php_value înăuntru .

Rescrie codul pentru ao face mai curat. Dacă trebuie să o facă în timpul tranziției la un mediu de producție și nu doriți ca cineva să vadă greșelile, asigurați-vă că opriți afișarea erorilor și doar înregistra greșelile lor (a se vedea. Display_errors și log_errors în .ini PHP și configura serverul) .

E_DEPRECATED. pentru a înțelege ce poate merge prost în viitor. Veți vedea o mulțime de erori nefamiliare, dar acest lucru vă va opri de problemele neplăcute atunci când aveți nevoie să actualizați PHP în viitor.

Ce înseamnă?

Variabila nedefinită: my_variable_name - Aceasta se întâmplă atunci când variabila nu a fost definită înainte de utilizare. Când scriptul PHP este executat, acesta are valoarea internă NULL. Cu toate acestea, în ce scenariu ar trebui să verificați variabila înainte de ao determina? În cele din urmă, acesta este argumentul pentru "codul nedorit". Ca dezvoltator, pot spune că îmi place când văd un proiect open source unde variabilele sunt definite ca fiind înalte în câmpurile lor, deoarece pot fi definite. Acest lucru facilitează definirea variabilelor care vor apărea în viitor și facilitează citirea / studierea codului.

Indice nedefinit: my_index - acest lucru se întâmplă atunci când încercați să accesați o valoare într-un matrice și nu există. Pentru a preveni această eroare, efectuați o verificare condiționată.

O altă opțiune este de a declara o matrice goală în partea superioară a funcției. Acest lucru nu este întotdeauna posibil.

(Sfat suplimentar)

  • Când am fugit în aceste și alte probleme, am folosit NetBeans IDE (gratuit), și mi-a dat o mulțime de avertismente și notificări. Unele dintre ele oferă sfaturi utile. Aceasta nu este o cerință și nu mai folosesc IDE, cu excepția proiectelor mari. În zilele noastre sunt mai vim persoană :).

răspuns dat de smcjones 20 mai 17 la 23:08







Trimiteți-le prietenilor: