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

📄 adodb-ado.inc.php

📁 一个bug追踪工具的PHP编写的源代码
💻 PHP
字号:
<?php/*V4.54 5 Nov 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.Set tabs to 4 for best viewing.  Latest version is available at http://adodb.sourceforge.net	Microsoft ADO data driver. Requires ADO. Works only on MS Windows.*/// security - hide pathsif (!defined('ADODB_DIR')) die();define("_ADODB_ADO_LAYER", 1 );/*----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/class ADODB_ado extends ADOConnection {	var $databaseType = "ado";	var $_bindInputArray = false;	var $fmtDate = "'Y-m-d'";	var $fmtTimeStamp = "'Y-m-d, h:i:sA'";	var $replaceQuote = "''"; // string to use to replace quotes	var $dataProvider = "ado";	var $hasAffectedRows = true;	var $adoParameterType = 201; // 201 = long varchar, 203=long wide varchar, 205 = long varbinary	var $_affectedRows = false;	var $_thisTransactions;	var $_cursor_type = 3; // 3=adOpenStatic,0=adOpenForwardOnly,1=adOpenKeyset,2=adOpenDynamic	var $_cursor_location = 3; // 2=adUseServer, 3 = adUseClient;	var $_lock_type = -1;	var $_execute_option = -1;	var $poorAffectedRows = true;	var $charPage;	function ADODB_ado()	{		$this->_affectedRows = new VARIANT;	}	function ServerInfo()	{		if (!empty($this->_connectionID)) $desc = $this->_connectionID->provider;		return array('description' => $desc, 'version' => '');	}	function _affectedrows()	{		if (PHP_VERSION >= 5) return $this->_affectedRows;		return $this->_affectedRows->value;	}	// you can also pass a connection string like this:	//	// $DB->Connect('USER ID=sa;PASSWORD=pwd;SERVER=mangrove;DATABASE=ai',false,false,'SQLOLEDB');	function _connect($argHostname, $argUsername, $argPassword, $argProvider= 'MSDASQL')	{		$u = 'UID';		$p = 'PWD';		if (!empty($this->charPage))			$dbc = new COM('ADODB.Connection',null,$this->charPage);		else			$dbc = new COM('ADODB.Connection');		if (! $dbc) return false;		/* special support if provider is mssql or access */		if ($argProvider=='mssql') {			$u = 'User Id';  //User parameter name for OLEDB			$p = 'Password';			$argProvider = "SQLOLEDB"; // SQL Server Provider			// not yet			//if ($argDatabasename) $argHostname .= ";Initial Catalog=$argDatabasename";			//use trusted conection for SQL if username not specified			if (!$argUsername) $argHostname .= ";Trusted_Connection=Yes";		} else if ($argProvider=='access')			$argProvider = "Microsoft.Jet.OLEDB.4.0"; // Microsoft Jet Provider		if ($argProvider) $dbc->Provider = $argProvider;		if ($argUsername) $argHostname .= ";$u=$argUsername";		if ($argPassword)$argHostname .= ";$p=$argPassword";		if ($this->debug) ADOConnection::outp( "Host=".$argHostname."<BR>\n version=$dbc->version");		// @ added below for php 4.0.1 and earlier		@$dbc->Open((string) $argHostname);		$this->_connectionID = $dbc;		$dbc->CursorLocation = $this->_cursor_location;		return  $dbc->State > 0;	}	// returns true or false	function _pconnect($argHostname, $argUsername, $argPassword, $argProvider='MSDASQL')	{		return $this->_connect($argHostname,$argUsername,$argPassword,$argProvider);	}/*	adSchemaCatalogs	= 1,	adSchemaCharacterSets	= 2,	adSchemaCollations	= 3,	adSchemaColumns	= 4,	adSchemaCheckConstraints	= 5,	adSchemaConstraintColumnUsage	= 6,	adSchemaConstraintTableUsage	= 7,	adSchemaKeyColumnUsage	= 8,	adSchemaReferentialContraints	= 9,	adSchemaTableConstraints	= 10,	adSchemaColumnsDomainUsage	= 11,	adSchemaIndexes	= 12,	adSchemaColumnPrivileges	= 13,	adSchemaTablePrivileges	= 14,	adSchemaUsagePrivileges	= 15,	adSchemaProcedures	= 16,	adSchemaSchemata	= 17,	adSchemaSQLLanguages	= 18,	adSchemaStatistics	= 19,	adSchemaTables	= 20,	adSchemaTranslations	= 21,	adSchemaProviderTypes	= 22,	adSchemaViews	= 23,	adSchemaViewColumnUsage	= 24,	adSchemaViewTableUsage	= 25,	adSchemaProcedureParameters	= 26,	adSchemaForeignKeys	= 27,	adSchemaPrimaryKeys	= 28,	adSchemaProcedureColumns	= 29,	adSchemaDBInfoKeywords	= 30,	adSchemaDBInfoLiterals	= 31,	adSchemaCubes	= 32,	adSchemaDimensions	= 33,	adSchemaHierarchies	= 34,	adSchemaLevels	= 35,	adSchemaMeasures	= 36,	adSchemaProperties	= 37,	adSchemaMembers	= 38*/	function &MetaTables()	{		$arr= array();		$dbc = $this->_connectionID;		$adors=@$dbc->OpenSchema(20);//tables		if ($adors){			$f = $adors->Fields(2);//table/view name			$t = $adors->Fields(3);//table type			while (!$adors->EOF){				$tt=substr($t->value,0,6);				if ($tt!='SYSTEM' && $tt !='ACCESS')					$arr[]=$f->value;				//print $f->value . ' ' . $t->value.'<br>';				$adors->MoveNext();			}			$adors->Close();		}		return $arr;	}	function &MetaColumns($table)	{		$table = strtoupper($table);		$arr = array();		$dbc = $this->_connectionID;		$adors=@$dbc->OpenSchema(4);//tables		if ($adors){			$t = $adors->Fields(2);//table/view name			while (!$adors->EOF){				if (strtoupper($t->Value) == $table) {					$fld = new ADOFieldObject();					$c = $adors->Fields(3);					$fld->name = $c->Value;					$fld->type = 'CHAR'; // cannot discover type in ADO!					$fld->max_length = -1;					$arr[strtoupper($fld->name)]=$fld;				}				$adors->MoveNext();			}			$adors->Close();		}		$false = false;		return empty($arr) ? $false : $arr;	}	/* returns queryID or false */	function &_query($sql,$inputarr=false)	{		$dbc = $this->_connectionID;		$false = false;	//	return rs		if ($inputarr) {			if (!empty($this->charPage))				$oCmd = new COM('ADODB.Command',null,$this->charPage);			else				$oCmd = new COM('ADODB.Command');			$oCmd->ActiveConnection = $dbc;			$oCmd->CommandText = $sql;			$oCmd->CommandType = 1;			foreach($inputarr as $val) {				// name, type, direction 1 = input, len,				$this->adoParameterType = 130;				$p = $oCmd->CreateParameter('name',$this->adoParameterType,1,strlen($val),$val);				//print $p->Type.' '.$p->value;				$oCmd->Parameters->Append($p);			}			$p = false;			$rs = $oCmd->Execute();			$e = $dbc->Errors;			if ($dbc->Errors->Count > 0) return $false;			return $rs;		}		$rs = @$dbc->Execute($sql,$this->_affectedRows, $this->_execute_option);		if ($dbc->Errors->Count > 0) return $false;		if (! $rs) return $false;		if ($rs->State == 0) {			$true = true;			return $true; // 0 = adStateClosed means no records returned		}		return $rs;	}	function BeginTrans()	{		if ($this->transOff) return true;		if (isset($this->_thisTransactions))			if (!$this->_thisTransactions) return false;		else {			$o = $this->_connectionID->Properties("Transaction DDL");			$this->_thisTransactions = $o ? true : false;			if (!$o) return false;		}		@$this->_connectionID->BeginTrans();		$this->transCnt += 1;		return true;	}	function CommitTrans($ok=true)	{		if (!$ok) return $this->RollbackTrans();		if ($this->transOff) return true;		@$this->_connectionID->CommitTrans();		if ($this->transCnt) @$this->transCnt -= 1;		return true;	}	function RollbackTrans() {		if ($this->transOff) return true;		@$this->_connectionID->RollbackTrans();		if ($this->transCnt) @$this->transCnt -= 1;		return true;	}	/*	Returns: the last error message from previous database operation	*/	function ErrorMsg()	{		$errc = $this->_connectionID->Errors;		if ($errc->Count == 0) return '';		$err = $errc->Item($errc->Count-1);		return $err->Description;	}	function ErrorNo()	{		$errc = $this->_connectionID->Errors;		if ($errc->Count == 0) return 0;		$err = $errc->Item($errc->Count-1);		return $err->NativeError;	}	// returns true or false	function _close()	{		if ($this->_connectionID) $this->_connectionID->Close();		$this->_connectionID = false;		return true;	}}/*--------------------------------------------------------------------------------------	 Class Name: Recordset--------------------------------------------------------------------------------------*/class ADORecordSet_ado extends ADORecordSet {	var $bind = false;	var $databaseType = "ado";	var $dataProvider = "ado";	var $_tarr = false; // caches the types	var $_flds; // and field objects	var $canSeek = true;  	var $hideErrors = true;	function ADORecordSet_ado($id,$mode=false)	{		if ($mode === false) {			global $ADODB_FETCH_MODE;			$mode = $ADODB_FETCH_MODE;		}		$this->fetchMode = $mode;		return $this->ADORecordSet($id,$mode);	}	// returns the field object	function FetchField($fieldOffset = -1) {		$off=$fieldOffset+1; // offsets begin at 1		$o= new ADOFieldObject();		$rs = $this->_queryID;		$f = $rs->Fields($fieldOffset);		$o->name = $f->Name;		$t = $f->Type;		$o->type = $this->MetaType($t);		$o->max_length = $f->DefinedSize;		$o->ado_type = $t;		//print "off=$off name=$o->name type=$o->type len=$o->max_length<br>";		return $o;	}	/* Use associative array to get fields array */	function Fields($colname)	{		if ($this->fetchMode & ADODB_FETCH_ASSOC) return $this->fields[$colname];		if (!$this->bind) {			$this->bind = array();			for ($i=0; $i < $this->_numOfFields; $i++) {				$o = $this->FetchField($i);				$this->bind[strtoupper($o->name)] = $i;			}		}		 return $this->fields[$this->bind[strtoupper($colname)]];	}	function _initrs()	{		$rs = $this->_queryID;		$this->_numOfRows = $rs->RecordCount;		$f = $rs->Fields;		$this->_numOfFields = $f->Count;	}	 // should only be used to move forward as we normally use forward-only cursors	function _seek($row)	{	   $rs = $this->_queryID;		// absoluteposition doesn't work -- my maths is wrong ?		//	$rs->AbsolutePosition->$row-2;		//	return true;		if ($this->_currentRow > $row) return false;		@$rs->Move((integer)$row - $this->_currentRow-1); //adBookmarkFirst		return true;	}/*	OLEDB types	 enum DBTYPEENUM	{	DBTYPE_EMPTY	= 0,	DBTYPE_NULL	= 1,	DBTYPE_I2	= 2,	DBTYPE_I4	= 3,	DBTYPE_R4	= 4,	DBTYPE_R8	= 5,	DBTYPE_CY	= 6,	DBTYPE_DATE	= 7,	DBTYPE_BSTR	= 8,	DBTYPE_IDISPATCH	= 9,	DBTYPE_ERROR	= 10,	DBTYPE_BOOL	= 11,	DBTYPE_VARIANT	= 12,	DBTYPE_IUNKNOWN	= 13,	DBTYPE_DECIMAL	= 14,	DBTYPE_UI1	= 17,	DBTYPE_ARRAY	= 0x2000,	DBTYPE_BYREF	= 0x4000,	DBTYPE_I1	= 16,	DBTYPE_UI2	= 18,	DBTYPE_UI4	= 19,	DBTYPE_I8	= 20,	DBTYPE_UI8	= 21,	DBTYPE_GUID	= 72,	DBTYPE_VECTOR	= 0x1000,	DBTYPE_RESERVED	= 0x8000,	DBTYPE_BYTES	= 128,	DBTYPE_STR	= 129,	DBTYPE_WSTR	= 130,	DBTYPE_NUMERIC	= 131,	DBTYPE_UDT	= 132,	DBTYPE_DBDATE	= 133,	DBTYPE_DBTIME	= 134,	DBTYPE_DBTIMESTAMP	= 135	ADO Types   	adEmpty	= 0,	adTinyInt	= 16,	adSmallInt	= 2,	adInteger	= 3,	adBigInt	= 20,	adUnsignedTinyInt	= 17,	adUnsignedSmallInt	= 18,	adUnsignedInt	= 19,	adUnsignedBigInt	= 21,	adSingle	= 4,	adDouble	= 5,	adCurrency	= 6,	adDecimal	= 14,	adNumeric	= 131,	adBoolean	= 11,	adError	= 10,	adUserDefined	= 132,	adVariant	= 12,	adIDispatch	= 9,	adIUnknown	= 13,	adGUID	= 72,	adDate	= 7,	adDBDate	= 133,	adDBTime	= 134,	adDBTimeStamp	= 135,	adBSTR	= 8,	adChar	= 129,	adVarChar	= 200,	adLongVarChar	= 201,	adWChar	= 130,	adVarWChar	= 202,	adLongVarWChar	= 203,	adBinary	= 128,	adVarBinary	= 204,	adLongVarBinary	= 205,	adChapter	= 136,	adFileTime	= 64,	adDBFileTime	= 137,	adPropVariant	= 138,	adVarNumeric	= 139*/	function MetaType($t,$len=-1,$fieldobj=false)	{		if (is_object($t)) {			$fieldobj = $t;			$t = $fieldobj->type;			$len = $fieldobj->max_length;		}		if (!is_numeric($t)) return $t;		switch ($t) {		case 0:		case 12: // variant		case 8: // bstr		case 129: //char		case 130: //wc		case 200: // varc		case 202:// varWC		case 128: // bin		case 204: // varBin		case 72: // guid			if ($len <= $this->blobSize) return 'C';		case 201:		case 203:			return 'X';		case 128:		case 204:		case 205:			 return 'B';		case 7:		case 133: return 'D';		case 134:		case 135: return 'T';		case 11: return 'L';		case 16://	adTinyInt	= 16,		case 2://adSmallInt	= 2,		case 3://adInteger	= 3,		case 4://adBigInt	= 20,		case 17://adUnsignedTinyInt	= 17,		case 18://adUnsignedSmallInt	= 18,		case 19://adUnsignedInt	= 19,		case 20://adUnsignedBigInt	= 21,			return 'I';		default: return 'N';		}	}	// time stamp not supported yet	function _fetch()	{		$rs = $this->_queryID;		if (!$rs or $rs->EOF) {			$this->fields = false;			return false;		}		$this->fields = array();		if (!$this->_tarr) {			$tarr = array();			$flds = array();			for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {				$f = $rs->Fields($i);				$flds[] = $f;				$tarr[] = $f->Type;			}			// bind types and flds only once			$this->_tarr = $tarr;			$this->_flds = $flds;		}		$t = reset($this->_tarr);		$f = reset($this->_flds);		if ($this->hideErrors)  $olde = error_reporting(E_ERROR|E_CORE_ERROR);// sometimes $f->value be null		for ($i=0,$max = $this->_numOfFields; $i < $max; $i++) {			//echo "<p>",$t,' ';var_dump($f->value); echo '</p>';			switch($t) {			case 135: // timestamp				if (!strlen((string)$f->value)) $this->fields[] = false;				else {					if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);					else $val = $f->value;					$this->fields[] = adodb_date('Y-m-d H:i:s',$val);				}				break;			case 133:// A date value (yyyymmdd)				if ($val = $f->value) {					$this->fields[] = substr($val,0,4).'-'.substr($val,4,2).'-'.substr($val,6,2);				} else					$this->fields[] = false;				break;			case 7: // adDate				if (!strlen((string)$f->value)) $this->fields[] = false;				else {					if (!is_numeric($f->value)) $val = variant_date_to_timestamp($f->value);					else $val = $f->value;					if (($val % 86400) == 0) $this->fields[] = adodb_date('Y-m-d',$val);					else $this->fields[] = adodb_date('Y-m-d H:i:s',$val);				}				break;			case 1: // null				$this->fields[] = false;				break;			case 6: // currency is not supported properly;				ADOConnection::outp( '<b>'.$f->Name.': currency type not supported by PHP</b>');				$this->fields[] = (float) $f->value;				break;			default:				$this->fields[] = $f->value;				break;			}			//print " $f->value $t, ";			$f = next($this->_flds);			$t = next($this->_tarr);		} // for		if ($this->hideErrors) error_reporting($olde);		@$rs->MoveNext(); // @ needed for some versions of PHP!		if ($this->fetchMode & ADODB_FETCH_ASSOC) {			$this->fields = &$this->GetRowAssoc(ADODB_ASSOC_CASE);		}		return true;	}		function NextRecordSet()		{			$rs = $this->_queryID;			$this->_queryID = $rs->NextRecordSet();			//$this->_queryID = $this->_QueryId->NextRecordSet();			if ($this->_queryID == null) return false;			$this->_currentRow = -1;			$this->_currentPage = -1;			$this->bind = false;			$this->fields = false;			$this->_flds = false;			$this->_tarr = false;			$this->_inited = false;			$this->Init();			return true;		}	function _close() {		$this->_flds = false;		@$this->_queryID->Close();// by Pete Dishman (peterd@telephonetics.co.uk)		$this->_queryID = false;	}}?>

⌨️ 快捷键说明

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