Come già postato nella sezione Javascript (Funzione javascript per tracciare i programmi (magari può servire))
ho provato a fare una cosa simile anche per tracciare programmi in php. La differenza sostanziale è che usando
il php ho dovuto appoggiarmi ad una tabella per memorizzare i messaggi da visualizzare in un passaggio
successivo. La tabella viene creata definita così:
CREATE TABLE trace (
indent INT NOT NULL,
messaggio TEXT CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL);
Il codice che ci permette di inserire i record messaggi è questo (nome file Trace.php):
Codice PHP:
<?php
include 'Db_trace_handler.php';
$indentazione = 3; // Numero di spazi per ogni successiva indentazione
$livello = 0; // Influisce sul margine sinistro della visualizzazione
$font = 12; // Dimensione dei fonts
function Traccia($msg,$indent)
{
global $livello;
$db = new Database();
$campi[0] = "indent"; $valori[0] = $livello;
$campi[1] = "messaggio"; $valori[1] = $msg;
switch ($indent)
{
case "+": $campi[0] = "indent"; $valori[0] = $livello;
$campi[1] = "messaggio"; $valori[1] = "-->".$msg;
$livello++;
break;
case "-": $livello--;
$campi[0] = "indent"; $valori[0] = $livello;
$campi[1] = "messaggio"; $valori[1] = "<--".$msg;
break;
default: $campi[0] = "indent"; $valori[0] = $livello+$indent;
$campi[1] = "messaggio"; $valori[1] = $msg;
}
$db->Inserisci("trace",$campi,$valori);
$db->close();
}
function Leggi()
{
global $font;
global $indentazione;
$db = new Trace_Db();
$db->Query("SELECT * FROM trace ");
$result = $db->data;
echo '<p style="font-family:courier;color:black;font-size:'.$font.'px;">';
for ($i=0; $i<$db->record_trovati; $i++)
{
$indent = $result[$i]['indent'];
$messaggio = $result[$i]['messaggio'];
$messaggio = str_repeat(' ',($indent*$indentazione)).$messaggio;
echo $messaggio."<br>";
}
echo '</p>';
$db->close();
}
function Cancella()
{
$db = new Trace_Db();
$db->Delete();
$db->close();
}
?>
Come si vede nel codice di Trace.php viene incluso il codice (scusate la ripetizione) di un altro
file (Db_trace_handler.php) che gestisce le registrazione e le letture della tabella. Questo è
il contenuto:
Codice PHP:
<?php
class Trace_Db
{
private $host = "";
private $user = "";
private $pass = "";
private $name = "";
private $link;
public $error;
public $errno;
public $query_result;
public $record_trovati;
public $data;
private $res;
//-------
// Costruttore della classe. Richiama la connect
// function __construct($host, $user, $pass, $name = "", $conn = 1)
function __construct()
{
$this->res = $this->connect();
if (!$this->res) {throw new Exception("Errore di connessione al database");}
return;
}
//-------
public function connect()
{
if (!$link = mysql_connect($this->host, $this->user, $this->pass))
{ $this->exception("Errore di connessione al database!"); return false; }
if (!mysql_select_db($this->name))
{ $this->exception("Errore di connessione alla tabella"); return false; }
return true;
}
//-------
function __destruct()
{ @mysql_close($this->link); }
//-------
// Chiusura della connessione
public function close() { @mysql_close($this->link); }
//-------
// Interrogazione di una tabella
// Parametri:
// $riga = Stringa contenente la query completa
public function Query($riga)
{
$this->data = array();
$this->record_trovati = 0;
if ($this->query_result = @mysql_query($riga))
{
while ($row = $this->Dammi_records_entrambi_indici($this->query_result)) $this->data[] = $row;
$this->record_trovati = mysql_num_rows($this->query_result);
return true;
}
else return false;
}
//-------
// Inserisce un record in tabella
// Parametri:
// $tabella = Nome della tabella da interrogare
// $fields = Array di nomi campo della tabella
// $valori = Array di valori per i campi definiti
// Ritorna true = ok false = ko
public function Inserisci($tabella,$fields,$valori)
{
$riga = "INSERT INTO ".$tabella." (";
for ($i=0; $i<count($fields); $i++)
{
if ($i+1 == count($fields)) $riga .= $fields[$i].") ";
else $riga .= $fields[$i].",";
}
$riga .= "VALUES (";
for ($i=0; $i<count($fields); $i++)
{
if (is_numeric($valori[$i]))
{
if ($i+1 == count($fields)) $riga .= $valori[$i].")";
else $riga .= $valori[$i].",";
}
else
{
if ($i+1 == count($fields)) $riga .= "'".$valori[$i]."')";
else $riga .= "'".$valori[$i]."',";
}
}
@mysql_query($riga);
if (mysql_affected_rows() >= 0) return true;
else return false;
}
//-------
// Cancella un record dalla tabella
// $tabella = Nome della tabella da interrogare
// Ritorna true = ok false = ko
public function Delete()
{
$riga = "DELETE FROM trace";
if ($this->query_result = @mysql_query($riga))
{
if (mysql_affected_rows() > 0) return true;
else return false;
}
$this->error = mysql_error();
return false;
}
//-------
// Parametri:
// $result = Oggetto ritornato da una query
// Senza uno di questi parametri (MYSQL_ASSOC, MYSQL_NUM e MYSQL_BOTH) per default
// viene usato MYSQL_BOTH. Si ottiene un array con entrambe gli indici (associativo e numerico)
// $riga[0], $riga["nome del campo"]
// Esempio while ($a = $db->fetch_array_assoc($r))
// echo "{$a[0]} {$a['nome']}\n";
public function Dammi_records_entrambi_indici($result)
{
if (empty($result))
{ $this->exception("E' stata eseguita nessuna query"); return false; }
else $data = mysql_fetch_array($result);
return $data;
}
//-------
private function exception($message)
{
if ($this->link)
{
$this->error = mysql_error($this->link);
$this->errno = mysql_errno($this->link);
}
else
{
$this->error = mysql_error();
$this->errno = mysql_errno();
}
}
}
?>
Le personalizzazioni da apportare riguardano le seguenti variabili:
Codice PHP:
private $host = ""; // host del database
private $user = ""; // utente per l'accesso al database
private $pass = ""; // password per l'accesso al database
private $name = ""; // nome del database
Vediamo ora come usare il tutto.
Nella pagina con il codice da debuggare bisogna inserire l'inclusione di Trace.php
include 'Trace.php';
Nei punti del codice da testare bisogna eseguire la chiamata all funzione Traccia
Traccia(par1,par2);
par1 = Messaggio da visualizzare. Si può comporlo ovviamente con le variabili da controllare.
Traccia("Id = ".$id." Padre = ".$padre,"0");
par2 = "+", "-", "un numero per l'indentazione"
Il "+" ed il "-" devono essere usati per tracciare l'entrata e l'uscita nelle routines.
Es: Routine1() { Traccia("Routine1","+"); istruzioni php; Traccia("Routine1","-");}
Le due chiamate comportano la visualizzazione di -->Routine1 e <--Routine1. --> e <-- sono aggiunti per individuare
l'ingresso e l'uscita delle routines. Inoltre il + incrementerà il livello di indentazione dei prossimi messaggi
mentre il - lo diminuirà.
"un numero per l'indentazione" Il numero specificato viene moltiplicato per la variabile definita in Trace.php ($indentazione = 3;)
quindi lo 0 lascia inalterata l'indentazione che trova al momento della chiamata a Trace, l'1 indenta di tre, il 2 indenta di 6 e così via.
Normalmente si usa lo "0" però possiamo evidenziare certe parti di codice modificando l'indentazione dei messaggi.
Riassumendo estendendo l'esempio precedente:
Codice PHP:
function Routine1()
{
$prova = 10;
Traccia("Routine1","+");
Traccia("Variabile prova = ".$prova,"0");
Routine2();
Traccia("Quello che mi pare","0");
Traccia("Routine1","-");
}
function Routine2()
{
$prova = 20;
Traccia("Routine2","+");
Traccia("Variabile prova = ".$prova,"0");
Traccia("Quello che voglio","0");
Traccia("Routine2","-");
}
comporterà sulla nuova finestra la seguente messaggistica:
Codice:
-->Routine1
Variabile prova = 10
-->Routine2
Variabile prova = 20
Quello che voglio
<--Routine2
Quello che mi pare
<--Routine1
Vediamo ora come visualizzare i messaggi. Le chiamate da usare sono Leggi(); per visualizzare i messaggi e Cancella();
per eliminarli. Io, per farla semplice seplice ho creato due file php che mando in esecuzione quando mi servono e che
sono uno
Codice PHP:
<?php
include 'Trace.php';
Leggi();
?>
e l'altro
Codice PHP:
<?php
include 'Trace.php';
Cancella();
?>
Segnalate pure errori e/o migliorie