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