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

📄 adodb.inc.php

📁 缺陷管理系统。Apache+PHP+MySQL 支持E-amil功能。是企业级开发中不可或缺的编程管理利器
💻 PHP
📖 第 1 页 / 共 5 页
字号:
		} else {

			//****************************

			// non-debug version of query

			//****************************

			

			$this->_queryID =@$this->_query($sql,$inputarr);

		}

		

		/************************

		// OK, query executed

		*************************/



		if ($this->_queryID === false) {

		// error handling if query fails

			if ($this->debug == 99) adodb_backtrace(true,5);	

			$fn = $this->raiseErrorFn;

			if ($fn) {

				$fn($this->databaseType,'EXECUTE',$this->ErrorNo(),$this->ErrorMsg(),$sql,$inputarr,$this);

			} 

				

			return false;

		} 

		

		

		if ($this->_queryID === true) {

		// return simplified empty recordset for inserts/updates/deletes with lower overhead

			$rs =& new ADORecordSet_empty();

			return $rs;

		}

		

		// return real recordset from select statement

		$rsclass = $this->rsPrefix.$this->databaseType;

		$rs =& new $rsclass($this->_queryID,$this->fetchMode);

		$rs->connection = &$this; // Pablo suggestion

		$rs->Init();

		if (is_array($sql)) $rs->sql = $sql[0];

		else $rs->sql = $sql;

		if ($rs->_numOfRows <= 0) {

		global $ADODB_COUNTRECS;

	

			if ($ADODB_COUNTRECS) {

				if (!$rs->EOF){ 

					$rs = &$this->_rs2rs($rs,-1,-1,!is_array($sql));

					$rs->_queryID = $this->_queryID;

				} else

					$rs->_numOfRows = 0;

			}

		}

		return $rs;

	}



	function CreateSequence($seqname='adodbseq',$startID=1)

	{

		if (empty($this->_genSeqSQL)) return false;

		return $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));

	}



	function DropSequence($seqname)

	{

		if (empty($this->_dropSeqSQL)) return false;

		return $this->Execute(sprintf($this->_dropSeqSQL,$seqname));

	}



	/**

	 * Generates a sequence id and stores it in $this->genID;

	 * GenID is only available if $this->hasGenID = true;

	 *

	 * @param seqname		name of sequence to use

	 * @param startID		if sequence does not exist, start at this ID

	 * @return		0 if not supported, otherwise a sequence id

	 */

	function GenID($seqname='adodbseq',$startID=1)

	{

		if (!$this->hasGenID) {

			return 0; // formerly returns false pre 1.60

		}

		

		$getnext = sprintf($this->_genIDSQL,$seqname);

		

		$holdtransOK = $this->_transOK;

		$rs = @$this->Execute($getnext);

		if (!$rs) {

			$this->_transOK = $holdtransOK; //if the status was ok before reset

			$createseq = $this->Execute(sprintf($this->_genSeqSQL,$seqname,$startID));

			$rs = $this->Execute($getnext);

		}

		if ($rs && !$rs->EOF) $this->genID = reset($rs->fields);

		else $this->genID = 0; // false

	

		if ($rs) $rs->Close();



		return $this->genID;

	}	



	/**

	 * @return  the last inserted ID. Not all databases support this.

	 */ 

	function Insert_ID()

	{

		if ($this->_logsql && $this->lastInsID) return $this->lastInsID;

		if ($this->hasInsertID) return $this->_insertid();

		if ($this->debug) {

			ADOConnection::outp( '<p>Insert_ID error</p>');

			adodb_backtrace();

		}

		return false;

	}





	/**

	 * Portable Insert ID. Pablo Roca <pabloroca@mvps.org>

	 *

	 * @return  the last inserted ID. All databases support this. But aware possible

	 * problems in multiuser environments. Heavy test this before deploying.

	 */ 

	function PO_Insert_ID($table="", $id="") 

	{

	   if ($this->hasInsertID){

		   return $this->Insert_ID();

	   } else {

		   return $this->GetOne("SELECT MAX($id) FROM $table");

	   }

	}



	/**

	* @return # rows affected by UPDATE/DELETE

	*/ 

	function Affected_Rows()

	{

		if ($this->hasAffectedRows) {

			if ($this->fnExecute === 'adodb_log_sql') {

				if ($this->_logsql && $this->_affected !== false) return $this->_affected;

			}

			$val = $this->_affectedrows();

			return ($val < 0) ? false : $val;

		}

				  

		if ($this->debug) ADOConnection::outp( '<p>Affected_Rows error</p>',false);

		return false;

	}

	

	

	/**

	 * @return  the last error message

	 */

	function ErrorMsg()

	{

		return '!! '.strtoupper($this->dataProvider.' '.$this->databaseType).': '.$this->_errorMsg;

	}

	

	

	/**

	 * @return the last error number. Normally 0 means no error.

	 */

	function ErrorNo() 

	{

		return ($this->_errorMsg) ? -1 : 0;

	}

	

	function MetaError($err=false)

	{

		include_once(ADODB_DIR."/adodb-error.inc.php");

		if ($err === false) $err = $this->ErrorNo();

		return adodb_error($this->dataProvider,$this->databaseType,$err);

	}

	

	function MetaErrorMsg($errno)

	{

		include_once(ADODB_DIR."/adodb-error.inc.php");

		return adodb_errormsg($errno);

	}

	

	/**

	 * @returns an array with the primary key columns in it.

	 */

	function MetaPrimaryKeys($table, $owner=false)

	{

	// owner not used in base class - see oci8

		$p = array();

		$objs =& $this->MetaColumns($table);

		if ($objs) {

			foreach($objs as $v) {

				if (!empty($v->primary_key))

					$p[] = $v->name;

			}

		}

		if (sizeof($p)) return $p;

		if (function_exists('ADODB_VIEW_PRIMARYKEYS'))

			return ADODB_VIEW_PRIMARYKEYS($this->databaseType, $this->database, $table, $owner);

		return false;

	}

	

	/**

	 * @returns assoc array where keys are tables, and values are foreign keys

	 */

	function MetaForeignKeys($table, $owner=false, $upper=false)

	{

		return false;

	}

	/**

	 * Choose a database to connect to. Many databases do not support this.

	 *

	 * @param dbName 	is the name of the database to select

	 * @return 		true or false

	 */

	function SelectDB($dbName) 

	{return false;}

	

	

	/**

	* Will select, getting rows from $offset (1-based), for $nrows. 

	* This simulates the MySQL "select * from table limit $offset,$nrows" , and

	* the PostgreSQL "select * from table limit $nrows offset $offset". Note that

	* MySQL and PostgreSQL parameter ordering is the opposite of the other.

	* eg. 

	*  SelectLimit('select * from table',3); will return rows 1 to 3 (1-based)

	*  SelectLimit('select * from table',3,2); will return rows 3 to 5 (1-based)

	*

	* Uses SELECT TOP for Microsoft databases (when $this->hasTop is set)

	* BUG: Currently SelectLimit fails with $sql with LIMIT or TOP clause already set

	*

	* @param sql

	* @param [offset]	is the row to start calculations from (1-based)

	* @param [nrows]		is the number of rows to get

	* @param [inputarr]	array of bind variables

	* @param [secs2cache]		is a private parameter only used by jlim

	* @return		the recordset ($rs->databaseType == 'array')

 	*/

	function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)

	{

		if ($this->hasTop && $nrows > 0) {

		// suggested by Reinhard Balling. Access requires top after distinct 

		 // Informix requires first before distinct - F Riosa

			$ismssql = (strpos($this->databaseType,'mssql') !== false);

			if ($ismssql) $isaccess = false;

			else $isaccess = (strpos($this->databaseType,'access') !== false);

			

			if ($offset <= 0) {

				

					// access includes ties in result

					if ($isaccess) {

						$sql = preg_replace(

						'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nrows.' ',$sql);



						if ($secs2cache>0) {

							$ret =& $this->CacheExecute($secs2cache, $sql,$inputarr);

						} else {

							$ret =& $this->Execute($sql,$inputarr);

						}

						return $ret; // PHP5 fix

					} else if ($ismssql){

						$sql = preg_replace(

						'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nrows.' ',$sql);

					} else {

						$sql = preg_replace(

						'/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nrows.' ',$sql);

					}

			} else {

				$nn = $nrows + $offset;

				if ($isaccess || $ismssql) {

					$sql = preg_replace(

					'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);

				} else {

					$sql = preg_replace(

					'/(^\s*select\s)/i','\\1 '.$this->hasTop.' '.$nn.' ',$sql);

				}

			}

		}

		

		// if $offset>0, we want to skip rows, and $ADODB_COUNTRECS is set, we buffer  rows

		// 0 to offset-1 which will be discarded anyway. So we disable $ADODB_COUNTRECS.

		global $ADODB_COUNTRECS;

		

		$savec = $ADODB_COUNTRECS;

		$ADODB_COUNTRECS = false;

			

		if ($offset>0){

			if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);

			else $rs = &$this->Execute($sql,$inputarr);

		} else {

			if ($secs2cache>0) $rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);

			else $rs = &$this->Execute($sql,$inputarr);

		}

		$ADODB_COUNTRECS = $savec;

		if ($rs && !$rs->EOF) {

			$rs =& $this->_rs2rs($rs,$nrows,$offset);

		}

		//print_r($rs);

		return $rs;

	}

	

	/**

	* Create serializable recordset. Breaks rs link to connection.

	*

	* @param rs			the recordset to serialize

	*/

	function &SerializableRS(&$rs)

	{

		$rs2 =& $this->_rs2rs($rs);

		$ignore = false;

		$rs2->connection =& $ignore;

		

		return $rs2;

	}

	

	/**

	* Convert database recordset to an array recordset

	* input recordset's cursor should be at beginning, and

	* old $rs will be closed.

	*

	* @param rs			the recordset to copy

	* @param [nrows]  	number of rows to retrieve (optional)

	* @param [offset] 	offset by number of rows (optional)

	* @return 			the new recordset

	*/

	function &_rs2rs(&$rs,$nrows=-1,$offset=-1,$close=true)

	{

		if (! $rs) return false;

		

		$dbtype = $rs->databaseType;

		if (!$dbtype) {

			$rs = &$rs;  // required to prevent crashing in 4.2.1, but does not happen in 4.3.1 -- why ?

			return $rs;

		}

		if (($dbtype == 'array' || $dbtype == 'csv') && $nrows == -1 && $offset == -1) {

			$rs->MoveFirst();

			$rs = &$rs; // required to prevent crashing in 4.2.1, but does not happen in 4.3.1-- why ?

			return $rs;

		}

		$flds = array();

		for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {

			$flds[] = $rs->FetchField($i);

		}

		$arr =& $rs->GetArrayLimit($nrows,$offset);

		//print_r($arr);

		if ($close) $rs->Close();

		

		$arrayClass = $this->arrayClass;

		

		$rs2 =& new $arrayClass();

		$rs2->connection = &$this;

		$rs2->sql = $rs->sql;

		$rs2->dataProvider = $this->dataProvider;

		$rs2->InitArrayFields($arr,$flds);

		return $rs2;

	}

	

	/*

	* Return all rows. Compat with PEAR DB

	*/

	function &GetAll($sql, $inputarr=false)

	{

		$arr =& $this->GetArray($sql,$inputarr);

		return $arr;

	}

	

	function &GetAssoc($sql, $inputarr=false,$force_array = false, $first2cols = false)

	{

		$rs =& $this->Execute($sql, $inputarr);

		if (!$rs) return false;

		

		$arr =& $rs->GetAssoc($force_array,$first2cols);

		return $arr;

	}

	

	function &CacheGetAssoc($secs2cache, $sql=false, $inputarr=false,$force_array = false, $first2cols = false)

	{

		if (!is_numeric($secs2cache)) {

			$first2cols = $force_array;

			$force_array = $inputarr;

		}

		$rs =& $this->CacheExecute($secs2cache, $sql, $inputarr);

		if (!$rs) return false;

		

		$arr =& $rs->GetAssoc($force_array,$first2cols);

		return $arr;

	}

	

	/**

	* Return first element of first row of sql statement. Recordset is disposed

	* for you.

	*

	* @param sql			SQL statement

	* @param [inputarr]		input bind array

	*/

	function GetOne($sql,$inputarr=false)

	{

	global $ADODB_COUNTRECS;

		$crecs = $ADODB_COUNTRECS;

		$ADODB_COUNTRECS = false;

		

		$ret = false;

		$rs = &$this->Execute($sql,$inputarr);

		if ($rs) {		

			if (!$rs->EOF) $ret = reset($rs->fields);

			$rs->Close();

		} 

		$ADODB_COUNTRECS = $crecs;

		return $ret;

	}

	

	function CacheGetOne($secs2cache,$sql=false,$inputarr=false)

	{

		$ret = false;

		$rs = &$this->CacheExecute($secs2cache,$sql,$inputarr);

		if ($rs) {		

			if (!$rs->EOF) $ret = reset($rs->fields);

			$rs->Close();

		} 

		

		return $ret;

	}

	

	function GetCol($sql, $inputarr = false, $trim = false)

	{

	  	$rv = false;

	  	$rs = &$this->Execute($sql, $inputarr);

	  	if ($rs) {

			$rv = array();

⌨️ 快捷键说明

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