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

📄 adodb-lib.inc.php

📁 股票监视器是一个简单的实用工具
💻 PHP
📖 第 1 页 / 共 2 页
字号:
                            } 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.			preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName);				// 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) {				if (preg_match('/\s(ORDER\s.*)/is', $whereClause[1], $discard));				else if (preg_match('/\s(LIMIT\s.*)/is', $whereClause[1], $discard));				else preg_match('/\s(FOR UPDATE.*)/is', $whereClause[1], $discard);			} else				$whereClause = array(false,false);							if ($discard)				$whereClause[1] = substr($whereClause[1], 0, strlen($whereClause[1]) - strlen($discard[1]));					$sql = 'UPDATE '.$tableName[1].' 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;	$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;		}	} else if (is_subclass_of($rs, 'adorecordset')) {		if (isset($rs->insertSig) && is_integer($cacheRS) && $cacheRS == $rs->insertSig) {			$columns =& $cacheCols;		} else {			for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) 				$columns[] = $rs->FetchField($i);			$cacheRS = $cacheSig;			$cacheCols = $columns;			$rs->insertSig = $cacheSig++;		}		$recordSet =& $rs;		} else {		printf(ADODB_BAD_RS,'GetInsertSQL');		return false;	}	// Loop through all of the fields in the recordset	foreach( $columns as $field ) { 		$upperfname = strtoupper($field->name);		if (adodb_key_exists($upperfname,$arrFields,$force)) {			$bad = false;			if (strpos($upperfname,' ') !== false)				$fnameq = $zthis->nameQuote.$upperfname.$zthis->nameQuote;			else				$fnameq = $upperfname;						$type = $recordSet->MetaType($field->type);			            /********************************************************/            if (is_null($arrFields[$upperfname])                || (empty($arrFields[$upperfname]) && strlen($arrFields[$upperfname]) == 0)                || $arrFields[$upperfname] === 'null'				)               {                    switch ($force) {                        case 0: // we must always set null if missing							$bad = true;							break;							                        case 1:                            $values  .= "null, ";                        break;		                        case 2:                            //Set empty                            $arrFields[$upperfname] = "";                            $values .= _adodb_column_sql($zthis, 'I', $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] === 'null') { 								$values  .= "null, ";							} else {                        		$values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq, $arrFields, $magicq);             				}              			break;             		} // switch            /*********************************************************/			} 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				$values .= _adodb_column_sql($zthis, 'I', $type, $upperfname, $fnameq,											   $arrFields, $magicq);			}						if ($bad) continue;			// Set the counter for the number of fields that will be inserted.			$fieldInsertedCount++;									// Get the name of the fields to insert			$fields .= $fnameq . ", ";		}	}	// If there were any inserted fields then build the rest of the insert query.	if ($fieldInsertedCount <= 0)  return false;		// Get the table name from the existing query.	if (!$tableName) {		if (preg_match("/FROM\s+".ADODB_TABLE_REGEX."/is", $rs->sql, $tableName))			$tableName = $tableName[1];		else 			return false;	}			// Strip off the comma and space on the end of both the fields	// and their values.	$fields = substr($fields, 0, -2);	$values = substr($values, 0, -2);	// Append the fields and their values to the insert query.	return 'INSERT INTO '.$tableName.' ( '.$fields.' ) VALUES ( '.$values.' )';}/** * This private method is used to help construct * the update/sql which is generated by GetInsertSQL and GetUpdateSQL. * It handles the string construction of 1 column -> sql string based on * the column type.  We want to do 'safe' handling of BLOBs *  * @param string the type of sql we are trying to create *                'I' or 'U'.  * @param string column data type from the db::MetaType() method   * @param string the column name * @param array the column value *  * @return string *  */function _adodb_column_sql_oci8(&$zthis,$action, $type, $fname, $fnameq, $arrFields, $magicq) {    $sql = '';        // Based on the datatype of the field    // Format the value properly for the database    switch($type) {    case 'B':        //in order to handle Blobs correctly, we need        //to do some magic for Oracle        //we need to create a new descriptor to handle         //this properly        if (!empty($zthis->hasReturningInto)) {            if ($action == 'I') {                $sql = 'empty_blob(), ';            } else {                $sql = $fnameq. '=empty_blob(), ';            }            //add the variable to the returning clause array            //so the user can build this later in            //case they want to add more to it            $zthis->_returningArray[$fname] = ':xx'.$fname.'xx';        } else if (empty($arrFields[$fname])){            if ($action == 'I') {                $sql = 'empty_blob(), ';            } else {                $sql = $fnameq. '=empty_blob(), ';            }                    } else {            //this is to maintain compatibility            //with older adodb versions.            $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);        }        break;    case "X":        //we need to do some more magic here for long variables        //to handle these correctly in oracle.        //create a safe bind var name        //to avoid conflicts w/ dupes.       if (!empty($zthis->hasReturningInto)) {            if ($action == 'I') {                $sql = ':xx'.$fname.'xx, ';                            } else {                $sql = $fnameq.'=:xx'.$fname.'xx, ';            }            //add the variable to the returning clause array            //so the user can build this later in            //case they want to add more to it            $zthis->_returningArray[$fname] = ':xx'.$fname.'xx';        } else {            //this is to maintain compatibility            //with older adodb versions.            $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq,false);        }                    break;            default:        $sql = _adodb_column_sql($zthis, $action, $type, $fname, $fnameq,  $arrFields, $magicq,false);        break;    }        return $sql;}    	function _adodb_column_sql(&$zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq, $recurse=true) {	if ($recurse) {		switch($zthis->dataProvider)  {		case 'postgres':			if ($type == 'L') $type = 'C';			break;		case 'oci8':			return _adodb_column_sql_oci8($zthis, $action, $type, $fname, $fnameq, $arrFields, $magicq);					}	}		$sql = '';			switch($type) {		case "C":		case "X":		case 'B':			if ($action == 'I') {				$sql = $zthis->qstr($arrFields[$fname],$magicq) . ", ";			} else {				$sql .= $fnameq . "=" . $zthis->qstr($arrFields[$fname],$magicq) . ", ";			}		  break;		case "D":			if ($action == 'I') {				$sql = $zthis->DBDate($arrFields[$fname]) . ", ";			} else {				$sql .= $fnameq . "=" . $zthis->DBDate($arrFields[$fname]) . ", ";			}			break;		case "T":			if ($action == 'I') {				$sql = $zthis->DBTimeStamp($arrFields[$fname]) . ", ";			} else {				$sql .= $fnameq . "=" . $zthis->DBTimeStamp($arrFields[$fname]) . ", ";			}			break;		default:			$val = $arrFields[$fname];			if (empty($val)) $val = '0';			if ($action == 'I') {				$sql .= $val . ", ";			} else {				$sql .= $fnameq . "=" . $val  . ", ";			}			break;	}	return $sql;}function _adodb_debug_execute(&$zthis, $sql, $inputarr){global $HTTP_SERVER_VARS;	$ss = '';	if ($inputarr) {		foreach($inputarr as $kk=>$vv) {			if (is_string($vv) && strlen($vv)>64) $vv = substr($vv,0,64).'...';			$ss .= "($kk=>'$vv') ";		}		$ss = "[ $ss ]";	}	$sqlTxt = str_replace(',',', ',is_array($sql) ? $sql[0] : $sql);	// check if running from browser or command-line	$inBrowser = isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']);		if ($inBrowser) {		$ss = htmlspecialchars($ss);		if ($zthis->debug === -1)			ADOConnection::outp( "<br>\n($zthis->databaseType): ".htmlspecialchars($sqlTxt)." &nbsp; <code>$ss</code>\n<br>\n",false);		else 			ADOConnection::outp( "<hr>\n($zthis->databaseType): ".htmlspecialchars($sqlTxt)." &nbsp; <code>$ss</code>\n<hr>\n",false);	} else {		ADOConnection::outp("-----\n($zthis->databaseType): ".$sqlTxt."\n-----\n",false);	}		$qID = $zthis->_query($sql,$inputarr);		/* 		Alexios Fakios notes that ErrorMsg() must be called before ErrorNo() for mssql		because ErrorNo() calls Execute('SELECT @ERROR'), causing recursion	*/	if ($zthis->databaseType == 'mssql') { 	// ErrorNo is a slow function call in mssql, and not reliable in PHP 4.0.6		if($emsg = $zthis->ErrorMsg()) {			if ($err = $zthis->ErrorNo()) ADOConnection::outp($err.': '.$emsg);		}	} else if (!$qID) {		ADOConnection::outp($zthis->ErrorNo() .': '. $zthis->ErrorMsg());	}		return $qID;}function _adodb_backtrace($printOrArr=true,$levels=9999){	if (PHPVERSION() < 4.3) return '';	 	$html =  (isset($_SERVER['HTTP_USER_AGENT']));	$fmt =  ($html) ? "</font><font color=#808080 size=-1> %% line %4d, file: <a href=\"file:/%s\">%s</a></font>" : "%% line %4d, file: %s";	$MAXSTRLEN = 128;	$s = ($html) ? '<pre align=left>' : '';		if (is_array($printOrArr)) $traceArr = $printOrArr;	else $traceArr = debug_backtrace();	array_shift($traceArr);	array_shift($traceArr);	$tabs = sizeof($traceArr)-2;		foreach ($traceArr as $arr) {		$levels -= 1;		if ($levels < 0) break;				$args = array();		for ($i=0; $i < $tabs; $i++) $s .=  ($html) ? ' &nbsp; ' : "\t";		$tabs -= 1;		if ($html) $s .= '<font face="Courier New,Courier">';		if (isset($arr['class'])) $s .= $arr['class'].'.';		if (isset($arr['args']))		 foreach($arr['args'] as $v) {			if (is_null($v)) $args[] = 'null';			else if (is_array($v)) $args[] = 'Array['.sizeof($v).']';			else if (is_object($v)) $args[] = 'Object:'.get_class($v);			else if (is_bool($v)) $args[] = $v ? 'true' : 'false';			else {				$v = (string) @$v;				$str = htmlspecialchars(substr($v,0,$MAXSTRLEN));				if (strlen($v) > $MAXSTRLEN) $str .= '...';				$args[] = $str;			}		}		$s .= $arr['function'].'('.implode(', ',$args).')';						$s .= @sprintf($fmt, $arr['line'],$arr['file'],basename($arr['file']));					$s .= "\n";	}		if ($html) $s .= '</pre>';	if ($printOrArr) print $s;		return $s;}?>

⌨️ 快捷键说明

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