Link
closeQuesto articolo è stato pubblicato 8 mesi fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi.
Se riscontri errori o link rotti, puoi segnalarli inviando un commento.

2009-12-01 - 045. Immagine 1Questa sera mi sono imbattuto in un incubo per molti programmatori: c’è un problema, ma dov’è la causa?

In PHP c’è una funzione della quale non tutti sanno l’esistenza, ma che tutti dovrebbero usare: sto parlando di backup_backtrace che permette di ricostruire l’intero percorso di una chiamata.

Vediamo qualche esempio.

Un problema in una funzione

Un esempio concreto dell’utilizzo di backup_backtrace è in una funzione chiamata. Supponiamo di avere la seguente funzione PHP:

function query ($post_query) {
	mysql_query($post_query);
	if (strlen(mysql_error()) > 0) {
		$backtrace = debug_backtrace();
		$backtrace[0][file] = explode('\\', $backtrace[0][file]);
		echo 'Attenzione! Query non valida <i>'
			.$backtrace[0][file][count($backtrace[0][file]) - 1].':'.$backtrace[0][line]
			.'</i> '.$post_query.' (<i>'.mysql_error().'</i>)<br>';
		return 0;
	} else
		return 1;
}

In questo caso l’uso di debug_backtrace è lampante: se la query genera un errore, prende il nome del file senza il percorso (riga 5 e riga 7), la linea che ha generato la chiamata alla funzione query e li visualizza insieme ad un messaggio di errore (riga 6), alla query passata ed all’errore in dettaglio (riga 8).

Avendo, per esempio il seguente codice nel file test.php:

query ('UPDATE table SET t1 = s WHERE id = 1');

verrà visualizzato un messaggio di errore come il seguente:

Attenzione! Query non valida test.php:42 UPDATE table SET t1 = s WHERE id = 1 (You have an error in your MySql syntax)

o simile.

Un altro esempio per errori generici

Un altro esempio di problema potrebbe verificarsi durante l’esecuzione di uno script all’interno di una certa pagina. Qui possiamo aggiungere manualmente un richiamo alla nostra funzione e visualizzare i dettagli per il debug. Lo script che può tornarci utile è il seguente:

function getDebugBacktrace () {
	$NL = '<br />';
	$dbgTrace = debug_backtrace();
	$dbgMsg .= $NL."Inizio debug backtrace:$NL";
	foreach ($dbgTrace as $dbgIndex => $dbgInfo)
		$dbgMsg .= "\t livello ".$dbgIndex." @ ".$dbgInfo['file'].":".$dbgInfo['line']." -> ".$dbgInfo['function']."(".join(",",$dbgInfo['args']).")$NL";
	$dbgMsg .= "Fine debug backtrace".$NL;
	return $dbgMsg;
}

echo "Attenzione! Impossibile connettersi al database!";
echo getDebugBacktrace();

Con questo algoritmo verrà visualizzato il seguente output:

Attenzione! Impossibile connettersi al database!
Inizio debug backtrace:
livello 0 @ D:\Siti web\Senzatitolo-1.php:12 -> getDebugBacktrace()
Fine debug backtrace

Il tutto è molto utile per ricercare errori soprattutto in righe che producono uno stesso output.

La guida su php.net

Sempre disponibile c’è la guida della funzione online consultabile gratuitamente all’indirizzo www.php.net.

Avete altre idee di come utilizzare questa funzione? Scrivetele nei commenti :)

Condividi:
  • Print
  • PDF
  • email
  • Add to favorites
  • Facebook
  • Google Buzz
  • MySpace
  • Segnalo
  • Wikio IT
  • OKNOtizie
  • Digg
  • del.icio.us
  • Technorati
  • Google Bookmarks
  • Live
  • Yahoo! Bookmarks