⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adodb-lib.inc.php

📁 asterisk 計費模塊
💻 PHP
📖 第 1 页 / 共 3 页
字号:
				$rewritesql = "SELECT ".$hint[0]." COUNT(*) FROM (".$rewritesql.")"; 			} else				$rewritesql = "SELECT COUNT(*) FROM (".$rewritesql.")"; 					} else if (strncmp($zthis->databaseType,'postgres',8) == 0)  {			$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!		// also see http://phplens.com/lens/lensforum/msgs.php?id=12752		if (preg_match('/\sORDER\s+BY\s*\(/i',$rewritesql))			$rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$rewritesql);		else			$rewritesql = preg_replace('/(\sORDER\s+BY\s[^)]*)/is','',$rewritesql);	}				if (isset($rewritesql) && $rewritesql != $sql) {		if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[1];		 		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 if no UNION	if (preg_match('/\s*UNION\s*/is', $sql)) $rewritesql = $sql;	else $rewritesql = preg_replace('/(\sORDER\s+BY\s.*)/is','',$sql); 		if (preg_match('/\sLIMIT\s+[0-9]+/i',$sql,$limitarr)) $rewritesql .= $limitarr[0];			$rstest = &$zthis->Execute($rewritesql,$inputarr);	if (!$rstest) $rstest = $zthis->Execute($sql,$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 might 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;		// ***** 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;	}		// If page number <= 1, then we are at the first page	if (empty($page) || $page <= 1) {			$page = 1;		$atfirstpage = 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);		// Before returning the RecordSet, we set the pagination properties we need	if ($rsreturn) {		$rsreturn->rowsPerPage = $nrows;		$rsreturn->AbsolutePage($page);		$rsreturn->AtFirstPage($atfirstpage);		$rsreturn->AtLastPage($atlastpage);	}	return $rsreturn;}function _adodb_getupdatesql(&$zthis,&$rs, $arrFields,$forceUpdate=false,$magicq=false,$force=2){	global $ADODB_QUOTE_FIELDNAMES;		if (!$rs) {			printf(ADODB_BAD_RS,'GetUpdateSQL');			return false;		}			$fieldUpdatedCount = 0;		$arrFields = _array_change_key_case($arrFields);		$hasnumeric = isset($rs->fields[0]);		$setFields = '';				// Loop through all of the fields in the recordset		for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {			// Get the field from the recordset			$field = $rs->FetchField($i);			// If the recordset field is one			// of the fields passed in then process.			$upperfname = strtoupper($field->name);			if (adodb_key_exists($upperfname,$arrFields,$force)) {								// If the existing field value in the recordset				// is different from the value passed in then				// go ahead and append the field name and new value to				// the update query.								if ($hasnumeric) $val = $rs->fields[$i];				else if (isset($rs->fields[$upperfname])) $val = $rs->fields[$upperfname];				else if (isset($rs->fields[$field->name])) $val =  $rs->fields[$field->name];				else if (isset($rs->fields[strtolower($upperfname)])) $val =  $rs->fields[strtolower($upperfname)];				else $val = '';											if ($forceUpdate || strcmp($val, $arrFields[$upperfname])) {					// Set the counter for the number of fields that will be updated.					$fieldUpdatedCount++;					// Based on the datatype of the field					// Format the value properly for the database					$type = $rs->MetaType($field->type);											if ($type == 'null') {						$type = 'C';					}										if ((strpos($upperfname,' ') !== false) || ($ADODB_QUOTE_FIELDNAMES))						$fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;					else						$fnameq = $upperfname;										                // is_null requires php 4.0.4                //********************************************************//                if (is_null($arrFields[$upperfname])					|| (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)                    || $arrFields[$upperfname] === $zthis->null2null                    )                {                    switch ($force) {                        //case 0:                        //    //Ignore empty values. This is allready handled in "adodb_key_exists" function.                        //break;                        case 1:                            //Set null                            $setFields .= $field->name . " = null, ";                        break;							                        case 2:                            //Set empty                            $arrFields[$upperfname] = "";                            $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq);                        break;						default:                        case 3:                            //Set the value that was given in array, so you can give both null and empty values                            if (is_null($arrFields[$upperfname]) || $arrFields[$upperfname] === $zthis->null2null) {                                $setFields .= $field->name . " = null, ";                            } else {                                $setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,$arrFields, $magicq);                            }                        break;                    }                //********************************************************//                } else {						//we do this so each driver can customize the sql for						//DB specific column types. 						//Oracle needs BLOB types to be handled with a returning clause						//postgres has special needs as well						$setFields .= _adodb_column_sql($zthis, 'U', $type, $upperfname, $fnameq,														  $arrFields, $magicq);					}				}			}		}		// If there were any modified fields then build the rest of the update query.		if ($fieldUpdatedCount > 0 || $forceUpdate) {					// Get the table name from the existing query.			if (!empty($rs->tableName)) $tableName = $rs->tableName;			else {				preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName);				$tableName = $tableName[1];			}			// Get the full where clause excluding the word "WHERE" from			// the existing query.			preg_match('/\sWHERE\s(.*)/is', $rs->sql, $whereClause);						$discard = false;			// not a good hack, improvements?			if ($whereClause) {			#var_dump($whereClause);				if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard));				else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard));				else if (preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard));				else preg_match('/\s.*(\) WHERE .*)/is', $whereClause[1], $discard); # see http://sourceforge.net/tracker/index.php?func=detail&aid=1379638&group_id=42718&atid=433976			} else				$whereClause = array(false,false);							if ($discard)				$whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1]));						$sql = 'UPDATE '.$tableName.' SET '.substr($setFields, 0, -2);			if (strlen($whereClause[1]) > 0) 				$sql .= ' WHERE '.$whereClause[1];			return $sql;		} else {			return false;	}}function adodb_key_exists($key, &$arr,$force=2){	if ($force<=0) {		// the following is the old behaviour where null or empty fields are ignored		return (!empty($arr[$key])) || (isset($arr[$key]) && strlen($arr[$key])>0);	}	if (isset($arr[$key])) return true;	## null check below	if (ADODB_PHPVER >= 0x4010) return array_key_exists($key,$arr);	return false;}/** * There is a special case of this function for the oci8 driver. * The proper way to handle an insert w/ a blob in oracle requires * a returning clause with bind variables and a descriptor blob. *  *  */function _adodb_getinsertsql(&$zthis,&$rs,$arrFields,$magicq=false,$force=2){static $cacheRS = false;static $cacheSig = 0;static $cacheCols;	global $ADODB_QUOTE_FIELDNAMES;	$tableName = '';	$values = '';	$fields = '';	$recordSet = null;	$arrFields = _array_change_key_case($arrFields);	$fieldInsertedCount = 0;		if (is_string($rs)) {		//ok we have a table name		//try and get the column info ourself.		$tableName = $rs;						//we need an object for the recordSet		//because we have to call MetaType.		//php can't do a $rsclass::MetaType()		$rsclass = $zthis->rsPrefix.$zthis->databaseType;		$recordSet = new $rsclass(-1,$zthis->fetchMode);		$recordSet->connection = &$zthis;				if (is_string($cacheRS) && $cacheRS == $rs) {			$columns =& $cacheCols;		} else {			$columns = $zthis->MetaColumns( $tableName );			$cacheRS = $tableName;			$cacheCols = $columns;		}

⌨️ 快捷键说明

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