File: debug.php

Recommend this page to a friend!
  Classes of Vernet  >  PHP Debug  >  debug.php  >  Download  
File: debug.php
Role: Class source
Content type: text/plain
Description: Debug Class
Class: PHP Debug
Tracing and debugging PHP scripts
Author: By
Last change: Changed the file.
Date: 16 years ago
Size: 39,596 bytes
 

Contents

Class file image Download
<?
/**
 * +--------------------------------------------------------------------------+
 * +-- PHP_Debug : A simple and fast way to debug PHP code                    |
 * +--                                                                        |
 * +-- Support : Vernet Loic (coil@strangebuzz.com)                           |
 * +--------------------------------------------------------------------------+
 * |                                                                          |
 * | This PHP debug libray offers you the ability to debug your PHP code      |
 * |                                                                          |
 * | - Pear integration                                                       |
 * | - PHP Process time                                                       |
 * | - Database and query process time                                        |
 * | - Dump of all type of variable in a graphical way                        |
 * | - Functionnal debug                                                      |
 * | - Debug queries                                                          |
 * | - Show number of database queries executed                               |
 * | - Allow to search in all debug infos                                     |
 * | - Direct links to test queries in Phpmyadmin                             |
 * | - Show globals var ( $GLOBALS, $_POST, $_GET ... )                       |
 * | - Enable or disable the debug infos you want to see                      |
 * | - Check performance of chunk of php code                                 |
 * | - Customize the general display of your debug                            |
 * | - ... ( see doc for complete specification )                             |
 * +--------------------------------------------------------------------------+
 * 
 * @filesource
 * @package PHP_Debug
 * @author Loic Vernet, COil <coil@strangebuzz.com>
 * @license http://www.php.net/license/2_02.txt The PHP License, version 2.02
 * @example tests/debug_test_min.php Minimal example
 * @example tests/debug_test.php Full example
 * @todo Check TODO file or https://sourceforge.net/tracker/?group_id=95715
 */
 
/**
 * Possible version of class Debug
 */ 
define ( 'DBG_VERSION_STANDALONE' , 0 );
define ( 'DBG_VERSION_PEAR' , 1 );
define ( 'DBG_VERSION_DEFAULT' , DBG_VERSION_STANDALONE );
define ( 'DBG_VERSION' , DBG_VERSION_STANDALONE );
define ( 'DBG_RELEASE' , 'BETA 1.0' );
 
/**
 * Only include Pear libraries for Pear version
 */
if ( DBG_VERSION == DBG_VERSION_PEAR ) 
{
	/** 
	 * Include Pear Library
	 */
	require_once 'PEAR.php';
	
	/** 
	 * Include Pear::Var_Dump Library
	 */
	require_once 'Var_Dump.php';
}


/**
 * Eventual external constants
 */
if ( !defined('STR_N') ) 
	define( 'STR_N' , '' );

if ( !defined('CR') ) 
	define( 'CR' , "\r\n" );

/**
 * DBG_MODE Constants, define the different available debug modes.
 *
 * Here are the available modes :
 * - DBG_MODE_OFF : Debug mode is OFF
 * - DBG_MODE_USERPERF : Base debug mode,
 * - DBG_MODE_QUERY : DBG_MODE_USERPERF + queries
 * - DBG_MODE_QUERYTEMP : DBG_MODE_QUERY + included files
 * - DBG_MODE_FULL : All available debug infos ( including $GLOBALS array that is quiet big )
 * - DBG_MODE_AUTO : Mode auto take the mode of Debug Object
 * ( not implemented )
 */
define ( 'DBG_MODE_OFF' , 0 );
define ( 'DBG_MODE_USERPERF' , 1 );
define ( 'DBG_MODE_QUERY' , 2 );
define ( 'DBG_MODE_QUERYTEMP' , 3 );
define ( 'DBG_MODE_FULL' , 4 );
define ( 'DBG_MODE_AUTO' , 5);
define ( 'DBG_MODE_DEFAULT' , DBG_MODE_USERPERF);

/**
 * This is a constant for the credits. For me :p
 */
define ( 'DBG_CREDITS' , '<b>== PHP_Debug | By COil (2003) | <a href="mailto:coil@strangebuzz.com">coil@strangebuzz.com</a></b> | <a href="http://sourceforge.net/projects/phpdebug/">PHP_Debug Project Home</a>');

/**
 * These are constant for DumpArr() and DumpObj() functions.
 * 
 * - DUMP_ARR_DISP : Tell the functions to display the debug info.
 * - DUMP_ARR_STR : Tell the fonction to return the debug info as a string
 * - DBG_ARR_TABNAME : Default name of Array
 * - DBG_ARR_OBJNAME : Default name of Object
 */
define ( 'DUMP_ARR_DISP' , 1 );
define ( 'DUMP_ARR_STR' , 2 );
define ( 'DUMP_ARR_TABNAME' , 'Array' );
define ( 'DUMP_ARR_OBJNAME' , 'Object' );

/**
 * These are constants to define environment Super array
 */ 
define ( 'DBG_GLOBAL_GET' , 0 );
define ( 'DBG_GLOBAL_POST' , 1 );
define ( 'DBG_GLOBAL_FILES' , 2 );
define ( 'DBG_GLOBAL_COOKIE' , 3 );
define ( 'DBG_GLOBAL_REQUEST' , 4 );
define ( 'DBG_GLOBAL_SESSION' , 5 );
define ( 'DBG_GLOBAL_GLOBALS' , 6 );

/**
 * Debug : Class that provide a simple and fast way to debug a php application.
 *
 * Debug class allows you to debug all you need about your application
 * Debug queries, process time, dump variable and much more...
 * 
 * @package PHP_Debug
 * @author COil, Loic Vernet <coil@strangebuzz.com>
 * @version BETA 1.0
 * @since 17 oct 2003
 */
class Debug
{
	/**
	 * Debug Mode 
	 *
	 * @var integer
	 * @access public
	 * @see DBG_MODE constants.
	 */
	var $DebugMode = DBG_MODE_USERPERF;

	/**
	 * This is the array where debug line are.
	 *
	 * @var array $_DebugBuffer
	 * @access private
	 * @see DebugLine
	 */
	var $_DebugBuffer = array();

	/**
	 * Enable or disable Credits in debug infos.
	 *
	 * @var integer $DisableCredits
	 * @access public
	 * @see DebugLine
	 */
	var $DisableCredits = false;

	/**
	 * HTML Start String
	 * 
	 * Start string of HTML layout
	 * 
	 * @var string $HtmlTableStart
     * @access public
	 */ 
	var $HtmlTableStart = '<br><table cellspacing="0" cellpading="0" border="1" width="100%">';

	/**
	 * HTML end string to close HTML display for debug layout
	 * 
	 * @var string $HtmlTableEnd
     * @access public
	 */ 
	var $HtmlTableEnd = '</table>';

	/**
	 * Process perf status, 1 = a process is being running, 0 = no activity
	 * 
	 * @var String	$_ProcessPerfStatus
	 * @access private
	 */
	var $_ProcessPerfStatus = false;

	/**
	 * General debug start time
	 * 
	 * @var integer $_ProcessPerfStart
	 * @access private
	 */
	var $_ProcessPerfStartGen = 0; 		// Global Start Time
	
	/**
	 * Debug Start time
	 * 
	 * @var integer $_ProcessPerfStart
	 * @access private
	 */
	var $_ProcessPerfStart = 0; 		// Local Start Time

	/**
	 * Debug End time
	 * 
	 * @var integer $_ProcessPerfEnd
	 * @access private
	 */
	var $_ProcessPerfEnd = 0;

	/**
	 * Global database process time
	 * 
	 * @var integer $_DataPerfTotal
	 * @access private
	 */
	var $_DataPerfTotal = 0;

	/**
	 * Number of performed queries
	 * 
	 * @var integer $_DataPerfQry
	 * @access private
	 */
	var $_DataPerfQry = 0;

	/**
	 * Enable or disable, included and required files
	 * 
	 * @var boolean $ShowTemplates
	 * @access public
	 */ 
	var $ShowTemplates = true;

	/**
	 * Enable or disable, pattern removing in included files
	 * 
	 * @var boolean $RemoveTemplatesPattern
	 * @access public
	 */
	var $RemoveTemplatesPattern = false;

	/**
	 * Pattern list to remove in the display of included files
 	 * 
	 * @var boolean $RemoveTemplatesPattern
	 * @access private
	 */ 
	var $_TemplatesPattern = array();

	/**
	 * Enable or disable $globals var in debug
	 *   
	 * @var boolean $ShowGlobals
	 * @access public
	 */	
	var $ShowGlobals = false;

	/** 
	 * Enable or disable search in debug 
	 * 
	 * @var boolean $EnableSearch
	 * @access public
	 */	
	var $EnableSearch = true;

	/** 
	 * Enable or disable the use of $_REQUEST array instead of $_POST + _$GET + $_COOKIE + $_FILES
	 * 
	 * @var boolean $UseRequestArr
	 * @access public
	 */	
	var $UseRequestArr = false;
	
	/** 
	 * View Source script path
	 * 
	 * @var string $ViewSourceScriptPath, default : Current directory
	 * @access public
	 */	
	var $ViewSourceScriptPath = '.';
	
	/** 
	 * View Source script path
	 * 
	 * @var string $ViewSourceScripName
	 * @access public
	 */		
	var $ViewSourceScriptName = 'source.php';

	/** 
	 * Color for DebugType : $DebugType => Color Code of text
	 * 
	 * @var array $CellColors
	 * @access public
	 */
	var $CellColors = array (   DBGLINE_STD => '#000000', 
								DBGLINE_QUERY => '#FFA500', 
								DBGLINE_QUERY_REL => '#228B22',
								DBGLINE_ENV => '#FF0000',
								DBGLINE_CURRENTFILE => '#000000',
								DBGLINE_APPERROR => '#FF0000',
								DBGLINE_CREDITS => '#000000',
								DBGLINE_SEARCH => '#000000',
								DBGLINE_OBJECT => '#000000',
								DBGLINE_PROCESSPERF => '#000000',
								DBGLINE_TEMPLATES => '#000000',
								DBGLINE_PAGEACTION => '#708090',
								DBGLINE_ARRAY => '#000000' );
								
	/**
	 * Bold style for DebugType : $DebugType => Bold Style
	 * 
	 * @var array $CellBoldStatus
	 * @access public
	 */
	var $CellBoldStatus = array ( 	DBGLINE_STD => false,
									DBGLINE_QUERY => true,
									DBGLINE_QUERY_REL => false,
									DBGLINE_ENV => false,
									DBGLINE_CURRENTFILE => true,
									DBGLINE_APPERROR => true,
									DBGLINE_CREDITS => true,
									DBGLINE_SEARCH => true,
									DBGLINE_OBJECT => false,
									DBGLINE_PROCESSPERF => false,
									DBGLINE_TEMPLATES => false,
									DBGLINE_PAGEACTION => true,
									DBGLINE_ARRAY => false );

	/**
	 * Bold style for DebugType : $DebugType => Bold Style
	 * 
	 * @var array $CellBoldStatus
	 * @access public
	 */
	var $DisplayTypeInSearch = array ( 	DBGLINE_STD => false ,
										DBGLINE_QUERY => false ,
										DBGLINE_QUERY_REL => false ,
										DBGLINE_ENV => false ,
										DBGLINE_CURRENTFILE => true ,
										DBGLINE_APPERROR => false ,
										DBGLINE_CREDITS => true ,
										DBGLINE_SEARCH => true ,
										DBGLINE_OBJECT => false ,
										DBGLINE_PROCESSPERF => true ,
										DBGLINE_TEMPLATES => false ,
										DBGLINE_PAGEACTION => false ,
										DBGLINE_ARRAY => false );

	/** 
	 * Base URL of phpmyadmin	
	 * 
	 * @var string $PhpMyAdminUrl	
	 * @access public
	 */
	var $PhpMyAdminUrl = 'http://127.0.0.1/mysql';

	/** 
	 * Name of database that we are working on
	 * 
	 * @var string $CurrentDatabase	
	 * @access public
	 */
	var $DatabaseName = 'mysql';

   	/**
	 * Debug() : Constructor of Debug object
	 *
	 * Set debugmode, credits line and search line are added at creation
	 * if they are activated.
	 * 
	 * @param integer	$debugmode
	 *
	 * @return mixed 	Debug Object
	 *
	 * @see Debug()
	 * @since 17 Oct 2003
	 * @access public
	 */	 	
	function Debug($debugmode=DBG_MODE_DEFAULT)
	{		
		$this->DebugMode = $debugmode;
		$this->_ProcessPerfStartGen = $this->getMicroTime(microtime());

		// Credits line
		if ( $this->DisableCredits == false )
			$this->addDebug(DBG_CREDITS,DBGLINE_CREDITS);
		
		// Search line
		if ( $this->EnableSearch == true )
			$this->addDebug(STR_N,DBGLINE_SEARCH);
										
	}

	/**
	 * setDebugMode() : Set debug mode of Debug Object
	 *  
	 * @param integer	$debugmode
	 * 
	 * @see $DebugMode
	 * @since 14 Nov 2003
	 * @access public
	 */ 
	function setDebugMode($debugmode)
	{
		$this->DebugMode = $debugmode;
	}

	/**
	 * getDebugMode() : Return current debug mode
	 *  
	 * @see $DebugMode
	 * @since 14 Nov 2003
	 * @access public
	 */ 
	function getDebugMode()
	{
		return($this->DebugMode);
	}

   	/**
	 * getColorCode() : Retrieve color code of the debug cell
	 *
	 * @return string
	 * 
	 * @see CellColor
	 * @since 25 Oct 2003
	 * @access public
	 */
	function getColorCode($DebugLineType)
	{		 
		return '<font color="'. $this->CellColors[$DebugLineType] . '">';
	}
		
   	/**
	 * getBoldCode() : Retrieve Bold cell status of the debug cell
	 *
	 * @return string
	 * 
	 * @see CellBoldStatus
	 * @since 25 Oct 2003
	 * @access public
	 */
	function getBoldCode($DebugLineType)
	{
		return ( $this->CellBoldStatus[$DebugLineType] ) ? "<b>" : STR_N;
	}

	/**
	 * getMicroTime() : Return micotime from a timestamp
	 *   
	 * @param $time 	Timestamp to retrieve micro time
	 * @return numeric 	Micotime of timestamp param
	 * 
 	 * @see $DebugMode
	 * @since 14 Nov 2003
	 * @access public
	 */ 
	function getMicroTime($time)
	{ 	
		list($usec, $sec) = explode(" ",$time);
		return ( (float)$usec + (float)$sec ); 
	}

	/**
	 * getElapsedTime() : get elapsed time between 2 timestamp
	 *   
	 * @param $timeStart 	Start time ref
	 * @param $timeEnd 		End time ref
	 * @return numeric difference between the two time ref
	 * 
	 * @see getProcessTime()
	 * @since 20 Oct 2003
	 * @access public
	 */ 
	function getElapsedTime($timeStart, $timeEnd)
	{			
		return round($timeEnd - $timeStart,4);
	}
	
	/**
	 * getProcessTime() : Get global process time
	 * 
	 * @return	numeric		Elapsed time between the start and end time
	 * 
	 * @see getElapsedTime()
	 * @since 20 Oct 2003
	 * @access public
	 */ 
	function getProcessTime()
	{
		return ( $this->getElapsedTime($this->_ProcessPerfStartGen,$this->_ProcessPerfEnd) );
	}

	/**
	 * _StopProcessTime() : Fix the end time of process
	 * 
	 * @since 17 Novt 2003
	 * @access private
	 */ 
	function _StopProcessTime()
	{
		$this->_ProcessPerfEnd = $this->getMicroTime(microtime());
	}
	
	/**
	 * DumpArr() : Display all content of an array
	 * 
	 * Mode DUMP_ARR_DISP display the array
	 * Mode DUMP_ARR_STR return the infos as a string
	 * 
	 * @param 	array 	 	$arr		array	Array to debug
	 * @param 	string	 	$varname	Name of the variable
	 * @param	integer 	$mode		Mode of function
	 * @return 	mixed 					Nothing or string depending on the mode
	 * 
	 * @since 20 Oct 2003
	 * @static
	 * @access public
	 */ 
	function DumpArr($arr, $varname=DUMP_ARR_TABNAME, $mode=DUMP_ARR_DISP)
	{
		ob_start();
		print_r($arr);		
		$dbg_arrbuffer = htmlentities(ob_get_contents());
		ob_end_clean();
		
		$dbg_arrbuffer = "<br><pre><b>$varname</b> :". CR . $dbg_arrbuffer . '</pre>';

		switch($mode)
		{
			default:
			case DUMP_ARR_DISP:
				print($dbg_arrbuffer);
			case DUMP_ARR_STR:
				return($dbg_arrbuffer);
			break;
		}
	}

	/**
	 * DumpObj() : Debug an object or array with Var_Dump pear package
	 * 
	 * ( Not useable with standalone version )
	 * Mode DUMP_ARR_DISP display the array
	 * Mode DUMP_ARR_STR return the infos as a string
	 * 
	 * @param 	array 	 	$obj		Object to debug
	 * @param 	string	 	$varname	Name of the variable
	 * @param	integer 	$mode		Mode of function
	 * @return 	mixed 					Nothing or string depending on the mode
	 * 
	 * @since 10 Nov 2003
	 * @static
	 * @access public
	 */ 
	function DumpObj($obj, $varname=DUMP_ARR_OBJNAME, $mode=DUMP_ARR_DISP)
	{
		// Check Pear Activation
		if (DBG_VERSION == DBG_VERSION_STANDALONE) 
			return Debug::DumpArr($obj, $varname, $mode);
	
		ob_start();
		Var_Dump::display($obj);
		$dbg_arrbuffer = ob_get_contents();
		ob_end_clean();	

		if ( empty($varname) )
			$varname = DUMP_ARR_OBJNAME;

		$dbg_arrbuffer = "<br><pre><b>$varname</b> :". CR . $dbg_arrbuffer . '</pre>';

		switch($mode)
		{
			default:
			case DUMP_ARR_DISP:
				print($dbg_arrbuffer);
			case DUMP_ARR_STR:
				return($dbg_arrbuffer);
			break;
		}
	}

	/**
	 * addDebug() : Build a new debug line info.
	 * 
	 * If $str is a String or an object we switch automatically to the corresponding
	 * debug info type. If debug mode is OFF does not do anything and return.
	 * Debug line is build, then it is added in the DebugLine array.
	 * 
	 * @param 	string		$str		debug string/object
	 * @param 	integer 	$typeDebug	Debug type of line ( Optional, Default = DBGLINE_STD )
	 * @param	string 		$file		File of debug info ( Optional, Default = "" )
	 * @param	string 		$line		Line of debug info ( Optional, Default = "" )
	 * @param 	string 		$title		Title of variable if applicable ( Optional, Default = "" )
	 * 
	 * @since 10 Nov 2003
	 * @access public
	 */ 
	function addDebug($str, $typeDebug=DBGLINE_STD, $file = STR_N, $line = STR_N, $title=STR_N )
	{
		if ($this->DebugMode == DBG_MODE_OFF )
			return;

		// If argument is an array change debug type
		if ( is_array($str)  && $typeDebug == DBGLINE_STD)
			$typeDebug = DBGLINE_ARRAY;

		// If argument is an object change debug type
		if ( is_object($str) && $typeDebug == DBGLINE_STD)
			$typeDebug = DBGLINE_OBJECT;

		// Query config for query debug line type		
		$PhpMyAdminUrl = ( $typeDebug == DBGLINE_QUERY ? $this->PhpMyAdminUrl : '' );
		$DatabaseName = ( $typeDebug == DBGLINE_QUERY ? $this->DatabaseName : '' );
										
		$DbgLine = new DebugLine(	$str, $typeDebug, $file , $line, $title, 
									$this->getColorCode($typeDebug),
									$this->getBoldCode($typeDebug),
									$PhpMyAdminUrl, 
									$DatabaseName );
		$this->_DebugBuffer[] = $DbgLine;
	}

	/**
	 * DebugPerf() : Get process time and stats about database processing.
	 * 
	 * If $processtype is DBG_PERF_QRY then a query has been run, otherwise it
	 * is another database process. The start and end time is computed, and the
	 * global time is updated.
	 * 
	 * @param 	integer 	$processtype	Type of database debug query or database related.
	 * 
	 * @since 20 Oct 2003
	 * @access public
	 */ 
	function DebugPerf($processtype = DBGLINE_QUERY)
	{
		// Lang
		$txtPHP = 'PHP';
		$txtSQL = 'SQL';				
		$txtSECOND = 's';

		switch($this->_ProcessPerfStatus)
		{
			// Start Timer
			default:
			case false:
				$this->_ProcessPerfStart = $this->getMicroTime(microtime());
				$this->_ProcessPerfStatus = true;
				
				// Additional processing depending of dataperf type request				
				switch($processtype)
				{
					case(DBGLINE_QUERY):
						$this->_DataPerfQry++;
					break;				

					default:
					break;
				}
				
			break;
			
			// Stop Timer and add to database perf total
			case true;
				$this->_ProcessPerfEnd = $this->getMicroTime(microtime());
				$qry_time = $this->getElapsedTime($this->_ProcessPerfStart,$this->_ProcessPerfEnd);

				$this->_ProcessPerfStart = $this->_ProcessPerfEnd = 0;
				$this->_ProcessPerfStatus = false;
				
				// Additional processing depending of dataperf type request
				switch($processtype)
				{
					default:
					case(DBGLINE_STD);
						$this->_DebugBuffer[$this->_getLastDebugLineID($processtype)]->DebugDisplayString .= " <b><font color=\"black\">[ $txtPHP : ". $qry_time ."$txtSECOND ]</font></b>";
					break;					

					case(DBGLINE_QUERY_REL):						
					case(DBGLINE_QUERY):
						//Now set the Time for the query in the DebugLine info
						$this->_DebugBuffer[$this->_getLastDebugLineID($processtype)]->DebugDisplayString .= " <b><font color=\"black\">[ $txtSQL+$txtPHP : ". $qry_time ."$txtSECOND ]</font></b>";

						// Global database perf
						$this->_DataPerfTotal += $qry_time;
					break;				
				}				
			break;
		}		
	}

	/**
	 * CancelPerf() : Cancel a process time monitoring, error or misc exception
	 * 
	 * @param Integer	$processtype	Type of the process to cancel
	 * 
	 * @since 13 Dec 2003
	 * @access public
	 */ 
	function CancelPerf($processtype)
	{
		$this->_ProcessPerfStart = $this->_ProcessPerfEnd = 0;
		$this->_ProcessPerfStatus = false;
		
		switch($processtype)
		{
			case(DBGLINE_QUERY):
				$this->_DataPerfQry--;
			break;				

			default:
			break;
		}
	}
	
	/**
	 * getLastDebugLineID : Retrieve the ID of last debugline type in _DebugBuffer array
	 * 
	 * @param integer 	$debugtype		Type of debug we want to get the last index
	 * 
	 * @see DebugPerf(), _DebugBuffer
  	 * @since 20 Nov 2003
	 * @access private
	 */ 
	function _getLastDebugLineID($debugtype)
	{
		$tmparr = $this->_DebugBuffer;
		krsort($tmparr);		
		
		foreach ( $tmparr as $lkey => $lvalue )
		{
			if ( $lvalue->DebugType == $debugtype )
				return $lkey;
		}
	}
	
	/**
	 * _IncludeRequiredFiles() : Build debug line with all included or required files for current file.
	 * 
	 * Use the get_required_files() function, then build the formatted string with
	 * links to edit and to view source of each files. Debug info line is added in
	 * current debug object.
	 * 
	 * @since 20 Oct 2003
	 * @access private
	 */ 
	function _IncludeRequiredFiles()
	{
		// Lang
		$txtViewSource = 'View Source';
		$txtEditSource = 'Edit';
		$txtIncRecFiles = 'Included/Required files';

		$l_reqfiles = get_required_files();		
		$l_strinc = "<b>== $txtIncRecFiles (". count($l_reqfiles) .') :</b>'. CR;
		$l_strinc .=  '<font color="#000080">';

		foreach( $l_reqfiles as $f_file )
		{
			$view_source_link = $edit_link = $f_file;

			// Pattern deletion
			if ( $this->RemoveTemplatesPattern == true && count($this->_TemplatesPattern) )
				$f_file = strtr( $f_file, $this->_TemplatesPattern );
								
			$view_source_link = ' <a href="' . $this->ViewSourceScriptPath .'/'. $this->ViewSourceScriptName .'?script='. $view_source_link . '">'. $txtViewSource .'</a>';
			$edit_link = ' <a href="' . $edit_link . '">'. $txtEditSource .'</a>';

			$l_strinc .= $f_file . $view_source_link . $edit_link . CR;
		}
		$this->addDebug($l_strinc,DBGLINE_TEMPLATES);
	}

	/**
	 * addRequiredFilesPattern() : Add a remove pattern to remove pattern array.
	 * 
	 * @param string 	$pattern	Pattern to add
	 * 
	 * @since 20 Oct 2003
	 * @access public
	 */ 
	function addRequiredFilesPattern($pattern, $replace_str=STR_N)
	{
		$this->_TemplatesPattern[$pattern] = $replace_str;
	}

	/**
	 * delRequiredFilesPattern() : Del a remove pattern from remove pattern array.
	 * 
	 * @param string 	$pattern	Pattern to remove
	 * 
	 * @since 20 Oct 2003
	 * @access public
	 */ 
	function delRequiredFilesPattern($pattern)
	{
		unset($this->_TemplatesPattern[$pattern]);
	}

	/**
	 * addSuperArray() : Add a super array to the debug informations
	 * 
	 * @see DBG_GLOBAL, DebugDisplay()
	 * @since 12 Dec 2003
	 * @access private
	 */ 
	function _addSuperArray($SuperArrayType)	
	{
		// Lang
		$txtVariable = "Var";
		$txtNoVariable = "NO VARIABLE";

		$NoVariable =  " -- $txtNoVariable -- ";

		switch($SuperArrayType)		
		{
			case(DBG_GLOBAL_GET):
				$SuperArray = $_GET;
				$ArrayTitle = '_GET';
				$Title = "$ArrayTitle $txtVariable";
			break;

			case(DBG_GLOBAL_POST):
				$SuperArray = $_POST;
				$ArrayTitle = '_POST';
				$Title = "$ArrayTitle $txtVariable";
			break;

			case(DBG_GLOBAL_FILES):
				$SuperArray = $_FILES;
				$ArrayTitle = '_FILES';
				$Title = "$ArrayTitle $txtVariable";
			break;

			case(DBG_GLOBAL_COOKIE):
				$SuperArray = $_COOKIE;
				$ArrayTitle = '_COOKIE';
				$Title = "$ArrayTitle $txtVariable";
			break;

			case(DBG_GLOBAL_REQUEST):
				$SuperArray = $_REQUEST;
				$ArrayTitle = '_REQUEST';
				$Title = "$ArrayTitle $txtVariable ( _GET + _POST + _FILES + _COOKIE )";
			break;

			case(DBG_GLOBAL_SESSION):
				$SuperArray = $_SESSION;
				$ArrayTitle = '_SESSION';
				$Title = "$ArrayTitle $txtVariable";
			break;
			
			case(DBG_GLOBAL_GLOBALS):
				$SuperArray = $GLOBALS;
				$ArrayTitle = 'GLOBALS';
				$Title = "$ArrayTitle $txtVariable";
			break;

			default:
			break;
		}
	
		$SectionBasetitle = "<b>== $Title (". count($SuperArray,COUNT_RECURSIVE) .') :';
		if ( count($SuperArray,COUNT_RECURSIVE) )
			$this->addDebug($SectionBasetitle .'</b>'. $this->DumpArr($SuperArray,$ArrayTitle,DUMP_ARR_STR),DBGLINE_ENV);
		else
			$this->addDebug($SectionBasetitle ."$NoVariable</b>",DBGLINE_ENV);
	}	

	/**
	 * _addProcessTime() : Add the process time information to the debug infos
	 * 
	 * @see DBG_GLOBAL, DebugDisplay()
	 * @since 12 Dec 2003
	 * @access private
	 */ 
	function _addProcessTime()
	{
		// Lang
		$txtExecutionTime = 'Execution Time Global';
		$txtPHP = 'PHP';
		$txtSQL = 'SQL';				
		$txtSECOND = 's';
		$txtOneQry = 'Query';
		$txtMultQry = 'Queries';
		$txtQuery = ( $this->_DataPerfQry > 1 ) ? $txtMultQry : $txtOneQry;

		// Performance Debug
		$ProcessTime = $this->getProcessTime();
		$php_time = $ProcessTime - $this->_DataPerfTotal;
		$sql_time = $this->_DataPerfTotal;
	
		$php_percent = round(($php_time / $ProcessTime) * 100 ,2);
		$sql_percent = round(($sql_time / $ProcessTime) * 100 ,2);								
	
		$this->addDebug("<b>== $txtExecutionTime : " .
				 $ProcessTime . "$txtSECOND [ $txtPHP , ". $php_time ."$txtSECOND , ". $php_percent  .'% ] - '.
				 				  "[ $txtSQL , ". $sql_time ."$txtSECOND , ". $sql_percent .'% , '. $this->_DataPerfQry ." $txtQuery ]</b>",DBGLINE_PROCESSPERF);
	}
	
	/**
	 *  HighLightKeyWords : Highligth a keyword in the debug info
	 */ 
	 function HighLightKeyWords($SearchStr)
	 {
	 	if ( !empty($SearchStr) and !empty($this->_DebugBuffer) ) 
		{
			for( $i = 0 ; $i < count($this->_DebugBuffer) ; $i++  )
			{
				if ( $this->DisplayTypeInSearch[$this->_DebugBuffer[$i]->DebugType] == false )
				{
					if ( !is_array($this->_DebugBuffer[$i]->_DebugString) && !is_object($this->_DebugBuffer[$i]->_DebugString) ) 
					{
						$this->_DebugBuffer[$i]->_DebugString = eregi_replace("$SearchStr","<font color=\"#FFA500\"><b>$SearchStr</b></font>",$this->_DebugBuffer[$i]->_DebugString);
						// PHP5 : $this->_DebugBuffer[$i]->_DebugString = str_ireplace("$SearchStr","<font color=\"#FFA500\"><b>$SearchStr</b></font>",$this->_DebugBuffer[$i]->_DebugString);
						$this->_DebugBuffer[$i]->_BuildDisplayString();
					}
				}
			}
	 	}	 	
	 }
	
	/**
	 * DebugDisplay() : This is the funtcion to display debug infos
	 * 
	 * @param string 		$search_str		Search string	( Optional, default = "" )
	 * @param integer		$display_mode	Mode of display ( DBG_MODE_AUTO )
	 * 
	 * @since 20 Oct 2003
	 * @access public
	 */ 
	function DebugDisplay($SearchSTR=STR_N, $display_mode=DBG_MODE_AUTO)
	{
		// Fix end time process the sooner possible
		$this->_StopProcessTime();

		// No Display
		if ( $display_mode == DBG_MODE_OFF ) 
			return;
		// Fix display mode
		else
			if ( $display_mode == DBG_MODE_AUTO) 
			 	$display_mode = $this->DebugMode;

		// HTML START
		print($this->HtmlTableStart);

		// Only DBG_MODE_USERPERF is implemented for now
		switch($display_mode)
		{
			default:
			case DBG_MODE_USERPERF:
				// Process time debug informations
				$this->_addProcessTime();
				
				// Include debug of included files
				if ( $this->ShowTemplates == true )
					$this->_IncludeRequiredFiles();

				// Divide Request tab
				if ( $this->UseRequestArr == false )
				{							
					// Include Post Var
					$this->_addSuperArray(DBG_GLOBAL_POST);		
	
					// Include Get Var
					$this->_addSuperArray(DBG_GLOBAL_GET);
	
					// Include File Var
					$this->_addSuperArray(DBG_GLOBAL_FILES);
					
					// Include Cookie Var
					$this->_addSuperArray(DBG_GLOBAL_COOKIE);
				}
				else
				// Only display Request Tab
				{
					// Include Request Var
					$this->_addSuperArray(DBG_GLOBAL_REQUEST);
				}

				// Include Sessions Var :Check if we have Session variables
				if ( !empty($_SESSION) )
					$this->_addSuperArray(DBG_GLOBAL_SESSION);

				// Include Globals Var
				if ( $this->ShowGlobals == true )
					$this->_addSuperArray(DBG_GLOBAL_GLOBALS);

				// Highlight Keywords
				if ( !empty($SearchSTR)  )
					$this->HighLightKeyWords($SearchSTR);
				
				// Display Debug cells
				foreach ( $this->_DebugBuffer as $lkey =>$lvalue )
				{
					$bufstr = $lvalue->getDebugLineString();
					
					// Display only cell that contains the search string or in force display array
					$ShowDebugLine = false;

					if ( !empty($SearchSTR)  )
					{
						// Check if Brut data is not an object or array
						$searchInto = ( is_array($lvalue->_DebugString) || is_object($lvalue->_DebugString) ? $this->DumpArr($lvalue->_DebugString,"",DUMP_ARR_STR)  : $lvalue->_DebugString );
						
						// Search string found
						if ( stristr($searchInto, $SearchSTR) && $lvalue->DebugType)
							$ShowDebugLine = true;
						
						// Forced debugline in search mode
						if ($this->DisplayTypeInSearch[$lvalue->DebugType] == true )
							$ShowDebugLine = true;
					}
					else
						$ShowDebugLine = true;
										
					if ( $ShowDebugLine == true ) 
						print($bufstr);
				}
			break;
		}

		// Close HTML Table
		print($this->HtmlTableEnd);
	}
	
	/**
	 * UniTtests() : Make the unit tests of the debug class
	 * 
	 * @since 22 Nov 2003
	 * @access public
	 */ 
	function UnitTests($fullmode = false)
	{
		$ClassName = get_class($this);		
		$txtTitle = "Class $ClassName Unit Tests (debug.php)";
		$Title = "======== $txtTitle";

		print('<pre><br><br>');
		print('<a name=\"'. $ClassName .'\">');
		print($Title);
		if ($fullmode == true) 
			Debug::DumpObj($this, $ClassName, DUMP_ARR_DISP);
		print('<br><br></pre>');
	}
}


/**
 * DEBUG LINE Types
 * 
 * - DBGLINE_STD 			: Standart debug, fonctionnal or other
 * - DBGLINE_QUERY 		: Query debug
 * - DBGLINE_QUERY_REL 	: Database related debug
 * - DBGLINE_ENV 			: Environment debug ( $GLOBALS... )
 * - DBGLINE_CURRENTFILE 	: Output current file that is debugged
 * - DBGLINE_APPERROR 	: Debug Error 
 * - DBGLINE_CREDITS 		: Class Credits
 * - DBGLINE_SEARCH 		: Search mode in debug
 * - DBGLINE_OBJECT 		: Debug object mode
 * - DBGLINE_PROCESSPERF	: Performance analysys
 * - DBGLINE_TEMPLATES	: Debug included templates
 * - DBGLINE_PAGEACTION	: Debug main page action 
 * - DBGLINE_ARRAY	    : Debug array mode
 * 
 * @category DebugLine
 */
define ( 'DBGLINE_STD' , 1 );
define ( 'DBGLINE_QUERY' , 2 );
define ( 'DBGLINE_QUERY_REL' , 3 );
define ( 'DBGLINE_ENV' , 4 );
define ( 'DBGLINE_CURRENTFILE' , 5 );
define ( 'DBGLINE_APPERROR' , 6 );
define ( 'DBGLINE_CREDITS' , 7 );
define ( 'DBGLINE_SEARCH' , 8 );
define ( 'DBGLINE_OBJECT' , 9 );
define ( 'DBGLINE_PROCESSPERF' , 10 );
define ( 'DBGLINE_TEMPLATES' , 11 );
define ( 'DBGLINE_PAGEACTION' , 12 );
define ( 'DBGLINE_ARRAY' , 13 );
define ( 'DBGLINE_DEFAULT' , DBGLINE_STD );

/**
 * DBGLINE_ERRORALERT, default error message for DBGLINE_APPERROR debug line type.
 * 
 */
define ( 'DBGLINE_ERRORALERT' , "/!\\" );

/**
 * DebugLine : Class that describe a debug line inforlations
 *
 * Descive all info and methode for a debug line, file 
 * location, color, type of debug, debug buffer, formatted debug buffer
 * title of debug variable if applicable
 * 
 * @package PHP_Debug
 * @author COil, Loic Vernet <webmaster@strangebuzz.com>
 * @version BETA 1.0
 * @since 18 oct 2003
 */
class DebugLine
{
	/** 
	 * File of debug info
	 * 
	 * @var integer $_Fine			
	 * @access private
	 */
	var $_File = '';

	/** 
	 * Line of debug info
	 * 
	 * @var integer $_Line			
	 * @access private
	 */
	var $_Line = '';
		
	/** 
	 * Complete Location ( formatted ) of debug infos ( Line + File )
	 * 
	 * @var integer $_Location 
	 * @access private
	 */
	var $_Location = '';

	/** 
	 * Title of debug line ( Object var ) 
	 * 
	 * @var String $_Linetitle 
	 * @see DumpObj()
	 * @access private
	 */
	var $_LineTitle = '';

	/** 
	 * String that store non formatted debug info 
	 * 
	 * @var string $_DebugString		
	 * @access private
	 */
	var $_DebugString = '';

	/**
	 * Formatted Debug info 
	 * 
	 * @var string $_DebugString 
	 * @access public
 	 */
	var $DebugDisplayString = '';

	/**
	 * Debug Type 
	 * 
	 * @var integer $DebugType 
	 * @see DBGLINE contants
	 * @access public
	 */
	var $DebugType = DBGLINE_DEFAULT;
	
	/** 
	 * Background Color for debug info cell
	 * 
	 * @var array $CellColor
	 * @access public
	 */
	var $CellColor = '';

	/** 
	 * Base URL of phpmyadmin	
	 * 
	 * @var string $PhpMyAdminUrl	
	 * @access public
	 */
	var $PhpMyAdminUrl = '';

	/** 
	 * Name of database that we are working on
	 * 
	 * @var string $CurrentDatabase	
	 * @access public
	 */
	var $DatabaseName = '';
	
	/**
	 * Bold style for debug info cell
	 * 
	 * @var array $CellBoldStatus
	 * @access public
	 */
	var $CellBoldStatus = false;
	
	/**
	 * Default Backgourd cell color
	 * 
	 * @var string $DefaultCellBackColor
	 * @access public
	 */ 
	var $DefaultCellBackColor = '#F8F8FF';
	
	/**
	 * HTML Cell start code 
	 * 
	 * @var string $HtmlPreCell	
	 * @access public
	 */
	var $HtmlPreCell = '<tr><td><pre>';

	/** 
	 * HTML Cell end code
	 * 
	 * @var string $HtmlPostCell
	 * @access public
	 */
	var $HtmlPostCell = '</td></tr>';
	
   	/**
	 * DebugLine() Constructor of class
	 *
	 * _Location is Automatically created at object instantation.
	 * Then the formatted debug HTML row is created.
	 *
	 * @param string		$str			Debug Information to store
	 * @param integer		$DebugType		Type of debug information
	 * @param string		$file			File of debug information
	 * @param string		$line			Debug of debug information
	 * @param string		$title			Title of debuged var
	 *
	 * @return mixed 	DebugLine Object
	 *
	 * @see _BuildDebugLineLocation()
	 * @since 17 Oct 2003
	 * @access public
	 */
	function DebugLine($str, $DebugType, $file, $line, $title, $CellColor, $CellBoldStatus, $PhpMyAdminUrl, $DatabaseName)
	{
		$this->_DebugString = $str;
		$this->DebugType = $DebugType;				
		$this->_File = $file;
		$this->_Line = $line;
		$this->_LineTitle = $title;
		$this->CellColor = $CellColor;
		$this->CellBoldStatus = $CellBoldStatus;
		$this->PhpMyAdminUrl = $PhpMyAdminUrl;
		$this->DatabaseName = $DatabaseName;

		$this->_Location = $this->_BuildDebugLineLocation($file,$line);
		$this->_BuildHtmlPreCell();
		$this->_BuildDisplayString();
	}
	
   	/**
	 * _BuildDisplayString() : Builds the formatted debug line
	 *
	 * Depending on the DebugType the formatted debug line is build.
	 * DebugDisplayString is built.
	 * One case by debug type.
	 *
	 * @see DebugType
	 * @since 20 Oct 2003
	 * @access private
	 */	 
	function _BuildDisplayString()
	{
		switch($this->DebugType)
		{
			// Standart output
			case 1:
				$this->DebugDisplayString = $this->_DebugString;
			break;

			// Query
			case 2:
				$txtExplain = 'Explain';
				$txtQuery = 'Query';

				$basehtml = ' </b><a target="phpmyadmin" href="';
				$url_query = $this->PhpMyAdminUrl .'/read_dump.php';
				$url_query .=  '?is_js_confirmed=0&lang=fr&server=1&db='. $this->DatabaseName .'&pos=0&goto=db_details.php&zero_rows=&prev_sql_query=&sql_file=&sql_query=';
				$url_explain = $url_query .'explain '. urlencode($this->_DebugString);
				$url_query = $url_query . urlencode($this->_DebugString);

				$this->DebugDisplayString = preg_replace('/\s+/',' ',$this->_DebugString);

				// Explain Link only for select Queries.
				if ( stristr($this->_DebugString,'select') )
					$this->DebugDisplayString .= $basehtml. $url_explain ."\">$txtExplain</a>";

				// Query Link
				$this->DebugDisplayString .= $basehtml. $url_query."\">$txtQuery</a>";
			break;
			
			// Database Related
			case 3:
				$this->DebugDisplayString = $this->_DebugString;
			break;

			// Environnment Related
			case 4:
				$this->DebugDisplayString = $this->_DebugString;
			break;

			// Current File
			case 5:
				$txtCurrentFile = 'Current File';
				$this->DebugDisplayString = "<b>&laquo; $txtCurrentFile</b>";
			break;

			// App Error
			case 6:
				$this->DebugDisplayString = DBGLINE_ERRORALERT .' '. $this->_DebugString .' '. DBGLINE_ERRORALERT;
			break;

			// Credits
			case 7:
				$this->DebugDisplayString = $this->_DebugString;
			break;

			// Search Debug
			case 8:
				// To do, reposter toues les données qu'on a de dispo
				$txtSearchInDebug = 'Search in Debug Infos';
				$this->DebugDisplayString = "<b><pre>== $txtSearchInDebug : ". '<form action="'. $_SERVER['PHP_SELF'] .'"><input name="DBG_SEARCH" value="'. (isset($_REQUEST["DBG_SEARCH"]) ? $_REQUEST["DBG_SEARCH"] : "") .'"><input type="SUBMIT" value="Go !"></form>';
			break;

			// Object Debug
			case 9:
				$obj_title = (empty($this->_LineTitle)) ? get_class($this->_DebugString) : $this->_LineTitle ;
				$this->DebugDisplayString = Debug::DumpObj($this->_DebugString,$obj_title,DUMP_ARR_STR);
			break;

			// Process Perf
			case 10;			
				$this->DebugDisplayString = $this->_DebugString;
			break;

			// Temlates
			case 11;
				$this->DebugDisplayString = $this->_DebugString;
			break;

			// Main Page Action
			case 12;
				$txtPageAction = 'Page Action';
				$this->DebugDisplayString = " [ $txtPageAction : ". $this->_DebugString .' ]';
			break;

			// Array Debug
			case 13:
				$this->DebugDisplayString = Debug::DumpArr($this->_DebugString,$this->_LineTitle,DUMP_ARR_STR);
			break;
		}
	}

	/**
	* _BuildHtmlPreCell() : Build HTML pre cell with backgroud attributes
	* 
	* @since 11 Dec 2003
	* @see DefaultCellBackColor, HtmlPreCell
	* @access private
	*/ 
	function _BuildHtmlPreCell()
	{	
		$this->HtmlPreCell = '<tr bgcolor="'. $this->DefaultCellBackColor .'"><td><pre>';
	}		
	
   	/**
	 * getPhpMyAdminUrl() : Return url of PhpmyAdmin
	 *
	 * @return string PhpMyAdminUrl
	 * 
	 * @see PhpMyAdminUrl
	 * @since 25 Oct 2003
	 * @access public
	 */
	function getPhpMyAdminUrl()
	{			
		return $this->PhpMyAdminUrl;
	}
	
   	/**
	 * setPhpMyAdminUrl() : Set the url of PhpmyAdmin
	 *
	 * @param string URL OF phpmyadmin
	 * 
	 * @see PhpMyAdminUrl
	 * @since 14 Nov 2003
	 * @access public
	 */
	function setPhpMyAdminUrl($phpmyadmin_url)
	{			
		$this->PhpMyAdminUrl = $phpmyadmin_url;
	}

   	/**
	 * getDebugLineString() : Return Formated debug infos
	 *
 	 * @return string The formatted string
	 * 
	 * @since 25 Oct 2003
	 * @access public
	 */
	function getDebugLineString()
	{
		return 	$this->HtmlPreCell. 
				$this->_Location. 
				$this->CellColor.
				$this->CellBoldStatus.
				$this->DebugDisplayString.
				$this->HtmlPostCell;				
	}
	
   	/**
	 * _BuildDebugLineLocation() :  Retrieve Localisation of debug info
	 *
	 * Check is $file and $line, build the location with available
	 * datas, if nothing return a default Info message.
     *
 	 * @param string $file 	File of debug info
	 * @param string $line 	Line number of debug info
	 * 
 	 * @return string The formatted location [file,line]
	 * 
	 * @since 25 Oct 2003
	 * @access private
	 */
	function _BuildDebugLineLocation($file,$line)
	{
		// Lang
		$txtNoLocation = 'NO LOC';

		$l_dbgloc = STR_N;
		
		if ( !empty($file) )
			$l_dbgloc .= basename($file);
		
		if ( !empty($line) ) 
		{
			if ( !empty($l_dbgloc) )
				$l_dbgloc .= ',';
				
			$l_dbgloc .= $line;
		}

		if ( !empty($l_dbgloc) )
			$l_dbgloc = '[' . $l_dbgloc . ']';
		else
		{
			if ($this->DebugType != DBGLINE_CREDITS && 
				$this->DebugType != DBGLINE_SEARCH && 
				$this->DebugType != DBGLINE_ENV && 
				$this->DebugType != DBGLINE_PROCESSPERF &&
				$this->DebugType != DBGLINE_TEMPLATES )
				$l_dbgloc = "[-$txtNoLocation-]";
		}				
		return $l_dbgloc;
	}
}
?>

For more information send a message to info at phpclasses dot org.