Cum ne citim erorile de PHP

Secţiune dedicată începatorilor.

Moderatori: Moderatori, Start Moderator

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4830
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Cum ne citim erorile de PHP

Mesajde vectorialpx » Vin Dec 07, 2012 1:01 pm

Ma gandesc sa fac o fapta buna, sa salvez ceva timp pentru cei care
nu stiu sa citeasca erorile primite de la PHP.

Erorile sunt de urmatoarele tipuri:
1. Notice
2. Warning
3. Deprecated
4. Parse
5. Fatal
6. Strict standard

E posibil sa fi omis un tip sau doua, dar astea sunt cele importante

Ele arata asa, in ordine:
1. Notice: Undefined index: title in C:\wampp\www\project\contact.php on line 15
2. Warning: virtual() [function.virtual]: Unable to include '/cgi-bin/script/l' - request execution failed in /home/mysite/public_html/index.php on line 2
3. PHP Deprecated: Assigning the return value of new by reference is deprecated in /home/xxxxx/public_html/forums/includes/class_core.php on line 2552
4. PHP Parse error: syntax error, unexpected T_ECHO in D:\www\tests\shutdown.php on line 4
5. Fatal error: Allowed memory size of 52428800 bytes exhausted (tried to allocate 19456 bytes) in /home/myfilename.php on line 47
6. PHP Strict Standards: Non-static method LogicHook::initialize() should not be called statically, assuming $this from incompatible context in /var/www/html/cogburnlaw/include/MVC/View/SugarView.php on line 104

Cauza erorilor, in detaliu, este urmatoarea:

1. O variabila nu a fost definita inainte de a fi folosita SAU o cheie de array nu a fost definita inainte de folosire.
Acest lucru este intalnit des la requesturi ($_POST, $_GET, $_REQUEST) si cauzeaza panica in randul incepatorilor.

Cod: Selectaţi tot

<?php
// incorect
if( $_POST['gigi'] ) { echo 'Avem gigi'; }
// cand pagina este incarcata, cheia 'gigi' nu exista in request
// drept urmare $_POST['gigi'] nu exista

// corect
if( isset($_POST['gigi']) && $_POST['gigi'] ) { echo 'Avem gigi'; }
// verificam daca $_POST['gigi'] ESTE SETAT apoi daca este valid
?>

Foarte important: nu ignorati aceste erori pentru ca ele pot fi cauza unor probleme grave, desi se numesc "notice".
Un exemplu concret.

Cod: Selectaţi tot

<?php
$xxxxxx = 2;
if( $xxxxx == 2 ) {
   echo 'Este OK';
} else {
   echo 'Nu e OK';
}
// va afisa "Nu e OK"
?>

In acest caz avem un notice (daca nu-l ascundem), pentru ca $xxxxx (care are 5 de x) nu este definit, $xxxxxx fiind cel definit (adica, cel cu 6 de x).
Daca nu vedem un notice care sa ne zica "nenea, vezi ca ai uitat un x" atunci s-ar putea sa cautam prin tot proiectul o prostie care este fix sub nasul nostru.
Recomandare: puneti error_reporting(E_ALL) pentru mediul de dezvoltare (cand proiectul e pe local) si error_reporting(0) pentru productie (cand proiectul e live, pe server public). Public, este indicata ascunderea erorilor, din motive de securitate si bun-simt.

Pe restul n-o sa pun mare accent, pentru ca depind de caz.
Tot ce trebuie sa stiti este putina engleza sau, folositi google translate.
Desi, pana nu cunoasteti limba engleza cat de cat bine, nu trebuie sa va apucati de programare.

O sa explic care este cauza erorii in exemplul dat mai sus:

2. Un include nu are calea specificata corect la linia specificata.

3. Mai nou (PHP 5+), nu se mai transmit obiecte prin referinta pentru ca acest lucru se face implicit.

4. Este uitat un ; pe undeva (in cazul nostru) sau s-a omis un . la o concatenare. Aici, unde s-a omis un ; parserul a ajuns la o linie care contine un 'echo' si nu stie ce sa faca, pentru ca blocul de cod precedent nu a fost finalizat cu ;.
Tot ce trebuie sa faci este sa mergi la lina cu pricina si sa corectezi codul. Aceste erori sunt "per linie" si tot ce trebuie sa stii este limbajul PHP si structura lui.
Atentie, in cazul lui ; s-ar putea ca linia sa fie decalata la urmatorul bloc de cod. De exemplu:

Cod: Selectaţi tot

<?php
$a = 1

$b = 2;

Eroarea va indica linia 4, desi in mod normal ; lipseste la lina 2.
Foarte indicat este sa scrieti cod indentat, cu un singur bloc per linie.
A se evita scrierile de tip:

Cod: Selectaţi tot

<?php
$a = 2; $b = 3;

pentru ca in cazul unei erori veti avea de investigat mai mult si, este si foarte urat de citit.

5. Erorile fatale opresc rularea scriptului si se intampla, in cazul nostru, cand memoria alocata de PHP este depasita de script-ul nostru.
Mai exista si alte cazuri, cand se face un require si calea nu este gasita (a se observa diferenta dintre require si include) sau altele. Trebuie citita eroarea si gasita cauza.
In acest caz, lina ne ajuta ceva mai putin, stiind doar zona unde s-a produs executia, nu si problema in sine. Nu intru in detalii.

6. La versiunile mai noi, PHP a introdus niste erori pentru cei care scriu conform standardelor.
Aceste erori sunt puse pe OFF by default (pentru ca se stia ca sunt prea putini care respecta limbajul perfect) dar se pot activa, la cerere.

Efectul erorilor este acela de a se afisa pe ecran (sau nu, functie de setari) dar si de a se scrie intr-un log (vedeti setarile voastre de PHP) si cam atat, cu exceptia erorilor de tip 4 si 5 (Parse si Fatal) care, asa cum zice numele, sunt fatale sau codul nu este scris corect... scriptul moare, se opreste.
Pentru a putea "prinde" astfel de erori, putem folosi register_shutdown_function (vedeti exemple, nu intru in detalii).

Controlul erorilor (daca sa apara sau nu) se face cu functia error_reporting.
Parametrii pot fi combinati in anumite cazuri (ex: E_ALL & ~E_NOTICE - arata toate erorile, mai putin notice-urile - caz nerecomandat!) cititi in manual cateva exemple:
http://careerride.com/PHP-types-errors.aspx scrie: E_ERROR: A fatal error that causes script termination
E_WARNING: Run-time warning that does not cause script termination
E_PARSE: Compile time parse error.
E_NOTICE: Run time notice caused due to error in code
E_CORE_ERROR: Fatal errors that occur during PHP's initial startup (installation)
E_CORE_WARNING: Warnings that occur during PHP's initial startup
E_COMPILE_ERROR: Fatal compile-time errors indication problem with script.
E_USER_ERROR: User-generated error message.
E_USER_WARNING: User-generated warning message.
E_USER_NOTICE: User-generated notice message.
E_STRICT: Run-time notices.
E_RECOVERABLE_ERROR: Catchable fatal error indicating a dangerous error
E_ALL: Catches all errors and warnings



Mafios_X
PHPRomania Supporter
Mesaje: 28
Membru din: Mie Apr 04, 2012 5:28 pm

Re: Cum ne citim erorile de PHP

Mesajde Mafios_X » Lun Apr 15, 2013 12:27 am

Foarte bine explicat, iti multumesc! :)

Avatar utilizator
mihaitha
Senior Member
Mesaje: 2383
Membru din: Vin Mai 04, 2007 12:40 pm
Localitate: Sibiu
Contact:

Re: Cum ne citim erorile de PHP

Mesajde mihaitha » Sâm Iun 22, 2013 7:11 pm

As mai adauga un lucru: multi incepatori se blocheaza in momentul in care dau de o eroare de sintaxa (syntax error) generata de lipsa caracterului ; la finalul unei comenzi. PHP va genera o eroare fatala in acest caz, insa linia pe care este detectata eroarea este (de regula) urmatoarea, acolo unde este intalnita prima comanda ce nu corespunde sintaxei corecte. Cu alte cuvinte, nu lipsa caracterului ; genereaza eroarea, ci prezenta unei noi comenzi inainte ca cea curenta sa fie finalizata corect.

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6378
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: Cum ne citim erorile de PHP

Mesajde Birkoff » Sâm Iun 22, 2013 8:27 pm

o eroare de care am dat de ea destul de des in ultima vreme este afisarea unei pagini albe in loc de rezultate in browser (chiar daca aveti setat error reporting all si display error on)
Acest lucru se intampla de obicei cand este o eroare fatala intr-o clasa/functie/metoda, cel mai frecvent se uita inchiderea unei acolade/paranteze si e destul de greu de gasit (php-ul nereturnand nimic in cazul asta nici macar mesaj de eroare) iar acea clasa/functie este apelata prin nu stiu cate includeri...
solutia este sa parcurgeti scriptul si toate fisierele incluse pas cu pas (sa puneti die si echo din loc in loc ca sa vedeti daca pana la acea linie se ruleaza codul sau nu...) De asemenea ajuta mult un IDE care va alerteaza de erorile din cod (eclipse, aptana, netbeans sau similare) pentru astfel de situatii este foarte util.
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4830
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Re: Cum ne citim erorile de PHP

Mesajde vectorialpx » Joi Iul 11, 2013 5:58 pm

mihaitha scrie:As mai adauga un lucru: multi incepatori se blocheaza in momentul in care dau de o eroare de sintaxa (syntax error) generata de lipsa caracterului ; la finalul unei comenzi. PHP va genera o eroare fatala in acest caz, insa linia pe care este detectata eroarea este (de regula) urmatoarea, acolo unde este intalnita prima comanda ce nu corespunde sintaxei corecte. Cu alte cuvinte, nu lipsa caracterului ; genereaza eroarea, ci prezenta unei noi comenzi inainte ca cea curenta sa fie finalizata corect.

Am specificat acest lucru.
Atentie, in cazul lui ; s-ar putea ca linia sa fie decalata la urmatorul bloc de cod. De exemplu:


Birkoff scrie:o eroare de care am dat de ea destul de des in ultima vreme este afisarea unei pagini albe in loc de rezultate in browser

Am intalnit si eu. Astfel de erori se pot prinde cu register_shutdown_function care scrie intr-un log.
* Totusi, uneori Apache moare daca intra in bucle complicate de include-uri si instructiuni repetitive.
Daca moare Apache, nu prea ai ce face, decat sa faci debug treptat pe zone unde stii ca ai probleme.

Avatar utilizator
dascalt
PHPRomania Supporter
Mesaje: 6
Membru din: Joi Sep 03, 2015 11:57 pm

Re: Cum ne citim erorile de PHP

Mesajde dascalt » Vin Sep 04, 2015 5:10 pm

Birkoff scrie:solutia este sa parcurgeti scriptul si toate fisierele incluse pas cu pas (sa puneti die si echo din loc in loc ca sa vedeti daca pana la acea linie se ruleaza codul sau nu...) De asemenea ajuta mult un IDE care va alerteaza de erorile din cod (eclipse, aptana, netbeans sau similare) pentru astfel de situatii este foarte util.


De asemenea o solutie ar fii utilizare extensiei Xdebug (http://xdebug.org/). E adevarat ca pentru site-uri in productie arata urat ditamai eroarea (pentru ca Xdebug are propriul styling), dar daca ai eroare probabil e bine sa stii dinainte.

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6378
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: Cum ne citim erorile de PHP

Mesajde Birkoff » Vin Sep 04, 2015 5:35 pm

dascalt scrie:De asemenea o solutie ar fii utilizare extensiei Xdebug (http://xdebug.org/). E adevarat ca pentru site-uri in productie arata urat ditamai eroarea (pentru ca Xdebug are propriul styling), dar daca ai eroare probabil e bine sa stii dinainte.


se poate seta din php.ini sa nu afiseze erorile ci doar sa le salveze in log, si logul sa il primesti pe mail... asa vizitatorii nu vad erorile ci doar adminul care are acces la log...
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

nevvermind
Senior Member
Mesaje: 1242
Membru din: Mar Iun 22, 2010 3:17 pm

Re: Cum ne citim erorile de PHP

Mesajde nevvermind » Vin Sep 04, 2015 5:51 pm

nu fiti nebuni, nu activati xdebug in live. ingreuneaza. just sayin'.
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

Avatar utilizator
Birkoff
Senior Member
Mesaje: 6378
Membru din: Joi Mar 18, 2004 2:34 pm
Localitate: Bucuresti
Contact:

Re: Cum ne citim erorile de PHP

Mesajde Birkoff » Vin Sep 04, 2015 6:01 pm

nevvermind scrie:nu fiti nebuni, nu activati xdebug in live. ingreuneaza. just sayin'.


eu recomand separarea totala a dezvoltarii si productiei (asa se lucreaza la modul profesional)
testezi si dezvolti pe serverul de testare/dezvoltare si cand e gata si nu mai ai erori pui modificarile pe serverul de productie...

imagineaza-ti daca toate firmele mari ar lucra direct pe serverul de productie ce s-ar intampla...
1) CMS, ERP, CRM, etc... (doar pentru clienti))
2) Portofoliu, servicii, contact, blog
3) Folositi aceasta clasa sql in proiectele voastre (open source)
4) Vrei un magazin virtual la cheie, usor de folosit, cu api-uri incluse pentru maximizarea vanzarilor si multe alte facilitati? Da un semn si discutam.

nevvermind
Senior Member
Mesaje: 1242
Membru din: Mar Iun 22, 2010 3:17 pm

Re: Cum ne citim erorile de PHP

Mesajde nevvermind » Vin Sep 04, 2015 6:48 pm

Unde am zis eu sa lucrezi direct pe live? :P
Facusi un canal de php pe freenode - ##php-ro : https://webchat.freenode.net/

Avatar utilizator
dascalt
PHPRomania Supporter
Mesaje: 6
Membru din: Joi Sep 03, 2015 11:57 pm

Re: Cum ne citim erorile de PHP

Mesajde dascalt » Vin Sep 04, 2015 10:59 pm

se poate seta din php.ini sa nu afiseze erorile ci doar sa le salveze in log, si logul sa il primesti pe mail... asa vizitatorii nu vad erorile ci doar adminul care are acces la log...


Perfect de acord cu tine. Ma refeream la partea de dezvoltare, inainte sa ajungi cu proiectul live. Ideea e ca citirea erorilor se face activa doar in stadiul de dezvoltare, sau cel putin asa ar fii bine in practica :). Xdebug, desi e mai greoi, ajuta destul de mult, cel putin pe dezvoltatorii incepatori, sa depaseasca momentele de frustrare :D.

Avatar utilizator
vectorialpx
Senior Member
Mesaje: 4830
Membru din: Mar Mar 01, 2005 9:48 am
Localitate: Bucuresti
Contact:

Re: Cum ne citim erorile de PHP

Mesajde vectorialpx » Lun Sep 07, 2015 5:21 pm

@dascalt - ai pornit o mica polemica fara rost
dascalt scrie:Perfect de acord cu tine. Ma refeream la partea de dezvoltare, inainte sa ajungi cu proiectul live.

desi ai scris mai sus
dascalt scrie:E adevarat ca pentru site-uri in productie arata urat ditamai eroarea


In fine, nu cred ca xDebug este in scopul acestui thread.
O sa-ti arate aceeasi eroare ca si PHP-ul, doar ca e mai frumos colorata.
Daca nu stii sa citeti negru pe alb, n-o sa stii sa citesti nici pe fond portocaliu :)

Daca mai are cineva timp, cel mai util ar fi sa scriem alte exemple de erori, din viata reala.
Evident, [Eroare] + [Solutie]

dianagaby2002
PHPRomania Supporter
Mesaje: 19
Membru din: Mie Aug 05, 2015 10:09 am

Re: Cum ne citim erorile de PHP

Mesajde dianagaby2002 » Mie Dec 23, 2015 1:32 pm

Mersi mult!!! :bigsmurf:

dianagaby2002
PHPRomania Supporter
Mesaje: 19
Membru din: Mie Aug 05, 2015 10:09 am

Re: Cum ne citim erorile de PHP

Mesajde dianagaby2002 » Mie Dec 23, 2015 1:33 pm

mihaitha scrie:As mai adauga un lucru: multi incepatori se blocheaza in momentul in care dau de o eroare de sintaxa (syntax error) generata de lipsa caracterului ; la finalul unei comenzi. PHP va genera o eroare fatala in acest caz, insa linia pe care este detectata eroarea este (de regula) urmatoarea, acolo unde este intalnita prima comanda ce nu corespunde sintaxei corecte. Cu alte cuvinte, nu lipsa caracterului ; genereaza eroarea, ci prezenta unei noi comenzi inainte ca cea curenta sa fie finalizata corect.


THANKS


Înapoi la “PHP Incepători”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 2 vizitatori