Newsgroup: it.comp.www.php
Titolo: testare pagina con errori

+ cat test.php
<?php // esempio rudimentale di test funzionale
$page = file_get_contents('
http://local/index.php'
);
echo false !== strpos($page, "Helo") ? 'ok' : 'error';
echo "\n";
 
+ php test.php
ok
 
Apparentemente il test sembra superato, ma se apro il browser e digito 
http://local/index.php
 mi esce
Notice: Undefined variable: abc in index.php on line 2
 
Quindi vado ad approfondire...
 
+ cat index.php
Helo
<?php echo $abc; ?>
 
Come si vede in effetti c'è una variabile non assegnata ($abc).
 
Per fare il modo che l'errore venga rilevato, potrei aggiungere al file 
test.php l'istruzione
 
echo false === strpos($page, "Notice: Undefined variable:") ? 'ok' : 
'error';
 
Ma per vari motivi capirete che non è per nulla un metodo ottimale.
 
Quindi in genere, durante i test, come si fa a rilevare questo tipo di 
errori?

errori?
 
Un sistema è quello di cercare "Notice:", "Warning:" e "Error:" o "Fatal" o quel
che l'è.
 
Ma se no puoi includere nella pagina di test un php.ini che ridiriga tutto in un
file di log, e poi leggere quello.
 
Leonardo
-- 
 
A terrible beauty is born.
                                     - W. B. Yeats, Easter 1916

 file di log, e poi leggere quello.
 
????
 


Guarda sul manuale set_error_handler (per es.) :-)


 Guarda sul manuale set_error_handler (per es.) :-)
 
Ah registrare addirittura un apposito capture-error-handler.
Ma php.ini cosa c'entra?

 index.php on line 2
 
Il problema è che stai testando la cosa sbagliata.
 
Quando usi uno stream verso http stai testando il webserver, non lo 
script PHP.
 
Nel tuo caso non stai nemmeno tanto testando lo script, quanto il parser 
(infatti ricevi un warning di variabile non dichiarata, non un risultato 
sbagliato).
 
In pratica i test dovrebbero testare che dato un input tu riceva un certo 
output.
 
Se vuoi testare il parser di PHP devi usare xdebug, che appunto si 
inserisce nel processo di parsing e lo analizza.
 
Oppure, tranne che per i fatal error, usare un error_handler come dice 
Leonardo.
 
Bye.


Hai provato a dare un'occhiata al manuale di php.ini, relativamente a tutto quello
che si può fare con gli errori?


 che si può fare con gli errori?
 
ini_set('error_log', 'logs/error.log')?

ini_set('error_log', 'logs/error.log')?
 
Ma non solo. Per es., ti preoccupavi di riconoscere gli errori. Gli puoi premettere un
prefisso arbitrario random di 16 caratteri base64, avoja a sbagliare a riconoscerli.


 prefisso arbitrario random di 16 caratteri base64, avoja a sbagliare a riconoscerli.
 
Perdona l'ignoranza, come si fa a configurare un prefisso?
Bisogna sempre intervenire su php.ini?

Bisogna sempre intervenire su php.ini?
 
Mi pare di no, lo puoi fare anche da codice o da .htaccess. Imposti la variabile di
configurazione "error_prepend_string" a, che ne so?, "ERRORE_123456_CONFERMATO".


 configurazione "error_prepend_string" a, che ne so?, "ERRORE_123456_CONFERMATO".
 
set_error_handler('globalErrorHandler');
 
function globalExceptionHandler($e) {
     echo "ERRORE_123456_CONFERMATO: $e\n";
}
 
Volevi dire questo?


Quello è SIMILE all'effetto che ottieni. Ma non ti serve l'error handler, e soprattutto
funziona subito, sempre e dappertutto, e anche nel caso che l'errore sia nel codice che
dovrebbe gestire gli errori (per es., nel tuo caso 'globalErrorHandler' non esiste, dal
momento che la funzione si chiama globalExceptionHandler).
 
Ergo, la prepend string (se uno vuole riconoscere gli errori da fuori) è mejo.


 Ergo, la prepend string (se uno vuole riconoscere gli errori da fuori) è mejo.
 
Ti prego allora di scusarmi per l'ignoraza, ma questa prependstring come 
si setta e come si usa?


Euh. Io ti scuso anche, ma pensaci un momento: se non sei in grado di leggerti la pagina
del manuale relativa a una voce *data con precisione*, e ti viene da domandarti "come si
usa?" in un thread dove si parla proprio del come usarla... non è che ti conviene magari
studiarti il PHP in modo un po' più strutturato?
 
Detto questo, per settarla, 
 
 
http://php.net/manual/en/errorfunc.configuration.php#ini.error-prepend-string
 
 
si può o scriverlo nel PHP.INI
 
	error_prepend_string	= "Questa_Ene_Roma"
 
oppure impostarlo da codice (però devi essere sicuro che quel codice non crashi)
 
	ini_set('error_prepend_string', 'QuelRamoDelLagoDiComo');
 
Sul come si usa, si diceva:
 
	>> Un sistema è quello di cercare "Notice:", "Warning:" e "Error:" o "Fatal" o quel
	>> che l'è.
 
	> Che come avevo accennato, potrebbero dare falsi positivi per ragioni che 
	> lascio intuire...
 
...quindi cercando 'QuelRamoDelLagoDiComo' riduci molto il rischio di falsi positivi.
 
Poi, se trovi la prepend-string, nel testo lì intorno cerchi "Error:" e puoi estrarre il
testo dell'errore (idem per Warning e Notice).


 prefisso arbitrario random di 16 caratteri base64, avoja a sbagliare a riconoscerli.
 
Non andrebbe bene un prefisso statico: mio-error-5345 ?
Perchè dovrebbe essere random-base64?

 testo dell'errore (idem per Warning e Notice).
 
Adesso è chiarissimo :)


random, per ridurre il rischio che compaia per errore. Base64 per avere caratteri
che non danno problemi (tipo <). Poi con "random" intendevo random all'atto della
modifica del PHP.INI, non che ogni volta fosse diverso, per carità! Rimane sempre
un prefisso statico, come dici tu.


 un prefisso statico, come dici tu.
 
Ma allora non posso generalo io:
 
gfhh5555sa
 
che ci vuole?


Però non mi funziona
 
<?php
ini_set('error_prepend_string', 'abc');
echo $aaaaa;
\finetest;
?>
 
PHP Notice:  Undefined variable: aaaaa in 
/mnt/usb_storage/test/index.php on line 3
PHP Fatal error:  Uncaught Error: Undefined constant 'finetest' in 
/mnt/usb_storage/test/index.php:4
 
'abc' dov'è?

 ????
 
Chiedo scusa, forse volevi dire: che non compaia nel testo *ordinario* 
della pagina (non nei messaggi d'errore)

 Però non mi funziona
 
Sei sicuro di stare usando un browser come si è detto nel resto del thread fin dal tuo
primo post ("ma se apro il browser e digito...")?
 
Perché (a) quello mi pare un errore della CLI SAPI, dove la formattazione degli errori
è forzata a OFF (è scritto sia nel manuale che nel file PHP.INI); e (b) ho provato ora
su un server PHP e Firefox, e "abc" eccome se mi compare:
 
	abc
	( ! ) Notice: Undefined variable: aaaa in /var/www/html/test1.php on line 3
 
Sai, ho un po' questa sensazione di starti dando una mano nonostante i tuoi sforzi :-|


 	( ! ) Notice: Undefined variable: aaaa in /var/www/html/test1.php on line 3
 
Su un server aruba in effetti funziona
 
abc
Fatal error: Undefined constant 'finetest' in 
/web/htdocs/
www.carnevalesquillacese.com/home/test/index.php
 on line 4
 
ma il Notice non lo include proprio...
 


OK bisognava inserire
error_reporting(E_ALL);
 
I soliti dettagli :)