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

📄 adodb-mssql.inc.php

📁 一个bug追踪工具的PHP编写的源代码
💻 PHP
📖 第 1 页 / 共 2 页
字号:
<?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  Native mssql driver. Requires mssql client. Works on Windows.  To configure for Unix, see   	http://phpbuilder.com/columns/alberto20000919.php3*/// security - hide pathsif (!defined('ADODB_DIR')) die();//----------------------------------------------------------------// MSSQL returns dates with the format Oct 13 2002 or 13 Oct 2002// and this causes tons of problems because localized versions of// MSSQL will return the dates in dmy or  mdy order; and also the// month strings depends on what language has been configured. The// following two variables allow you to control the localization// settings - Ugh.//// MORE LOCALIZATION INFO// ----------------------// To configure datetime, look for and modify sqlcommn.loc,//  	typically found in c:\mssql\install// Also read ://	 http://support.microsoft.com/default.aspx?scid=kb;EN-US;q220918// Alternatively use:// 	   CONVERT(char(12),datecol,120)//----------------------------------------------------------------// has datetime converstion to YYYY-MM-DD format, and also mssql_fetch_associf (ADODB_PHPVER >= 0x4300) {// docs say 4.2.0, but testing shows only since 4.3.0 does it work!	ini_set('mssql.datetimeconvert',0);} else {global $ADODB_mssql_mths;		// array, months must be upper-case	$ADODB_mssql_date_order = 'mdy';	$ADODB_mssql_mths = array(		'JAN'=>1,'FEB'=>2,'MAR'=>3,'APR'=>4,'MAY'=>5,'JUN'=>6,		'JUL'=>7,'AUG'=>8,'SEP'=>9,'OCT'=>10,'NOV'=>11,'DEC'=>12);}//---------------------------------------------------------------------------// Call this to autoset $ADODB_mssql_date_order at the beginning of your code,// just after you connect to the database. Supports mdy and dmy only.// Not required for PHP 4.2.0 and above.function AutoDetect_MSSQL_Date_Order($conn){global $ADODB_mssql_date_order;	$adate = $conn->GetOne('select getdate()');	if ($adate) {		$anum = (int) $adate;		if ($anum > 0) {			if ($anum > 31) {				//ADOConnection::outp( "MSSQL: YYYY-MM-DD date format not supported currently");			} else				$ADODB_mssql_date_order = 'dmy';		} else			$ADODB_mssql_date_order = 'mdy';	}}class ADODB_mssql extends ADOConnection {	var $databaseType = "mssql";	var $dataProvider = "mssql";	var $replaceQuote = "''"; // string to use to replace quotes	var $fmtDate = "'Y-m-d'";	var $fmtTimeStamp = "'Y-m-d h:i:sA'";	var $hasInsertID = true;	var $substr = "substring";	var $length = 'len';	var $hasAffectedRows = true;	var $metaDatabasesSQL = "select name from sysdatabases where name <> 'master'";	var $metaTablesSQL="select name,case when type='U' then 'T' else 'V' end from sysobjects where (type='U' or type='V') and (name not in ('sysallocations','syscolumns','syscomments','sysdepends','sysfilegroups','sysfiles','sysfiles1','sysforeignkeys','sysfulltextcatalogs','sysindexes','sysindexkeys','sysmembers','sysobjects','syspermissions','sysprotects','sysreferences','systypes','sysusers','sysalternates','sysconstraints','syssegments','REFERENTIAL_CONSTRAINTS','CHECK_CONSTRAINTS','CONSTRAINT_TABLE_USAGE','CONSTRAINT_COLUMN_USAGE','VIEWS','VIEW_TABLE_USAGE','VIEW_COLUMN_USAGE','SCHEMATA','TABLES','TABLE_CONSTRAINTS','TABLE_PRIVILEGES','COLUMNS','COLUMN_DOMAIN_USAGE','COLUMN_PRIVILEGES','DOMAINS','DOMAIN_CONSTRAINTS','KEY_COLUMN_USAGE','dtproperties'))";	var $metaColumnsSQL = # xtype==61 is datetime"select c.name,t.name,c.length,	(case when c.xusertype=61 then 0 else c.xprec end),	(case when c.xusertype=61 then 0 else c.xscale end)	from syscolumns c join systypes t on t.xusertype=c.xusertype join sysobjects o on o.id=c.id where o.name='%s'";	var $hasTop = 'top';		// support mssql SELECT TOP 10 * FROM TABLE	var $hasGenID = true;	var $sysDate = 'convert(datetime,convert(char,GetDate(),102),102)';	var $sysTimeStamp = 'GetDate()';	var $_has_mssql_init;	var $maxParameterLen = 4000;	var $arrayClass = 'ADORecordSet_array_mssql';	var $uniqueSort = true;	var $leftOuter = '*=';	var $rightOuter = '=*';	var $ansiOuter = true; // for mssql7 or later	var $poorAffectedRows = true;	var $identitySQL = 'select @@IDENTITY'; // 'select SCOPE_IDENTITY'; # for mssql 2000	var $uniqueOrderBy = true;	var $_bindInputArray = true;	function ADODB_mssql()	{		$this->_has_mssql_init = (strnatcmp(PHP_VERSION,'4.1.0')>=0);	}	function ServerInfo()	{	global $ADODB_FETCH_MODE;		$stmt = $this->PrepareSP('sp_server_info');		$val = 2;		if ($this->fetchMode === false) {			$savem = $ADODB_FETCH_MODE;			$ADODB_FETCH_MODE = ADODB_FETCH_NUM;		} else			$savem = $this->SetFetchMode(ADODB_FETCH_NUM);		$this->Parameter($stmt,$val,'attribute_id');		$row = $this->GetRow($stmt);		//$row = $this->GetRow("execute sp_server_info 2");		if ($this->fetchMode === false) {			$ADODB_FETCH_MODE = $savem;		} else			$this->SetFetchMode($savem);		$arr['description'] = $row[2];		$arr['version'] = ADOConnection::_findvers($arr['description']);		return $arr;	}	function IfNull( $field, $ifNull )	{		return " ISNULL($field, $ifNull) "; // if MS SQL Server	}	function _insertid()	{	// SCOPE_IDENTITY()	// Returns the last IDENTITY value inserted into an IDENTITY column in	// the same scope. A scope is a module -- a stored procedure, trigger,	// function, or batch. Thus, two statements are in the same scope if	// they are in the same stored procedure, function, or batch.			return $this->GetOne($this->identitySQL);	}	function _affectedrows()	{		return $this->GetOne('select @@rowcount');	}	var $_dropSeqSQL = "drop table %s";	function CreateSequence($seq='adodbseq',$start=1)	{		$start -= 1;		$this->Execute("create table $seq (id float(53))");		$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");		if (!$ok) {				$this->Execute('ROLLBACK TRANSACTION adodbseq');				return false;		}		$this->Execute('COMMIT TRANSACTION adodbseq');		return true;	}	function GenID($seq='adodbseq',$start=1)	{		//$this->debug=1;		$this->Execute('BEGIN TRANSACTION adodbseq');		$ok = $this->Execute("update $seq with (tablock,holdlock) set id = id + 1");		if (!$ok) {			$this->Execute("create table $seq (id float(53))");			$ok = $this->Execute("insert into $seq with (tablock,holdlock) values($start)");			if (!$ok) {				$this->Execute('ROLLBACK TRANSACTION adodbseq');				return false;			}			$this->Execute('COMMIT TRANSACTION adodbseq');			return $start;		}		$num = $this->GetOne("select id from $seq");		$this->Execute('COMMIT TRANSACTION adodbseq');		return $num;		// in old implementation, pre 1.90, we returned GUID...		//return $this->GetOne("SELECT CONVERT(varchar(255), NEWID()) AS 'Char'");	}	function &SelectLimit($sql,$nrows=-1,$offset=-1, $inputarr=false,$secs2cache=0)	{		if ($nrows > 0 && $offset <= 0) {			$sql = preg_replace(				'/(^\s*select\s+(distinctrow|distinct)?)/i','\\1 '.$this->hasTop." $nrows ",$sql);			$rs =& $this->Execute($sql,$inputarr);		} else			$rs =& ADOConnection::SelectLimit($sql,$nrows,$offset,$inputarr,$secs2cache);		return $rs;	}	// Format date column in sql string given an input format that understands Y M D	function SQLDate($fmt, $col=false)	{		if (!$col) $col = $this->sysTimeStamp;		$s = '';		$len = strlen($fmt);		for ($i=0; $i < $len; $i++) {			if ($s) $s .= '+';			$ch = $fmt[$i];			switch($ch) {			case 'Y':			case 'y':				$s .= "datename(yyyy,$col)";				break;			case 'M':				$s .= "convert(char(3),$col,0)";				break;			case 'm':				$s .= "replace(str(month($col),2),' ','0')";				break;			case 'Q':			case 'q':				$s .= "datename(quarter,$col)";				break;			case 'D':			case 'd':				$s .= "replace(str(day($col),2),' ','0')";				break;			case 'h':				$s .= "substring(convert(char(14),$col,0),13,2)";				break;			case 'H':				$s .= "replace(str(datepart(hh,$col),2),' ','0')";				break;			case 'i':				$s .= "replace(str(datepart(mi,$col),2),' ','0')";				break;			case 's':				$s .= "replace(str(datepart(ss,$col),2),' ','0')";				break;			case 'a':			case 'A':				$s .= "substring(convert(char(19),$col,0),18,2)";				break;			default:				if ($ch == '\\') {					$i++;					$ch = substr($fmt,$i,1);				}				$s .= $this->qstr($ch);				break;			}		}		return $s;	}	function BeginTrans()	{		if ($this->transOff) return true;		$this->transCnt += 1;	   	$this->Execute('BEGIN TRAN');	   	return true;	}	function CommitTrans($ok=true)	{		if ($this->transOff) return true;		if (!$ok) return $this->RollbackTrans();		if ($this->transCnt) $this->transCnt -= 1;		$this->Execute('COMMIT TRAN');		return true;	}	function RollbackTrans()	{		if ($this->transOff) return true;		if ($this->transCnt) $this->transCnt -= 1;		$this->Execute('ROLLBACK TRAN');		return true;	}	/*		Usage:		$this->BeginTrans();		$this->RowLock('table1,table2','table1.id=33 and table2.id=table1.id'); # lock row 33 for both tables		# some operation on both tables table1 and table2		$this->CommitTrans();		See http://www.swynk.com/friends/achigrik/SQL70Locks.asp	*/	function RowLock($tables,$where)	{		if (!$this->transCnt) $this->BeginTrans();		return $this->GetOne("select top 1 null as ignore from $tables with (ROWLOCK,HOLDLOCK) where $where");	}	function &MetaIndexes($table,$primary=false)	{		$table = $this->qstr($table);		$sql = "SELECT i.name AS ind_name, C.name AS col_name, USER_NAME(O.uid) AS Owner, c.colid, k.Keyno,			CASE WHEN I.indid BETWEEN 1 AND 254 AND (I.status & 2048 = 2048 OR I.Status = 16402 AND O.XType = 'V') THEN 1 ELSE 0 END AS IsPK,			CASE WHEN I.status & 2 = 2 THEN 1 ELSE 0 END AS IsUnique			FROM dbo.sysobjects o INNER JOIN dbo.sysindexes I ON o.id = i.id			INNER JOIN dbo.sysindexkeys K ON I.id = K.id AND I.Indid = K.Indid			INNER JOIN dbo.syscolumns c ON K.id = C.id AND K.colid = C.Colid			WHERE LEFT(i.name, 8) <> '_WA_Sys_' AND o.status >= 0 AND O.Name LIKE $table			ORDER BY O.name, I.Name, K.keyno";		global $ADODB_FETCH_MODE;		$save = $ADODB_FETCH_MODE;        $ADODB_FETCH_MODE = ADODB_FETCH_NUM;        if ($this->fetchMode !== FALSE) {        	$savem = $this->SetFetchMode(FALSE);        }        $rs = $this->Execute($sql);        if (isset($savem)) {        	$this->SetFetchMode($savem);        }        $ADODB_FETCH_MODE = $save;        if (!is_object($rs)) {        	return FALSE;        }		$indexes = array();		while ($row = $rs->FetchRow()) {			if (!$primary && $row[5]) continue;            $indexes[$row[0]]['unique'] = $row[6];            $indexes[$row[0]]['columns'][] = $row[1];    	}        return $indexes;	}	function MetaForeignKeys($table, $owner=false, $upper=false)	{	global $ADODB_FETCH_MODE;		$save = $ADODB_FETCH_MODE;		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;		$table = $this->qstr(strtoupper($table));		$sql ="select object_name(constid) as constraint_name,	col_name(fkeyid, fkey) as column_name,	object_name(rkeyid) as referenced_table_name,   	col_name(rkeyid, rkey) as referenced_column_namefrom sysforeignkeyswhere upper(object_name(fkeyid)) = $tableorder by constraint_name, referenced_table_name, keyno";		$constraints =& $this->GetArray($sql);		$ADODB_FETCH_MODE = $save;		$arr = false;		foreach($constraints as $constr) {			//print_r($constr);			$arr[$constr[0]][$constr[2]][] = $constr[1].'='.$constr[3];		}		if (!$arr) return false;		$arr2 = false;		foreach($arr as $k => $v) {			foreach($v as $a => $b) {				if ($upper) $a = strtoupper($a);				$arr2[$a] = $b;			}		}		return $arr2;	}	//From: Fernando Moreira <FMoreira@imediata.pt>	function MetaDatabases()	{		if(@mssql_select_db("master")) {				 $qry=$this->metaDatabasesSQL;				 if($rs=@mssql_query($qry)){						 $tmpAr=$ar=array();						 while($tmpAr=@mssql_fetch_row($rs))								 $ar[]=$tmpAr[0];						@mssql_select_db($this->databaseName);						 if(sizeof($ar))								 return($ar);						 else								 return(false);				 } else {						 @mssql_select_db($this->databaseName);						 return(false);				 }		 }		 return(false);	}	// "Stein-Aksel Basma" <basma@accelero.no>	// tested with MSSQL 2000	function &MetaPrimaryKeys($table)	{	global $ADODB_FETCH_MODE;		$schema = '';		$this->_findschema($table,$schema);		if (!$schema) $schema = $this->database;		if ($schema) $schema = "and k.table_catalog like '$schema%'";		$sql = "select distinct k.column_name,ordinal_position from information_schema.key_column_usage k,		information_schema.table_constraints tc		where tc.constraint_name = k.constraint_name and tc.constraint_type =		'PRIMARY KEY' and k.table_name = '$table' $schema order by ordinal_position ";		$savem = $ADODB_FETCH_MODE;		$ADODB_FETCH_MODE = ADODB_FETCH_NUM;		$a = $this->GetCol($sql);		$ADODB_FETCH_MODE = $savem;		if ($a && sizeof($a)>0) return $a;		return false;	}	function &MetaTables($ttype=false,$showSchema=false,$mask=false)	{		if ($mask) {			$save = $this->metaTablesSQL;			$mask = $this->qstr(($mask));			$this->metaTablesSQL .= " AND name like $mask";		}		$ret =& ADOConnection::MetaTables($ttype,$showSchema);		if ($mask) {			$this->metaTablesSQL = $save;		}		return $ret;	}	function SelectDB($dbName)	{		$this->databaseName = $dbName;		if ($this->_connectionID) {			return @mssql_select_db($dbName);		}		else return false;	}	function ErrorMsg()	{		if (empty($this->_errorMsg)){			$this->_errorMsg = mssql_get_last_message();		}		return $this->_errorMsg;	}	function ErrorNo()	{		if ($this->_logsql && $this->_errorCode !== false) return $this->_errorCode;		if (empty($this->_errorMsg)) {			$this->_errorMsg = mssql_get_last_message();		}		$id = @mssql_query("select @@ERROR",$this->_connectionID);		if (!$id) return false;		$arr = mssql_fetch_array($id);		@mssql_free_result($id);		if (is_array($arr)) return $arr[0];	   else return -1;	}	// returns true or false	function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)	{		if (!function_exists('mssql_pconnect')) return null;		$this->_connectionID = mssql_connect($argHostname,$argUsername,$argPassword);		if ($this->_connectionID === false) return false;		if ($argDatabasename) return $this->SelectDB($argDatabasename);		return true;	}

⌨️ 快捷键说明

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