00001 <?php
00002
00003
00040 ?>
00041 <script language="JavaScript">
00042
00043 function dBug_toggleRow(source) {
00044 target=(document.all) ? source.parentElement.cells[1] : source.parentNode.lastChild
00045 dBug_toggleTarget(target,dBug_toggleSource(source));
00046 }
00047
00048 function dBug_toggleSource(source) {
00049 if (source.style.fontStyle=='italic') {
00050 source.style.fontStyle='normal';
00051 source.title='click to collapse';
00052 return 'open';
00053 } else {
00054 source.style.fontStyle='italic';
00055 source.title='click to expand';
00056 return 'closed';
00057 }
00058 }
00059
00060 function dBug_toggleTarget(target,switchToState) {
00061 target.style.display=(switchToState=='open') ? '' : 'none';
00062 }
00063
00064 function dBug_toggleTable(source) {
00065 var switchToState=dBug_toggleSource(source);
00066 if(document.all) {
00067 var table=source.parentElement.parentElement;
00068 for(var i=1;i<table.rows.length;i++) {
00069 target=table.rows[i];
00070 dBug_toggleTarget(target,switchToState);
00071 }
00072 }
00073 else {
00074 var table=source.parentNode.parentNode;
00075 for (var i=1;i<table.childNodes.length;i++) {
00076 target=table.childNodes[i];
00077 if(target.style) {
00078 dBug_toggleTarget(target,switchToState);
00079 }
00080 }
00081 }
00082 }
00083 </script>
00084
00085 <style type="text/css">
00086 table.dBug_array,table.dBug_object,table.dBug_resource,table.dBug_resourceC,table.dBug_xml {
00087 font-family:Verdana, Arial, Helvetica, sans-serif; color:#000000; font-size:12px;
00088 }
00089
00090 .dBug_arrayHeader,
00091 .dBug_objectHeader,
00092 .dBug_resourceHeader,
00093 .dBug_resourceCHeader,
00094 .dBug_xmlHeader
00095 { font-weight:bold; color:#FFFFFF; }
00096
00097
00098 table.dBug_array { background-color:#006600; }
00099 table.dBug_array td { background-color:#FFFFFF; }
00100 table.dBug_array td.dBug_arrayHeader { background-color:#009900; }
00101 table.dBug_array td.dBug_arrayKey { background-color:#CCFFCC; }
00102
00103
00104 table.dBug_object { background-color:#0000CC; }
00105 table.dBug_object td { background-color:#FFFFFF; }
00106 table.dBug_object td.dBug_objectHeader { background-color:#4444CC; }
00107 table.dBug_object td.dBug_objectKey { background-color:#CCDDFF; }
00108
00109
00110 table.dBug_resourceC { background-color:#884488; }
00111 table.dBug_resourceC td { background-color:#FFFFFF; }
00112 table.dBug_resourceC td.dBug_resourceCHeader { background-color:#AA66AA; }
00113 table.dBug_resourceC td.dBug_resourceCKey { background-color:#FFDDFF; }
00114
00115
00116 table.dBug_resource { background-color:#884488; }
00117 table.dBug_resource td { background-color:#FFFFFF; }
00118 table.dBug_resource td.dBug_resourceHeader { background-color:#AA66AA; }
00119 table.dBug_resource td.dBug_resourceKey { background-color:#FFDDFF; }
00120
00121
00122 table.dBug_xml { background-color:#888888; }
00123 table.dBug_xml td { background-color:#FFFFFF; }
00124 table.dBug_xml td.dBug_xmlHeader { background-color:#AAAAAA; }
00125 table.dBug_xml td.dBug_xmlKey { background-color:#DDDDDD; }
00126 </style>
00127
00128 <?php
00129 class dBug {
00130
00131 var $xmlDepth=array();
00132 var $xmlCData;
00133 var $xmlSData;
00134 var $xmlDData;
00135 var $xmlCount=0;
00136 var $xmlAttrib;
00137 var $xmlName;
00138 var $arrType=array("array","object","resource","boolean");
00139
00140
00141 function dBug($var,$forceType="") {
00142 $arrAccept=array("array","object","xml");
00143 if(in_array($forceType,$arrAccept))
00144 $this->{"varIs".ucfirst($forceType)}($var);
00145 else
00146 $this->checkType($var);
00147 }
00148
00149
00150 function makeTableHeader($type,$header,$colspan=2) {
00151 echo "<table cellspacing=2 cellpadding=3 class=\"dBug_".$type."\">
00152 <tr>
00153 <td class=\"dBug_".$type."Header\" colspan=".$colspan." style=\"cursor:hand\" onClick='dBug_toggleTable(this)'>".$header."</td>
00154 </tr>";
00155 }
00156
00157
00158 function makeTDHeader($type,$header) {
00159 echo "<tr>
00160 <td valign=\"top\" onClick='dBug_toggleRow(this)' style=\"cursor:hand\" class=\"dBug_".$type."Key\">".$header."</td>
00161 <td>";
00162 }
00163
00164
00165 function closeTDRow() {
00166 return "</td>\n</tr>\n";
00167 }
00168
00169
00170 function error($type) {
00171 $error="Error: Variable is not a";
00172
00173
00174 if(in_array(substr($type,0,1),array("a","e","i","o","u","x")))
00175 $error.="n";
00176 return ($error." ".$type." type");
00177 }
00178
00179
00180 function checkType($var) {
00181 switch(gettype($var)) {
00182 case "resource":
00183 $this->varIsResource($var);
00184 break;
00185 case "object":
00186 $this->varIsObject($var);
00187 break;
00188 case "array":
00189 $this->varIsArray($var);
00190 break;
00191 case "boolean":
00192 $this->varIsBoolean($var);
00193 break;
00194 default:
00195 $var=($var=="") ? "[empty string]" : $var;
00196
00197 $additional = ($var == "[empty string]") ? '' : ' ('. gettype($var) . ', length: ' . strlen($var) .')';
00198
00199 echo "<table cellspacing=1 class='dBug_array'><tr>\n<td class='dBug_arrayKey'>\n<pre>".$var."</pre></td>\n<td>\n". $additional ."</td>\n</tr>\n</table>\n";
00200 break;
00201 }
00202 }
00203
00204
00205
00206
00207 function varIsBoolean($var) {
00208 $var=($var==1) ? "TRUE" : "FALSE";
00209 echo $var;
00210 }
00211
00212
00213 function varIsArray($var) {
00214 $this->makeTableHeader("array","array of size " . count($var));
00215 if(is_array($var)) {
00216 foreach($var as $key=>$value) {
00217 $this->makeTDHeader("array",$key);
00218 if(in_array(gettype($value),$this->arrType))
00219 $this->checkType($value);
00220 else {
00221 $value=(trim($value)=="") ? "[empty string]" : $value;
00222 $additional = ($value == "[empty string]") ? '' : ' ('. gettype($value) . ', length: ' . strlen($value) .')';
00223
00224 echo $value."</td>\n<td>\n ". $additional ."</td>\n</tr>\n";
00225 }
00226 }
00227 }
00228 else echo "<tr><td>".$this->error("array").$this->closeTDRow();
00229 echo "</table>";
00230 }
00231
00232
00233 function varIsObject($var) {
00234 $this->makeTableHeader("object", "object of type " . get_class($var));
00235 $arrObjVars=get_object_vars($var);
00236 if(is_object($var)) {
00237 foreach($arrObjVars as $key=>$value) {
00238 $value=(trim($value)=="") ? "[empty string]" : $value;
00239
00240 $additional = ($value == "[empty string]") ? '' : ' ('. gettype($value) . ', length: ' . strlen($value) .')';
00241
00242 $this->makeTDHeader("object",$key);
00243 if(in_array(gettype($value),$this->arrType))
00244 $this->checkType($value);
00245 else echo $value . $additional .$this->closeTDRow();
00246 }
00247 $arrObjMethods=get_class_methods(get_class($var));
00248 foreach($arrObjMethods as $key=>$value) {
00249 $this->makeTDHeader("object",$value);
00250 echo "[method]".$this->closeTDRow();
00251 }
00252 }
00253 else echo "<tr><td>".$this->error("object").$this->closeTDRow();
00254 echo "</table>";
00255 }
00256
00257
00258 function varIsResource($var) {
00259 $this->makeTableHeader("resourceC","resource of type ".get_resource_type($var),1);
00260 echo "<tr>\n<td>\n";
00261 switch(get_resource_type($var)) {
00262 case "fbsql result":
00263 case "mssql result":
00264 case "msql query":
00265 case "pgsql result":
00266 case "sybase-db result":
00267 case "sybase-ct result":
00268 case "mysql result":
00269 $db=current(explode(" ",get_resource_type($var)));
00270 $this->varIsDBResource($var,$db);
00271 break;
00272 case "gd":
00273 $this->varIsGDResource($var);
00274 break;
00275 case "xml":
00276 $this->varIsXmlResource($var);
00277 break;
00278 default:
00279 echo get_resource_type($var).$this->closeTDRow();
00280 break;
00281 }
00282 echo $this->closeTDRow()."</table>\n";
00283 }
00284
00285
00286 function varIsXml($var) {
00287 $this->varIsXmlResource($var);
00288 }
00289
00290
00291 function varIsXmlResource($var) {
00292 $xml_parser=xml_parser_create();
00293 xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
00294 xml_set_element_handler($xml_parser,array(&$this,"xmlStartElement"),array(&$this,"xmlEndElement"));
00295 xml_set_character_data_handler($xml_parser,array(&$this,"xmlCharacterData"));
00296 xml_set_default_handler($xml_parser,array(&$this,"xmlDefaultHandler"));
00297
00298 $this->makeTableHeader("xml","xml document",2);
00299 $this->makeTDHeader("xml","xmlRoot");
00300
00301
00302 $bFile=(!($fp=@fopen($var,"r"))) ? false : true;
00303
00304
00305 if($bFile) {
00306 while($data=str_replace("\n","",fread($fp,4096)))
00307 $this->xmlParse($xml_parser,$data,feof($fp));
00308 }
00309
00310 else {
00311 if(!is_string($var)) {
00312 echo $this->error("xml").$this->closeTDRow()."</table>\n";
00313 return;
00314 }
00315 $data=$var;
00316 $this->xmlParse($xml_parser,$data,1);
00317 }
00318
00319 echo $this->closeTDRow()."</table>\n";
00320
00321 }
00322
00323
00324 function xmlParse($xml_parser,$data,$bFinal) {
00325 if (!xml_parse($xml_parser,$data,$bFinal)) {
00326 die(sprintf("XML error: %s at line %d\n",
00327 xml_error_string(xml_get_error_code($xml_parser)),
00328 xml_get_current_line_number($xml_parser)));
00329 }
00330 }
00331
00332
00333 function xmlStartElement($parser,$name,$attribs) {
00334 $this->xmlAttrib[$this->xmlCount]=$attribs;
00335 $this->xmlName[$this->xmlCount]=$name;
00336 $this->xmlSData[$this->xmlCount]='$this->makeTableHeader("xml","xml element",2);';
00337 $this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlName");';
00338 $this->xmlSData[$this->xmlCount].='echo "<strong>'.$this->xmlName[$this->xmlCount].'</strong>".$this->closeTDRow();';
00339 $this->xmlSData[$this->xmlCount].='$this->makeTDHeader("xml","xmlAttributes");';
00340 if(count($attribs)>0)
00341 $this->xmlSData[$this->xmlCount].='$this->varIsArray($this->xmlAttrib['.$this->xmlCount.']);';
00342 else
00343 $this->xmlSData[$this->xmlCount].='echo " ";';
00344 $this->xmlSData[$this->xmlCount].='echo $this->closeTDRow();';
00345 $this->xmlCount++;
00346 }
00347
00348
00349 function xmlEndElement($parser,$name) {
00350 for($i=0;$i<$this->xmlCount;$i++) {
00351 eval($this->xmlSData[$i]);
00352 $this->makeTDHeader("xml","xmlText");
00353 echo (!empty($this->xmlCData[$i])) ? $this->xmlCData[$i] : " ";
00354 echo $this->closeTDRow();
00355 $this->makeTDHeader("xml","xmlComment");
00356 echo (!empty($this->xmlDData[$i])) ? $this->xmlDData[$i] : " ";
00357 echo $this->closeTDRow();
00358 $this->makeTDHeader("xml","xmlChildren");
00359 unset($this->xmlCData[$i],$this->xmlDData[$i]);
00360 }
00361 echo $this->closeTDRow();
00362 echo "</table>";
00363 $this->xmlCount=0;
00364 }
00365
00366
00367 function xmlCharacterData($parser,$data) {
00368 $count=$this->xmlCount-1;
00369 if(!empty($this->xmlCData[$count]))
00370 $this->xmlCData[$count].=$data;
00371 else
00372 $this->xmlCData[$count]=$data;
00373 }
00374
00375
00376 function xmlDefaultHandler($parser,$data) {
00377
00378 $data=str_replace(array("<!--","-->"),"",htmlspecialchars($data));
00379 $count=$this->xmlCount-1;
00380 if(!empty($this->xmlDData[$count]))
00381 $this->xmlDData[$count].=$data;
00382 else
00383 $this->xmlDData[$count]=$data;
00384 }
00385
00386
00387 function varIsDBResource($var,$db="mysql") {
00388 $numrows=call_user_func($db."_num_rows",$var);
00389 $numfields=call_user_func($db."_num_fields",$var);
00390 $this->makeTableHeader("resource",$db." result",$numfields+1);
00391 echo "<tr><td class=\"dBug_resourceKey\"> </td>";
00392 for($i=0;$i<$numfields;$i++) {
00393 $field[$i]=call_user_func($db."_fetch_field",$var,$i);
00394 echo "<td class=\"dBug_resourceKey\">".$field[$i]->name."</td>";
00395 }
00396 echo "</tr>";
00397 for($i=0;$i<$numrows;$i++) {
00398 $row=call_user_func($db."_fetch_array",$var,constant(strtoupper($db)."_ASSOC"));
00399 echo "<tr>\n";
00400 echo "<td class=\"dBug_resourceKey\">".($i+1)."</td>";
00401 for($k=0;$k<$numfields;$k++) {
00402 $tempField=$field[$k]->name;
00403 $fieldrow=$row[($field[$k]->name)];
00404 $fieldrow=($fieldrow=="") ? "[empty string]" : $fieldrow;
00405 echo "<td>".$fieldrow."</td>\n";
00406 }
00407 echo "</tr>\n";
00408 }
00409 echo "</table>";
00410 if($numrows>0)
00411 call_user_func($db."_data_seek",$var,0);
00412 }
00413
00414
00415 function varIsGDResource($var) {
00416 $this->makeTableHeader("resource","gd",2);
00417 $this->makeTDHeader("resource","Width");
00418 echo imagesx($var).$this->closeTDRow();
00419 $this->makeTDHeader("resource","Height");
00420 echo imagesy($var).$this->closeTDRow();
00421 $this->makeTDHeader("resource","Colors");
00422 echo imagecolorstotal($var).$this->closeTDRow();
00423 echo "</table>";
00424 }
00425 }
00426 ?>