adodb-lib.inc.php

来自「PhpWiki是sourceforge的一个开源项目」· PHP 代码 · 共 675 行 · 第 1/2 页

PHP
675
字号
<?phpglobal $ADODB_INCLUDED_LIB;$ADODB_INCLUDED_LIB = 1;/*  @version V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jlim\@natsoft.com.my). All rights reserved.  Released under both BSD license and Lesser GPL library license.   Whenever there is any discrepancy between the two licenses,   the BSD license will take precedence. See License.txt.   Set tabs to 4 for best viewing.    Less commonly used functions are placed here to reduce size of adodb.inc.php. */ // Force key to upper. // See also http://www.php.net/manual/en/function.array-change-key-case.phpfunction _array_change_key_case($an_array){	if (is_array($an_array)) {		foreach($an_array as $key=>$value)			$new_array[strtoupper($key)] = $value;	   	return $new_array;   }	return $an_array;}function _adodb_replace(&$zthis, $table, $fieldArray, $keyCol, $autoQuote, $has_autoinc){		if (count($fieldArray) == 0) return 0;		$first = true;		$uSet = '';				if (!is_array($keyCol)) {			$keyCol = array($keyCol);		}		foreach($fieldArray as $k => $v) {			if ($autoQuote && !is_numeric($v) and strncmp($v,"'",1) !== 0 and strcasecmp($v,'null')!=0) {				$v = $zthis->qstr($v);				$fieldArray[$k] = $v;			}			if (in_array($k,$keyCol)) continue; // skip UPDATE if is key						if ($first) {				$first = false;							$uSet = "$k=$v";			} else				$uSet .= ",$k=$v";		}		 		$where = false;		foreach ($keyCol as $v) {			if ($where) $where .= " and $v=$fieldArray[$v]";			else $where = "$v=$fieldArray[$v]";		}				if ($uSet && $where) {			$update = "UPDATE $table SET $uSet WHERE $where";						$rs = $zthis->Execute($update);			if ($rs) {				if ($zthis->poorAffectedRows) {				/*				 The Select count(*) wipes out any errors that the update would have returned. 				http://phplens.com/lens/lensforum/msgs.php?id=5696				*/					if ($zthis->ErrorNo()<>0) return 0;									# affected_rows == 0 if update field values identical to old values				# for mysql - which is silly. 								$cnt = $zthis->GetOne("select count(*) from $table where $where");					if ($cnt > 0) return 1; // record already exists				} else					 if (($zthis->Affected_Rows()>0)) return 1;			}		}	//	print "<p>Error=".$this->ErrorNo().'<p>';		$first = true;		foreach($fieldArray as $k => $v) {			if ($has_autoinc && in_array($k,$keyCol)) continue; // skip autoinc col						if ($first) {				$first = false;							$iCols = "$k";				$iVals = "$v";			} else {				$iCols .= ",$k";				$iVals .= ",$v";			}						}		$insert = "INSERT INTO $table ($iCols) VALUES ($iVals)"; 		$rs = $zthis->Execute($insert);		return ($rs) ? 2 : 0;}// Requires $ADODB_FETCH_MODE = ADODB_FETCH_NUMfunction _adodb_getmenu(&$zthis, $name,$defstr='',$blank1stItem=true,$multiple=false,			$size=0, $selectAttr='',$compareFields0=true){	$hasvalue = false;	if ($multiple or is_array($defstr)) {		if ($size==0) $size=5;		$attr = " multiple size=$size";		if (!strpos($name,'[]')) $name .= '[]';	} else if ($size) $attr = " size=$size";	else $attr ='';	$s = "<select name=\"$name\"$attr $selectAttr>";	if ($blank1stItem) 		if (is_string($blank1stItem))  {			$barr = explode(':',$blank1stItem);			if (sizeof($barr) == 1) $barr[] = '';			$s .= "\n<option value=\"".$barr[0]."\">".$barr[1]."</option>";		} else $s .= "\n<option></option>";	if ($zthis->FieldCount() > 1) $hasvalue=true;	else $compareFields0 = true;		$value = '';	while(!$zthis->EOF) {		$zval = rtrim(reset($zthis->fields));		if (sizeof($zthis->fields) > 1) {			if (isset($zthis->fields[1]))				$zval2 = rtrim($zthis->fields[1]);			else				$zval2 = rtrim(next($zthis->fields));		}		$selected = ($compareFields0) ? $zval : $zval2;				if ($blank1stItem && $zval=="") {			$zthis->MoveNext();			continue;		}		if ($hasvalue) 			$value = ' value="'.htmlspecialchars($zval2).'"';				if (is_array($defstr))  {						if (in_array($selected,$defstr)) 				$s .= "<option selected$value>".htmlspecialchars($zval).'</option>';			else 				$s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';		}		else {			if (strcasecmp($selected,$defstr)==0) 				$s .= "<option selected$value>".htmlspecialchars($zval).'</option>';			else				$s .= "\n<option".$value.'>'.htmlspecialchars($zval).'</option>';		}		$zthis->MoveNext();	} // while		return $s ."\n</select>\n";}/*	Count the number of records this sql statement will return by using	query rewriting techniques...		Does not work with UNIONs.*/function _adodb_getcount(&$zthis, $sql,$inputarr=false,$secs2cache=0) {	$qryRecs = 0;		 if (preg_match("/^\s*SELECT\s+DISTINCT/is", $sql) || preg_match('/\s+GROUP\s+BY\s+/is',$sql)) {		// ok, has SELECT DISTINCT or GROUP BY so see if we can use a table alias		// but this is only supported by oracle and postgresql...		if ($zthis->dataProvider == 'oci8') {						$rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);			$rewritesql = "SELECT COUNT(*) FROM ($rewritesql)"; 					} else if ( $zthis->databaseType == 'postgres' || $zthis->databaseType == 'postgres7')  {						$info = $zthis->ServerInfo();			if (substr($info['version'],0,3) >= 7.1) { // good till version 999				$rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql);				$rewritesql = "SELECT COUNT(*) FROM ($rewritesql) _ADODB_ALIAS_";			}		}	} else { 		// now replace SELECT ... FROM with SELECT COUNT(*) FROM				$rewritesql = preg_replace(					'/^\s*SELECT\s.*\s+FROM\s/Uis','SELECT COUNT(*) FROM ',$sql);				// fix by alexander zhukov, alex#unipack.ru, because count(*) and 'order by' fails 		// with mssql, access and postgresql. Also a good speedup optimization - skips sorting!		$rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$rewritesql); 	}		if (isset($rewritesql) && $rewritesql != $sql) {		if ($secs2cache) {			// we only use half the time of secs2cache because the count can quickly			// become inaccurate if new records are added			$qryRecs = $zthis->CacheGetOne($secs2cache/2,$rewritesql,$inputarr);					} else {			$qryRecs = $zthis->GetOne($rewritesql,$inputarr);	  	}		if ($qryRecs !== false) return $qryRecs;	}		//--------------------------------------------	// query rewrite failed - so try slower way...		// strip off unneeded ORDER BY	$rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql); 	$rstest = &$zthis->Execute($rewritesql,$inputarr);	if ($rstest) {	  		$qryRecs = $rstest->RecordCount();		if ($qryRecs == -1) { 		global $ADODB_EXTENSION;		// some databases will return -1 on MoveLast() - change to MoveNext()			if ($ADODB_EXTENSION) {				while(!$rstest->EOF) {					adodb_movenext($rstest);				}			} else {				while(!$rstest->EOF) {					$rstest->MoveNext();				}			}			$qryRecs = $rstest->_currentRow;		}		$rstest->Close();		if ($qryRecs == -1) return 0;	}		return $qryRecs;}/* 	Code originally from "Cornel G" <conyg@fx.ro>	This code will not work with SQL that has UNION in it			Also if you are using CachePageExecute(), there is a strong possibility that	data will get out of synch. use CachePageExecute() only with tables that	rarely change.*/function &_adodb_pageexecute_all_rows(&$zthis, $sql, $nrows, $page, 						$inputarr=false, $secs2cache=0) {	$atfirstpage = false;	$atlastpage = false;	$lastpageno=1;	// If an invalid nrows is supplied, 	// we assume a default value of 10 rows per page	if (!isset($nrows) || $nrows <= 0) $nrows = 10;	$qryRecs = false; //count records for no offset		$qryRecs = _adodb_getcount($zthis,$sql,$inputarr,$secs2cache);	$lastpageno = (int) ceil($qryRecs / $nrows);	$zthis->_maxRecordCount = $qryRecs;		// If page number <= 1, then we are at the first page	if (!isset($page) || $page <= 1) {			$page = 1;		$atfirstpage = true;	}	// ***** Here we check whether $page is the last page or 	// whether we are trying to retrieve 	// a page number greater than the last page number.	if ($page >= $lastpageno) {		$page = $lastpageno;		$atlastpage = true;	}		// We get the data we want	$offset = $nrows * ($page-1);	if ($secs2cache > 0) 		$rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);	else 		$rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);		// Before returning the RecordSet, we set the pagination properties we need	if ($rsreturn) {		$rsreturn->_maxRecordCount = $qryRecs;		$rsreturn->rowsPerPage = $nrows;		$rsreturn->AbsolutePage($page);		$rsreturn->AtFirstPage($atfirstpage);		$rsreturn->AtLastPage($atlastpage);		$rsreturn->LastPageNo($lastpageno);	}	return $rsreturn;}// Iv醤 Oliva versionfunction &_adodb_pageexecute_no_last_page(&$zthis, $sql, $nrows, $page, $inputarr=false, $secs2cache=0) {	$atfirstpage = false;	$atlastpage = false;		if (!isset($page) || $page <= 1) {	// If page number <= 1, then we are at the first page		$page = 1;		$atfirstpage = true;	}	if ($nrows <= 0) $nrows = 10;	// If an invalid nrows is supplied, we assume a default value of 10 rows per page		// ***** Here we check whether $page is the last page or whether we are trying to retrieve a page number greater than 	// the last page number.	$pagecounter = $page + 1;	$pagecounteroffset = ($pagecounter * $nrows) - $nrows;	if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);	else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);	if ($rstest) {		while ($rstest && $rstest->EOF && $pagecounter>0) {			$atlastpage = true;			$pagecounter--;			$pagecounteroffset = $nrows * ($pagecounter - 1);			$rstest->Close();			if ($secs2cache>0) $rstest = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $pagecounteroffset, $inputarr);			else $rstest = &$zthis->SelectLimit($sql, $nrows, $pagecounteroffset, $inputarr, $secs2cache);		}		if ($rstest) $rstest->Close();	}	if ($atlastpage) {	// If we are at the last page or beyond it, we are going to retrieve it		$page = $pagecounter;		if ($page == 1) $atfirstpage = true;	// We have to do this again in case the last page is the same as the first			//... page, that is, the recordset has only 1 page.	}		// We get the data we want	$offset = $nrows * ($page-1);	if ($secs2cache > 0) $rsreturn = &$zthis->CacheSelectLimit($secs2cache, $sql, $nrows, $offset, $inputarr);	else $rsreturn = &$zthis->SelectLimit($sql, $nrows, $offset, $inputarr, $secs2cache);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?