log2file=$var[file]; $this->getVariableName(); if(isset($GLOBALS[DD][logfile])) $this->logfile = $GLOBALS[DD][logfile]; unset($var[file]); if(count($var)==0) $datax = array('$_SESSION' => $_SESSION, '$_POST' => $_POST); else $datax = array($this->varname => $var[0]); $this->logdata = $this->initJSandCSS(); /* if($this->log2file ==1) { if(file_exists($this->logfile)) { $stat = stat($this->logfile); if($stat[size] < $DD[maxlogfilesize]) $cont = file_get_contents($this->logfile); $cont_a=explode('#~#~#~', $cont); $now=mktime(); $this->logdata = $cont_a[0]; for($i=1; $i ($now-7200)) { $this->logdata .= "#~#~#~$cont_a[$i]#~#~#~\n".$cont_a[$i+1]."\n"; } } } else { $this->logdata = $this->initJSandCSS(); } } */ foreach($datax as $i => $d) { $this->bInitialized = false; $this->varname = $i; $this->dBug2($d); } if($this->log2file ==1) { $contents = @file_get_contents($this->logfile); $contents = $this->out . "\n" . $contents; if(substr_count($contents, $this->logdata) ==0) { $contents = $this->logdata . "\n" . $contents; } $fileHandler = @fopen ($this->logfile, "w"); if($fileHandler == false) { echo "

Logfile cannot be written: {$this->logfile}

"; } else { # fwrite ($fileHandler, $this->out."#~#~#~".mktime()."#~#~#~\n".$this->logdata); fwrite ($fileHandler, $contents); fclose ($fileHandler); } } else { //include js and css scripts if($dBugInit == 0) { $dBugInit = 1; $this->out = $this->initJSandCSS() . $this->out; } echo $this->out; } } function dBug2($var) { $arrAccept=array("array","object","xml"); //array of variable types that can be "forced" if(in_array($forceType,$arrAccept)) $this->{"varIs".ucfirst($forceType)}($var); else $this->checkType($var); } ################################### //get variable name function getVariableName() { $arrBacktrace = debug_backtrace(); //possible 'included' functions $arrInclude = array("include","include_once","require","require_once"); //check for any included/required files. if found, get array of the last included file (they contain the right line numbers) for($i=count($arrBacktrace)-1; $i>=0; $i--) { $arrCurrent = $arrBacktrace[$i]; if(array_key_exists("function", $arrCurrent) && (in_array($arrCurrent["function"], $arrInclude) || ($arrCurrent["function"] != "d" && $arrCurrent["function"] != "dc" && $arrCurrent["function"] != "de" && $arrCurrent["function"] != "df"))) continue; $arrFile = $arrCurrent; break; } $arrLines = file($arrFile["file"]); $code = $arrLines[($arrFile["line"]-1)]; //find call to dBug class preg_match('/\bde{0,1}f{0,1}c{0,1}\s*\(\s*(.+)\s*\);/i', $code, $arrMatches); #dd($arrBacktrace); $this->varname = $arrMatches[1]; if($this->log2file ==1) { $url_time = (isset($_SERVER[HTTPS])) ? 'https' : 'http'; $url_time .= "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]  -  ".date("d.m.y H:i:s").'
'; $this->varname = "$url_time{$this->varname}"; } $this->file = str_replace('\\', '/', $arrFile[file]); $this->line = $arrFile[line]; } //create the main table header function makeTableHeader($type,$header,$colspan=2) { if(!$this->bInitialized) { $header = "{$this->varname} ($header), {$this->file} - line {$this->line}"; $this->bInitialized = true; } else { $header = "{$this->name} ($header)"; } $this->out .= ""; } //create the table row header function makeTDHeader($type,$header) { $this->out .= "\n"; } //error function error($type) { $error="Error: Variable cannot be a"; // this just checks if the type starts with a vowel or "x" and displays either "a" or "an" if(in_array(substr($type,0,1),array("a","e","i","o","u","x"))) $error.="n"; return ($error." ".$type." type"); } //check variable type function checkType($var) { switch(gettype($var)) { case "resource": $this->varIsResource($var); break; case "object": $this->varIsObject($var); break; case "array": $this->varIsArray($var); break; case "boolean": $this->varIsArray($var); break; default: $this->varIsArray($var); break; $var=($var==="") ? "[empty string]" : $var; $this->out .= "
".$header."
".$header." "; } //close table row function closeTDRow() { return "
\n\n\n
".$var."
\n"; break; } } //if variable is a boolean type function varIsBoolean($var) { $var=($var==1) ? "[TRUE]" : "[FALSE]"; $this->out .= $var; } //if variable is an array type function varIsArray($var) { $var_orig = $var; $var_ser = serialize($var); array_push($this->arrHistory, $var_ser); if(is_array($var)) $this->makeTableHeader("array","array"); elseif(is_bool($var)) { $this->makeTableHeader("object","bool"); $var=($var==1) ? "TRUE" : "FALSE"; } elseif(is_double($var)) { $this->makeTableHeader("object","double"); } elseif(is_int($var)) { $this->makeTableHeader("object","integer"); } else { $length = strlen($var); $this->makeTableHeader("object","string [$length]"); } if(is_array($var)) { foreach($var as $key=>$value) { $this->name=$key; $this->makeTDHeader("array",$key); //check for recursion if(is_array($value)) { $var_ser = serialize($value); if(in_array($var_ser, $this->arrHistory, TRUE)) $value = "*RECURSION*"; } if(in_array(gettype($value),$this->arrType)) $this->checkType($value); else { if(is_bool($value)) { $value=($value==1) ? "[TRUE]" : "[FALSE]"; } $value=(($value)==="") ? "[empty string]" : $value; if(strpos($value, 'http')===0) $value = "$value"; else $value = nl2br(htmlspecialchars($value)); $this->out .= $value; } $this->out .= $this->closeTDRow(); } } else { $this->out .= "".nl2br(htmlspecialchars($var)).$this->closeTDRow(); if(is_string($var_orig) && strlen($var_orig)<=$GLOBALS[DD][maxstringforhex]) { for($i=0;$iout .= "HEX: $hex" . $this->closeTDRow(); } } array_pop($this->arrHistory); $this->out .= ""; } //if variable is an object type function varIsObject($var) { $var_ser = serialize($var); array_push($this->arrHistory, $var_ser); $class = get_class($var); $this->makeTableHeader("object", "object of class $class"); if(is_object($var)) { $arrObjVars=get_object_vars($var); foreach($arrObjVars as $key=>$value) { $this->name=$key; $value=(!is_object($value) && trim($value)==="") ? "[empty string]" : $value; $this->makeTDHeader("object",$key); //check for recursion if(is_object($value)||is_array($value)) { $var_ser = serialize($value); if(in_array($var_ser, $this->arrHistory, TRUE)) { $value = (is_object($value)) ? "*RECURSION* -> $".get_class($value) : "*RECURSION*"; } } if(in_array(gettype($value),$this->arrType)) $this->checkType($value); else { if(gettype($value) == 'string') { $value = nl2br(htmlspecialchars($value)); } $this->out .= $value; } $this->out .= $this->closeTDRow(); } # $arrObjMethods=get_class_methods(get_class($var)); # foreach($arrObjMethods as $key=>$value) { # $this->makeTDHeader("object",$value); # $this->out .= "[function]".$this->closeTDRow(); # } } else $this->out .= "".$this->error("object").$this->closeTDRow(); array_pop($this->arrHistory); $this->out .= ""; } //if variable is a resource type function varIsResource($var) { $this->makeTableHeader("resourceC","resource",1); $this->out .= "\n\n"; switch(get_resource_type($var)) { case "fbsql result": case "mssql result": case "msql query": case "pgsql result": case "sybase-db result": case "sybase-ct result": case "mysql result": $tmp = explode(" ",get_resource_type($var)); $db=current($tmp); $this->varIsDBResource($var,$db); break; case "gd": $this->varIsGDResource($var); break; case "xml": $this->varIsXmlResource($var); break; default: $this->out .= get_resource_type($var).$this->closeTDRow(); break; } $this->out .= $this->closeTDRow()."\n"; } //if variable is a database resource type function varIsDBResource($var,$db="mysql") { if($db == "pgsql") $db = "pg"; if($db == "sybase-db" || $db == "sybase-ct") $db = "sybase"; $arrFields = array("name","type","flags"); $numrows=call_user_func($db."_num_rows",$var); $numfields=call_user_func($db."_num_fields",$var); $this->makeTableHeader("resource",$db." result",$numfields+1); $this->out .= " "; for($i=0;$i<$numfields;$i++) { $field_header = ""; for($j=0; $jout .= "".$field_name.""; } $this->out .= ""; for($i=0;$i<$numrows;$i++) { $row=call_user_func($db."_fetch_array",$var,constant(strtoupper($db)."_ASSOC")); $this->out .= "\n"; $this->out .= "".($i+1).""; for($k=0;$k<$numfields;$k++) { $tempField=$field[$k]->name; $fieldrow=$row[($field[$k]->name)]; $fieldrow=($fieldrow==="") ? "[empty string]" : $fieldrow; $this->out .= "".$fieldrow."\n"; } $this->out .= "\n"; } $this->out .= ""; if($numrows>0) call_user_func($db."_data_seek",$var,0); } //if variable is an image/gd resource type function varIsGDResource($var) { $this->makeTableHeader("resource","gd",2); $this->makeTDHeader("resource","Width"); $this->out .= imagesx($var).$this->closeTDRow(); $this->makeTDHeader("resource","Height"); $this->out .= imagesy($var).$this->closeTDRow(); $this->makeTDHeader("resource","Colors"); $this->out .= imagecolorstotal($var).$this->closeTDRow(); $this->out .= ""; } //if variable is an xml type function varIsXml($var) { $this->varIsXmlResource($var); } //if variable is an xml resource type function varIsXmlResource($var) { $xml_parser=xml_parser_create(); xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0); xml_set_element_handler($xml_parser,array(&$this,"xmlStartElement"),array(&$this,"xmlEndElement")); xml_set_character_data_handler($xml_parser,array(&$this,"xmlCharacterData")); xml_set_default_handler($xml_parser,array(&$this,"xmlDefaultHandler")); $this->makeTableHeader("xml","xml document",2); $this->makeTDHeader("xml","xmlRoot"); //attempt to open xml file $bFile=(!($fp=@fopen($var,"r"))) ? false : true; //read xml file if($bFile) { while($data=str_replace("\n","",fread($fp,4096))) $this->xmlParse($xml_parser,$data,feof($fp)); } //if xml is not a file, attempt to read it as a string else { if(!is_string($var)) { $this->out .= $this->error("xml").$this->closeTDRow()."\n"; return; } $data=$var; $this->xmlParse($xml_parser,$data,1); } $this->out .= $this->closeTDRow()."\n"; } //parse xml function xmlParse($xml_parser,$data,$bFinal) { if (!xml_parse($xml_parser,$data,$bFinal)) { die(sprintf("XML error: %s at line %d\n", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } //xml: inititiated when a start tag is encountered function xmlStartElement($parser,$name,$attribs) { $this->xmlAttrib[$this->xmlCount]=$attribs; $this->xmlName[$this->xmlCount]=$name; $this->xmlSData[$this->xmlCount]='$this->makeTableHeader("xml","xml element",2);'; $this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlName");'; $this->xmlSData[$this->xmlCount].='$this->out .= "'.$this->xmlName[$this->xmlCount].'".$this->closeTDRow();'; $this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlAttributes");'; if(count($attribs)>0) $this->xmlSData[$this->xmlCount].='$this->varIsArray($this->xmlAttrib['.$this->xmlCount.']);'; else $this->xmlSData[$this->xmlCount].='$this->out .= " ";'; $this->xmlSData[$this->xmlCount].='$this->out .= $this->closeTDRow();'; $this->xmlCount++; } //xml: initiated when an end tag is encountered function xmlEndElement($parser,$name) { for($i=0;$i<$this->xmlCount;$i++) { eval($this->xmlSData[$i]); $this->makeTDHeader("xml","xmlText"); $this->out .= (!empty($this->xmlCData[$i])) ? $this->xmlCData[$i] : " "; $this->out .= $this->closeTDRow(); $this->makeTDHeader("xml","xmlComment"); $this->out .= (!empty($this->xmlDData[$i])) ? $this->xmlDData[$i] : " "; $this->out .= $this->closeTDRow(); $this->makeTDHeader("xml","xmlChildren"); unset($this->xmlCData[$i],$this->xmlDData[$i]); } $this->out .= $this->closeTDRow(); $this->out .= ""; $this->xmlCount=0; } //xml: initiated when text between tags is encountered function xmlCharacterData($parser,$data) { $count=$this->xmlCount-1; if(!empty($this->xmlCData[$count])) $this->xmlCData[$count].=$data; else $this->xmlCData[$count]=$data; } //xml: initiated when a comment or other miscellaneous texts is encountered function xmlDefaultHandler($parser,$data) { //strip '' off comments $data=str_replace(array("<!--","-->"),"",htmlspecialchars($data)); $count=$this->xmlCount-1; if(!empty($this->xmlDData[$count])) $this->xmlDData[$count].=$data; else $this->xmlDData[$count]=$data; } function initJSandCSS() { $out = << table.dBug_array,table.dBug_object,table.dBug_resource,table.dBug_resourceC,table.dBug_xml { font-family:Verdana, Arial, Helvetica, sans-serif; color:#000000; font-size:8pt; } table.dBug_array td,table.dBug_object td,table.dBug_resource td,table.dBug_resourceC td,table.dBug_xml td { font-family:Verdana, Arial, Helvetica, sans-serif; color:#000000; font-size:7pt; } .dBug_arrayHeader, .dBug_objectHeader, .dBug_resourceHeader, .dBug_resourceCHeader, .dBug_xmlHeader { font-weight:bold; color:#FFFFFF; cursor:pointer; } .dBug_arrayKey, .dBug_objectKey, .dBug_xmlKey { cursor:pointer; } /* array */ table.dBug_array { background-color:#00A000; margin-top:8px;} table.dBug_array td { background-color:#FFFFFF; padding-left:3px; font-size:8pt; } table.dBug_array td.dBug_arrayHeader { background-color:#90FF90; } table.dBug_array td.dBug_arrayKey { background-color:#CCFFCC; text-align:right; padding-right:5px; } /* object */ table.dBug_object { background-color:#4040FF; margin-top:8px;} table.dBug_object td { background-color:#FFFFFF; font-size:8pt; } table.dBug_object td.dBug_objectHeader { background-color:#C0C0FF; } table.dBug_object td.dBug_objectKey { background-color:#CCDDFF; text-align:right; padding-right:5px; } /* resource */ table.dBug_resourceC { background-color:#884488; margin-top:8px;} table.dBug_resourceC td { background-color:#FFFFFF; font-size:8pt; } table.dBug_resourceC td.dBug_resourceCHeader { background-color:#AA66AA; } table.dBug_resourceC td.dBug_resourceCKey { background-color:#FFDDFF; text-align:right; padding-right:5px; } /* resource */ table.dBug_resource { background-color:#884488; margin-top:8px;} table.dBug_resource td { background-color:#FFFFFF; font-size:8pt; } table.dBug_resource td.dBug_resourceHeader { background-color:#AA66AA; } table.dBug_resource td.dBug_resourceKey { background-color:#FFDDFF; text-align:right; padding-right:5px; } /* xml */ table.dBug_xml { background-color:#888888;} table.dBug_xml td { background-color:#FFFFFF; font-size:8pt; } table.dBug_xml td.dBug_xmlHeader { background-color:#AAAAAA; } table.dBug_xml td.dBug_xmlKey { background-color:#DDDDDD; text-align:right; padding-right:5px; } SCRIPTS; return $out; } } ?> Andreas Blöschl Photography