3 if (!defined(
'ADODB_DIR')) die();
6 $ADODB_INCLUDED_LIB = 1;
20 $rez = preg_match(
'/(\sORDER\s+BY\s(?:[^)](?!limit))*)(?:\sLIMIT\s+[0-9]+)?/is', $sql, $arr);
22 if (strpos($arr[1],
'(') !==
false) {
23 $at = strpos($sql, $arr[1]);
25 for ($i=$at, $max=strlen($sql); $i < $max; $i++) {
29 } elseif($ch ==
')') {
36 $sql = substr($sql,0,$at).substr($sql,$i);
38 $sql = str_replace($arr[1],
'', $sql);
44 $sql =
'select * from (select a from b order by a(b),b(c) desc)';
45 $sql =
'(select * from abc order by 1)';
53 if ($probe >
sizeof($array)) $max =
sizeof($array);
57 for ($j=0;$j < $max; $j++) {
64 if (isset($types[$i]) && $types[$i]==
'C')
continue;
69 if (!preg_match(
'/^[+-]{0,1}[0-9\.]+$/',$v)) {
79 if (strlen($v) == 0) $types[$i] =
'C';
80 if (strpos($v,
'.') !==
false) $types[$i] =
'N';
81 else $types[$i] =
'I';
85 if (strpos($v,
'.') !==
false) $types[$i] =
'N';
94 $oldX =
sizeof(reset($arr));
99 $hdr = array(
'Fields');
100 for ($y = 0; $y < $oldY; $y++) {
101 $hdr[] = $arr[$y][0];
106 for ($x = $startx; $x < $oldX; $x++) {
109 $newarr[] = array($o->name);
113 for ($y = 0; $y < $oldY; $y++) {
114 $newarr[$x-$startx][] = $arr[$y][$x];
123 if (is_array($an_array)) {
124 $new_array = array();
125 foreach($an_array as $key=>$value)
126 $new_array[strtoupper($key)] = $value;
134 function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc)
136 if (count($fieldArray) == 0)
return 0;
140 if (!is_array($keyCol)) {
141 $keyCol = array($keyCol);
143 foreach($fieldArray as $k => $v) {
146 $fieldArray[$k] = $v;
147 }
else if ($autoQuote && strcasecmp($v,$zthis->null2null)!=0) {
148 $v = $zthis->qstr($v);
149 $fieldArray[$k] = $v;
151 if (in_array($k,$keyCol))
continue;
161 foreach ($keyCol as $v) {
162 if (isset($fieldArray[$v])) {
163 if ($where) $where .=
' and '.$v.
'='.$fieldArray[$v];
164 else $where = $v.
'='.$fieldArray[$v];
168 if ($uSet && $where) {
169 $update =
"UPDATE $table SET $uSet WHERE $where";
171 $rs = $zthis->Execute($update);
175 if ($zthis->poorAffectedRows) {
180 if ($zthis->ErrorNo()<>0)
return 0;
182 # affected_rows == 0 if update field values identical to old values
183 # for mysql - which is silly.
185 $cnt = $zthis->GetOne(
"select count(*) from $table where $where");
186 if (
$cnt > 0)
return 1;
188 if (($zthis->Affected_Rows()>0))
return 1;
196 foreach($fieldArray as $k => $v) {
197 if ($has_autoinc && in_array($k,$keyCol))
continue;
208 $insert =
"INSERT INTO $table ($iCols) VALUES ($iVals)";
209 $rs = $zthis->Execute($insert);
210 return ($rs) ? 2 : 0;
214 function _adodb_getmenu(&$zthis, $name,$defstr=
'',$blank1stItem=
true,$multiple=
false,
215 $size=0, $selectAttr=
'',$compareFields0=
true)
219 if ($multiple or is_array($defstr)) {
220 if ($size==0) $size=5;
221 $attr =
' multiple size="'.$size.
'"';
222 if (!strpos($name,
'[]')) $name .=
'[]';
223 }
else if ($size) $attr =
' size="'.$size.
'"';
226 $s =
'<select name="'.$name.
'"'.$attr.
' '.$selectAttr.
'>';
228 if (is_string($blank1stItem)) {
229 $barr = explode(
':',$blank1stItem);
230 if (
sizeof($barr) == 1) $barr[] =
'';
231 $s .=
"\n<option value=\"".$barr[0].
"\">".$barr[1].
"</option>";
232 }
else $s .=
"\n<option></option>";
234 if ($zthis->FieldCount() > 1) $hasvalue=
true;
235 else $compareFields0 =
true;
240 $fieldsize = $zthis->FieldCount();
241 while(!$zthis->EOF) {
242 $zval = rtrim(reset($zthis->fields));
244 if ($blank1stItem && $zval==
"") {
249 if ($fieldsize > 1) {
250 if (isset($zthis->fields[1]))
251 $zval2 = rtrim($zthis->fields[1]);
253 $zval2 = rtrim(next($zthis->fields));
255 $selected = ($compareFields0) ? $zval : $zval2;
258 if ($fieldsize > 2) {
259 $group = rtrim($zthis->fields[2]);
274 $value =
" value='".htmlspecialchars($zval2).
"'";
276 if (is_array($defstr)) {
278 if (in_array($selected,$defstr))
279 $s .=
"\n<option selected='selected'$value>".htmlspecialchars($zval).
'</option>';
281 $s .=
"\n<option".$value.
'>'.htmlspecialchars($zval).
'</option>';
284 if (strcasecmp($selected,$defstr)==0)
285 $s .=
"\n<option selected='selected'$value>".htmlspecialchars($zval).
'</option>';
287 $s .=
"\n<option".$value.
'>'.htmlspecialchars($zval).
'</option>';
293 if($optgroup != null) {
294 $s .=
"\n</optgroup>";
296 return $s .
"\n</select>\n";
301 $size=0, $selectAttr=
'',$compareFields0=
true)
305 if ($multiple or is_array($defstr)) {
306 if ($size==0) $size=5;
307 $attr =
' multiple size="'.$size.
'"';
308 if (!strpos($name,
'[]')) $name .=
'[]';
309 }
else if ($size) $attr =
' size="'.$size.
'"';
312 $s =
'<select name="'.$name.
'"'.$attr.
' '.$selectAttr.
'>';
314 if (is_string($blank1stItem)) {
315 $barr = explode(
':',$blank1stItem);
316 if (
sizeof($barr) == 1) $barr[] =
'';
317 $s .=
"\n<option value=\"".$barr[0].
"\">".$barr[1].
"</option>";
318 }
else $s .=
"\n<option></option>";
320 if ($zthis->FieldCount() > 1) $hasvalue=
true;
321 else $compareFields0 =
true;
326 $fieldsize =
sizeof($zthis->fields);
327 while(!$zthis->EOF) {
328 $zval = rtrim(reset($zthis->fields));
330 if ($blank1stItem && $zval==
"") {
335 if ($fieldsize > 1) {
336 if (isset($zthis->fields[1]))
337 $zval2 = rtrim($zthis->fields[1]);
339 $zval2 = rtrim(next($zthis->fields));
341 $selected = ($compareFields0) ? $zval : $zval2;
344 if (isset($zthis->fields[2])) {
345 $group = rtrim($zthis->fields[2]);
348 if ($optgroup != $group) {
352 $s .=
"\n<optgroup label='". htmlspecialchars($group) .
"'>";
354 $s .=
"\n</optgroup>";
355 $s .=
"\n<optgroup label='". htmlspecialchars($group) .
"'>";
360 $value =
" value='".htmlspecialchars($zval2).
"'";
362 if (is_array($defstr)) {
364 if (in_array($selected,$defstr))
365 $s .=
"\n<option selected='selected'$value>".htmlspecialchars($zval).
'</option>';
367 $s .=
"\n<option".$value.
'>'.htmlspecialchars($zval).
'</option>';
370 if (strcasecmp($selected,$defstr)==0)
371 $s .=
"\n<option selected='selected'$value>".htmlspecialchars($zval).
'</option>';
373 $s .=
"\n<option".$value.
'>'.htmlspecialchars($zval).
'</option>';
379 if($optgroup != null) {
380 $s .=
"\n</optgroup>";
382 return $s .
"\n</select>\n";
402 if (!empty($zthis->_nestedSQL) || preg_match(
"/^\s*SELECT\s+DISTINCT/is", $sql) ||
403 preg_match(
'/\s+GROUP\s+BY\s+/is',$sql) ||
404 preg_match(
'/\s+UNION\s+/is',$sql)) {
410 if ($zthis->dataProvider ==
'oci8') {
412 if (preg_match(
'#/\\*+.*?\\*\\/#', $sql, $hint)) {
413 $rewritesql =
"SELECT ".$hint[0].
" COUNT(*) FROM (".$rewritesql.
")";
415 $rewritesql =
"SELECT COUNT(*) FROM (".$rewritesql.
")";
417 }
else if (strncmp($zthis->databaseType,
'postgres',8) == 0 || strncmp($zthis->databaseType,
'mysql',5) == 0) {
418 $rewritesql =
"SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_";
420 $rewritesql =
"SELECT COUNT(*) FROM ($rewritesql)";
424 $rewritesql = preg_replace(
425 '/^\s*SELECT\s.*\s+FROM\s/Uis',
'SELECT COUNT(*) FROM ',$sql);
432 if (isset($rewritesql) && $rewritesql != $sql) {
433 if (preg_match(
'/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0];
438 $qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr);
441 $qryRecs = $zthis->GetOne($rewritesql,$inputarr);
443 if ($qryRecs !==
false)
return $qryRecs;
450 if (preg_match(
'/\s*UNION\s*/is', $sql)) $rewritesql = $sql;
453 if (preg_match(
'/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0];
456 $rstest = $zthis->CacheExecute($secs2cache,$rewritesql,$inputarr);
457 if (!$rstest) $rstest = $zthis->CacheExecute($secs2cache,$sql,$inputarr);
459 $rstest = $zthis->Execute($rewritesql,$inputarr);
460 if (!$rstest) $rstest = $zthis->Execute($sql,$inputarr);
463 $qryRecs = $rstest->RecordCount();
464 if ($qryRecs == -1) {
465 global $ADODB_EXTENSION;
467 if ($ADODB_EXTENSION) {
468 while(!$rstest->EOF) {
469 adodb_movenext($rstest);
472 while(!$rstest->EOF) {
476 $qryRecs = $rstest->_currentRow;
479 if ($qryRecs == -1)
return 0;
494 $inputarr=
false, $secs2cache=0)
496 $atfirstpage =
false;
502 if (!isset($nrows) || $nrows <= 0) $nrows = 10;
507 $lastpageno = (int) ceil($qryRecs / $nrows);
508 $zthis->_maxRecordCount = $qryRecs;
515 if ($page >= $lastpageno) {
521 if (empty($page) || $page <= 1) {
527 $offset = $nrows * ($page-1);
529 $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);
531 $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);
536 $rsreturn->_maxRecordCount = $qryRecs;
537 $rsreturn->rowsPerPage = $nrows;
538 $rsreturn->AbsolutePage($page);
539 $rsreturn->AtFirstPage($atfirstpage);
540 $rsreturn->AtLastPage($atlastpage);
541 $rsreturn->LastPageNo($lastpageno);
550 $atfirstpage =
false;
553 if (!isset($page) || $page <= 1) {
557 if ($nrows <= 0) $nrows = 10;
561 $pagecounter = $page + 1;
562 $pagecounteroffset = ($pagecounter * $nrows) - $nrows;
563 if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);
564 else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);
566 while ($rstest && $rstest->EOF && $pagecounter>0) {
569 $pagecounteroffset = $nrows * ($pagecounter - 1);
571 if ($secs2cache>0) $rstest = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);
572 else $rstest = $zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);
574 if ($rstest) $rstest->Close();
577 $page = $pagecounter;
578 if ($page == 1) $atfirstpage =
true;
583 $offset = $nrows * ($page-1);
584 if ($secs2cache > 0) $rsreturn = $zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);
585 else $rsreturn = $zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);
589 $rsreturn->rowsPerPage = $nrows;
590 $rsreturn->AbsolutePage($page);
591 $rsreturn->AtFirstPage($atfirstpage);
592 $rsreturn->AtLastPage($atlastpage);
599 global $ADODB_QUOTE_FIELDNAMES;
602 printf(ADODB_BAD_RS,
'GetUpdateSQL');
606 $fieldUpdatedCount = 0;
609 $hasnumeric = isset($rs->fields[0]);
613 for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
615 $field = $rs->FetchField($i);
619 $upperfname = strtoupper($field->name);
627 if ($hasnumeric) $val = $rs->fields[$i];
628 else if (isset($rs->fields[$upperfname])) $val = $rs->fields[$upperfname];
629 else if (isset($rs->fields[$field->name])) $val = $rs->fields[$field->name];
630 else if (isset($rs->fields[strtolower($upperfname)])) $val = $rs->fields[strtolower($upperfname)];
634 if ($forceUpdate || strcmp($val, $arrFields[$upperfname])) {
636 $fieldUpdatedCount++;
640 $type = $rs->MetaType($field->type);
643 if ($type ==
'null') {
647 if ((strpos($upperfname,
' ') !==
false) || ($ADODB_QUOTE_FIELDNAMES)) {
648 switch (ADODB_QUOTE_FIELDNAMES) {
650 $fnameq = $zthis->nameQuote.strtolower($field->name).$zthis->nameQuote;
break;
652 $fnameq = $zthis->nameQuote.$field->name.$zthis->nameQuote;
break;
655 $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;
break;
658 $fnameq = $upperfname;
663 if (is_null($arrFields[$upperfname])
664 || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
665 || $arrFields[$upperfname] === $zthis->null2null
676 $setFields .= $field->name .
" = null, ";
681 $arrFields[$upperfname] =
"";
682 $setFields .=
_adodb_column_sql($zthis,
'U', $type, $upperfname, $fnameq,$arrFields, $magicq);
687 if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) {
688 $setFields .= $field->name .
" = null, ";
690 $setFields .=
_adodb_column_sql($zthis,
'U', $type, $upperfname, $fnameq,$arrFields, $magicq);
701 $arrFields, $magicq);
708 if ($fieldUpdatedCount > 0 || $forceUpdate) {
710 if (!empty($rs->tableName)) $tableName = $rs->tableName;
712 preg_match(
"/FROM\s+".ADODB_TABLE_REGEX.
"/is", $rs->sql, $tableName);
713 $tableName = $tableName[1];
717 preg_match(
'/\sWHERE\s(.*)/is', $rs->sql, $whereClause);
722 #var_dump($whereClause);
723 if (preg_match(
'/\s(ORDER\s.*)/is', $whereClause[1], $discard));
724 else if (preg_match(
'/\s(LIMIT\s.*)/is', $whereClause[1], $discard));
725 else if (preg_match(
'/\s(FOR UPDATE.*)/is', $whereClause[1], $discard));
726 else preg_match(
'/\s.*(\) WHERE .*)/is', $whereClause[1], $discard); # see http:
728 $whereClause = array(
false,
false);
731 $whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1]));
733 $sql =
'UPDATE '.$tableName.
' SET '.substr($setFields, 0, -2);
734 if (strlen($whereClause[1]) > 0)
735 $sql .=
' WHERE '.$whereClause[1];
748 return (!empty($arr[$key])) || (isset($arr[$key]) && strlen($arr[$key])>0);
751 if (isset($arr[$key]))
return true;
753 if (ADODB_PHPVER >= 0x4010)
return array_key_exists($key,$arr);
766 static $cacheRS =
false;
767 static $cacheSig = 0;
769 global $ADODB_QUOTE_FIELDNAMES;
776 $fieldInsertedCount = 0;
778 if (is_string($rs)) {
786 $rsclass = $zthis->rsPrefix.$zthis->databaseType;
787 $recordSet =
new $rsclass(-1,$zthis->fetchMode);
788 $recordSet->connection = $zthis;
790 if (is_string($cacheRS) && $cacheRS == $rs) {
791 $columns = $cacheCols;
793 $columns = $zthis->MetaColumns( $tableName );
794 $cacheRS = $tableName;
795 $cacheCols = $columns;
797 }
else if (is_subclass_of($rs,
'adorecordset')) {
798 if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) {
799 $columns = $cacheCols;
801 for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++)
802 $columns[] = $rs->FetchField($i);
803 $cacheRS = $cacheSig;
804 $cacheCols = $columns;
805 $rs->insertSig = $cacheSig++;
810 printf(ADODB_BAD_RS,
'GetInsertSQL');
815 foreach( $columns as $field ) {
816 $upperfname = strtoupper($field->name);
819 if ((strpos($upperfname,
' ') !==
false) || ($ADODB_QUOTE_FIELDNAMES)) {
820 switch (ADODB_QUOTE_FIELDNAMES) {
822 $fnameq = $zthis->nameQuote.strtolower($field->name).$zthis->nameQuote;
break;
824 $fnameq = $zthis->nameQuote.$field->name.$zthis->nameQuote;
break;
827 $fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;
break;
830 $fnameq = $upperfname;
832 $type = $recordSet->MetaType($field->type);
835 if (is_null($arrFields[$upperfname])
836 || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)
837 || $arrFields[$upperfname] === $zthis->null2null
852 $arrFields[$upperfname] =
"";
853 $values .=
_adodb_column_sql($zthis,
'I', $type, $upperfname, $fnameq,$arrFields, $magicq);
859 if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) {
862 $values .=
_adodb_column_sql($zthis,
'I', $type, $upperfname, $fnameq, $arrFields, $magicq);
874 $arrFields, $magicq);
879 $fieldInsertedCount++;
883 $fields .= $fnameq .
", ";
889 if ($fieldInsertedCount <= 0)
return false;
893 if (!empty($rs->tableName)) $tableName = $rs->tableName;
894 else if (preg_match(
"/FROM\s+".ADODB_TABLE_REGEX.
"/is", $rs->sql, $tableName))
895 $tableName = $tableName[1];
902 $fields = substr($fields, 0, -2);
903 $values = substr($values, 0, -2);
906 return 'INSERT INTO '.$tableName.
' ( '.$fields.
' ) VALUES ( '.$values.
' )';
938 if (!empty($zthis->hasReturningInto)) {
939 if ($action ==
'I') {
940 $sql =
'empty_blob(), ';
942 $sql = $fnameq.
'=empty_blob(), ';
947 $zthis->_returningArray[$fname] =
':xx'.$fname.
'xx';
948 }
else if (empty($arrFields[$fname])){
949 if ($action ==
'I') {
950 $sql =
'empty_blob(), ';
952 $sql = $fnameq.
'=empty_blob(), ';
957 $sql =
_adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,
false);
967 if (!empty($zthis->hasReturningInto)) {
968 if ($action ==
'I') {
969 $sql =
':xx'.$fname.
'xx, ';
971 $sql = $fnameq.
'=:xx'.$fname.
'xx, ';
976 $zthis->_returningArray[$fname] =
':xx'.$fname.
'xx';
980 $sql =
_adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,
false);
985 $sql =
_adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,
false);
992 function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq, $recurse=
true)
996 switch($zthis->dataProvider) {
998 if ($type ==
'L') $type =
'C';
1010 $val = $zthis->qstr($arrFields[$fname],$magicq);
1014 $val = $zthis->DBDate($arrFields[$fname]);
1018 $val = $zthis->DBTimeStamp($arrFields[$fname]);
1022 $val = $arrFields[$fname];
1023 if (!is_numeric($val)) $val = str_replace(
',',
'.', (
float)$val);
1028 $val = $arrFields[$fname];
1029 if (!is_numeric($val)) $val = (integer) $val;
1033 $val = str_replace(array(
"'",
" ",
"("),
"",$arrFields[$fname]);
1034 if (empty($val)) $val =
'0';
1038 if ($action ==
'I')
return $val .
", ";
1041 return $fnameq .
"=" . $val .
", ";
1051 foreach($inputarr as $kk=>$vv) {
1052 if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).
'...';
1053 if (is_null($vv)) $ss .=
"($kk=>null) ";
1054 else $ss .=
"($kk=>'$vv') ";
1058 $sqlTxt = is_array($sql) ? $sql[0] : $sql;
1064 $inBrowser = isset($_SERVER[
'HTTP_USER_AGENT']);
1066 $dbt = $zthis->databaseType;
1067 if (isset($zthis->dsnType)) $dbt .=
'-'.$zthis->dsnType;
1070 $ss =
'<code>'.htmlspecialchars($ss).
'</code>';
1072 if ($zthis->debug === -1)
1073 ADOConnection::outp(
"<br>\n($dbt): ".htmlspecialchars($sqlTxt).
" $ss\n<br>\n",
false);
1074 else if ($zthis->debug !== -99)
1075 ADOConnection::outp(
"<hr>\n($dbt): ".htmlspecialchars($sqlTxt).
" $ss\n<hr>\n",
false);
1078 if ($zthis->debug !== -99)
1079 ADOConnection::outp(
"-----<hr>\n($dbt): ".$sqlTxt.
" $ss\n-----<hr>\n",
false);
1082 $qID = $zthis->_query($sql,$inputarr);
1088 if ($zthis->databaseType ==
'mssql') {
1091 if($emsg = $zthis->ErrorMsg()) {
1092 if ($err = $zthis->ErrorNo()) {
1093 if ($zthis->debug === -99)
1094 ADOConnection::outp(
"<hr>\n($dbt): ".htmlspecialchars($sqlTxt).
" $ss\n<hr>\n",
false);
1096 ADOConnection::outp($err.
': '.$emsg);
1101 if ($zthis->debug === -99)
1102 if ($inBrowser) ADOConnection::outp(
"<hr>\n($dbt): ".htmlspecialchars($sqlTxt).
" $ss\n<hr>\n",
false);
1103 else ADOConnection::outp(
"-----<hr>\n($dbt): ".$sqlTxt.
"$ss\n-----<hr>\n",
false);
1105 ADOConnection::outp($zthis->ErrorNo() .
': '. $zthis->ErrorMsg());
1112 # pretty print the debug_backtrace function
1115 if (!function_exists(
'debug_backtrace'))
return '';
1117 if ($ishtml === null) $html = (isset($_SERVER[
'HTTP_USER_AGENT']));
1118 else $html = $ishtml;
1120 $fmt = ($html) ?
"</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" :
"%% line %4d, file: %s";
1124 $s = ($html) ?
'<pre align=left>' :
'';
1126 if (is_array($printOrArr)) $traceArr = $printOrArr;
1127 else $traceArr = debug_backtrace();
1128 array_shift($traceArr);
1129 array_shift($traceArr);
1130 $tabs =
sizeof($traceArr)-2;
1132 foreach ($traceArr as $arr) {
1133 if ($skippy) {$skippy -= 1;
continue;}
1135 if ($levels < 0)
break;
1138 for ($i=0; $i < $tabs; $i++) $s .= ($html) ?
' ' :
"\t";
1140 if ($html) $s .=
'<font face="Courier New,Courier">';
1141 if (isset($arr[
'class'])) $s .= $arr[
'class'].
'.';
1142 if (isset($arr[
'args']))
1143 foreach($arr[
'args'] as $v) {
1144 if (is_null($v)) $args[] =
'null';
1145 else if (is_array($v)) $args[] =
'Array['.sizeof($v).
']';
1146 else if (is_object($v)) $args[] =
'Object:'.get_class($v);
1147 else if (is_bool($v)) $args[] = $v ?
'true' :
'false';
1150 $str = htmlspecialchars(str_replace(array(
"\r",
"\n"),
' ',substr($v,0,$MAXSTRLEN)));
1151 if (strlen($v) > $MAXSTRLEN) $str .=
'...';
1155 $s .= $arr[
'function'].
'('.implode(
', ',$args).
')';
1158 $s .= @sprintf($fmt, $arr[
'line'],$arr[
'file'],basename($arr[
'file']));
1162 if ($html) $s .=
'</pre>';
1163 if ($printOrArr) print $s;