<?php <BR>/** <BR> * 数据库PDO操作 <BR> */ <BR>class MysqlPdo { <BR>public static $PDOStatement = null; <BR>/** <BR>* 数据库的连接参数配置 <BR>* @var array <BR>* @access public <BR>*/ <BR>public static $config = array(); <BR>/** <BR>* 是否使用永久连接 <BR>* @var bool <BR>* @access public <BR>*/ <BR>public static $pconnect = false; <BR>/** <BR>* 错误信息 <BR>* @var string <BR>* @access public <BR>*/ <BR>public static $error = ''; <BR>/** <BR>* 单件模式,保存Pdo类唯一实例,数据库的连接资源 <BR>* @var object <BR>* @access public <BR>*/ <BR>protected static $link; <BR>/** <BR>* 是否已经连接数据库 <BR>* @var bool <BR>* @access public <BR>*/ <BR>public static $connected = false; <BR>/** <BR>* 数据库版本 <BR>* @var string <BR>* @access public <BR>*/ <BR>public static $dbVersion = null; <BR>/** <BR>* 当前SQL语句 <BR>* @var string <BR>* @access public <BR>*/ <BR>public static $queryStr = ''; <BR>/** <BR>* 最后插入记录的ID <BR>* @var integer <BR>* @access public <BR>*/ <BR>public static $lastInsertId = null; <BR>/** <BR>* 返回影响记录数 <BR>* @var integer <BR>* @access public <BR>*/ <BR>public static $numRows = 0; <BR>// 事务指令数 <BR>public static $transTimes = 0; <BR>/** <BR>* 构造函数, <BR>* @param $dbconfig 数据库连接相关信息,array('ServerName', 'UserName', 'Password', 'DefaultDb', 'DB_Port', 'DB_TYPE') <BR>*/ <BR>public function __construct($dbConfig=''){ <BR>if (!class_exists('PDO')) throw_exception("不支持:PDO"); <BR>//若没有传输任何参数,则使用默认的数据定义 <BR>if (!is_array($dbConfig)) { <BR>$dbConfig = array( <BR>'hostname' => DB_HOST, <BR>'username' => DB_USER, <BR>'password' => DB_PWD, <BR>'database' => DB_NAME, <BR>'hostport' => DB_PORT, <BR>'dbms' => DB_TYPE, <BR>'dsn' => DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME <BR>); <BR>} <BR>if(empty($dbConfig['hostname'])) throw_exception("没有定义数据库配置"); <BR>self::$config = $dbConfig; <BR>if(empty(self::$config['params'])) self::$config['params'] = array(); <BR>/*************************************华丽分隔线*******************************************/ <BR>if (!isset(self::$link) ) { <BR>$configs = self::$config; <BR>if(self::$pconnect) { <BR>$configs['params'][constant('PDO::ATTR_PERSISTENT')] = true; <BR>} <BR>try { <BR>self::$link = new PDO( $configs['dsn'], $configs['username'], $configs['password'],$configs['params']); <BR>} catch (PDOException $e) { <BR>throw_exception($e->getMessage()); <BR>//exit('连接失败:'.$e->getMessage()); <BR>} <BR>if(!self::$link) { <BR>throw_exception('PDO CONNECT ERROR'); <BR>return false; <BR>} <BR>self::$link->exec('SET NAMES '.DB_CHARSET); <BR>self::$dbVersion = self::$link->getAttribute(constant("PDO::ATTR_SERVER_INFO")); <BR>// 标记连接成功 <BR>self::$connected = true; <BR>// 注销数据库连接配置信息 <BR>unset($configs); <BR>} <BR>return self::$link; <BR>} <BR>/** <BR>* 释放查询结果 <BR>* @access function <BR>*/ <BR>static function free() { <BR>self::$PDOStatement = null; <BR>} <BR>/*********************************************************************************************************/ <BR>/* 数据库操作 */ <BR>/*********************************************************************************************************/ <BR>/** <BR>* 获得所有的查询数据 <BR>* @access function <BR>* @return array <BR>*/ <BR>static function getAll($sql=null) { <BR>self::query($sql); <BR>//返回数据集 <BR>$result = self::$PDOStatement->fetchAll(constant('PDO::FETCH_ASSOC')); <BR>return $result; <BR>} <BR>/** <BR>* 获得一条查询结果 <BR>* @access function <BR>* @param string $sql SQL指令 <BR>* @param integer $seek 指针位置 <BR>* @return array <BR>*/ <BR>static function getRow($sql=null) { <BR>self::query($sql); <BR>// 返回数组集 <BR>$result = self::$PDOStatement->fetch(constant('PDO::FETCH_ASSOC'),constant('PDO::FETCH_ORI_NEXT')); <BR>return $result; <BR>} <BR>/** <BR>* 执行sql语句,自动判断进行查询或者执行操作 <BR>* @access function <BR>* @param string $sql SQL指令 <BR>* @return mixed <BR>*/ <BR>static function doSql($sql='') { <BR>if(self::isMainIps($sql)) { <BR>return self::execute($sql); <BR>}else { <BR>return self::getAll($sql); <BR>} <BR>} <BR>/** <BR>* 根据指定ID查找表中记录(仅用于单表操作) <BR>* @access function <BR>* @param integer $priId 主键ID <BR>* @param string $tables 数据表名 <BR>* @param string $fields 字段名 <BR>* @return ArrayObject 表记录 <BR>*/ <BR>static function findById($tabName,$priId,$fields='*'){ <BR>$sql = 'SELECT %s FROM %s WHERE id=%d'; <BR>return self::getRow(sprintf($sql, self::parseFields($fields), $tabName, $priId)); <BR>} <BR>/** <BR>* 查找记录 <BR>* @access function <BR>* @param string $tables 数据表名 <BR>* @param mixed $where 查询条件 <BR>* @param string $fields 字段名 <BR>* @param string $order 排序 <BR>* @param string $limit 取多少条数据 <BR>* @param string $group 分组 <BR>* @param string $having <BR>* @param boolean $lock 是否加锁 <BR>* @return ArrayObject <BR>*/ <BR>static function find($tables,$where="",$fields='*',$order=null,$limit=null,$group=null,$having=null) { <BR>$sql = 'SELECT '.self::parseFields($fields) <BR>.' FROM '.$tables <BR>.self::parseWhere($where) <BR>.self::parseGroup($group) <BR>.self::parseHaving($having) <BR>.self::parseOrder($order) <BR>.self::parseLimit($limit); <BR>$dataAll = self::getAll($sql); <BR>if(count($dataAll)==1){$rlt=$dataAll[0];}else{$rlt=$dataAll;} <BR>return $rlt; <BR>} <BR>/** <BR>* 插入(单条)记录 <BR>* @access function <BR>* @param mixed $data 数据 <BR>* @param string $table 数据表名 <BR>* @return false | integer <BR>*/ <BR>static function add($data,$table) { <BR>//过滤提交数据 <BR>$data=self::filterPost($table,$data); <BR>foreach ($data as $key=>$val){ <BR>if(is_array($val) && strtolower($val[0]) == 'exp') { <BR>$val = $val[1]; // 使用表达式 ??? <BR>}elseif (is_scalar($val)){ <BR>$val = self::fieldFormat($val); <BR>}else{ <BR>// 去掉复合对象 <BR>continue; <BR>} <BR>$data[$key] = $val; <BR>} <BR>$fields = array_keys($data); <BR>array_walk($fields, array($this, 'addSpecialChar')); <BR>$fieldsStr = implode(',', $fields); <BR>$values = array_values($data); <BR>$valuesStr = imp<span style="color:transparent">~来1源gaodai#ma#com搞*代#码1网</span><abbr>搞代gaodaima码</abbr>lode(',', $values); <BR>$sql = 'INSERT INTO '.$table.' ('.$fieldsStr.') VALUES ('.$valuesStr.')'; <BR>return self::execute($sql); <BR>} <BR>/** <BR>* 更新记录 <BR>* @access function <BR>* @param mixed $sets 数据 <BR>* @param string $table 数据表名 <BR>* @param string $where 更新条件 <BR>* @param string $limit <BR>* @param string $order <BR>* @return false | integer <BR>*/ <BR>static function update($sets,$table,$where,$limit=0,$order='') { <BR>$sets = self::filterPost($table,$sets); <BR>$sql = 'UPDATE '.$table.' SET '.self::parseSets($sets).self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit); <BR>return self::execute($sql); <BR>} <BR>/** <BR>* 保存某个字段的值 <BR>* @access function <BR>* @param string $field 要保存的字段名 <BR>* @param string $value 字段值 <BR>* @param string $table 数据表 <BR>* @param string $where 保存条件 <BR>* @param boolean $asString 字段值是否为字符串 <BR>* @return void <BR>*/ <BR>static function setField($field, $value, $table, $condition="", $asString=false) { <BR>// 如果有'(' 视为 SQL指令更新 否则 更新字段内容为纯字符串 <BR>if(false === strpos($value,'(') || $asString) $value = '"'.$value.'"'; <BR>$sql = 'UPDATE '.$table.' SET '.$field.'='.$value.self::parseWhere($condition); <BR>return self::execute($sql); <BR>} <BR>/** <BR>* 删除记录 <BR>* @access function <BR>* @param mixed $where 为条件Map、Array或者String <BR>* @param string $table 数据表名 <BR>* @param string $limit <BR>* @param string $order <BR>* @return false | integer <BR>*/ <BR>static function remove($where,$table,$limit='',$order='') { <BR>$sql = 'DELETE FROM '.$table.self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit); <BR>return self::execute($sql); <BR>} <BR>/** <BR>+---------------------------------------------------------- <BR>* 修改或保存数据(仅用于单表操作) <BR>* 有主键ID则为修改,无主键ID则为增加 <BR>* 修改记录: <BR>+---------------------------------------------------------- <BR>* @access function <BR>+---------------------------------------------------------- <BR>* @param $tabName 表名 <BR>* @param $aPost 提交表单的 $_POST <BR>* @param $priId 主键ID <BR>* @param $aNot 要排除的一个字段或数组 <BR>* @param $aCustom 自定义的一个数组,附加到数据库中保存 <BR>* @param $isExits 是否已经存在 存在:true, 不存在:false <BR>+---------------------------------------------------------- <BR>* @return Boolean 修改或保存是否成功 <BR>+---------------------------------------------------------- <BR>*/ <BR>static function saveOrUpdate($tabName, $aPost, $priId="", $aNot="", $aCustom="", $isExits=false) { <BR>if(empty($tabName) || !is_array($aPost) || is_int($aNot)) return false; <BR>if(is_string($aNot) && !empty($aNot)) $aNot = array($aNot); <BR>if(is_array($aNot) && is_int(key($aNot))) $aPost = array_diff_key($aPost, array_flip($aNot)); <BR>if(is_array($aCustom) && is_string(key($aCustom))) $aPost = array_merge($aPost,$aCustom); <BR>if (empty($priId) && !$isExits) { //新增 <BR>$aPost = array_filter($aPost, array($this, 'removeEmpty')); <BR>return self::add($aPost, $tabName); <BR>} else { //修改 <BR>return self::update($aPost, $tabName, "id=".$priId); <BR>} <BR>} <BR>/** <BR>* 获取最近一次查询的sql语句 <BR>* @access function <BR>* @param <BR>* @return String 执行的SQL <BR>*/ <BR>static function getLastSql() { <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>return self::$queryStr; <BR>} <BR>/** <BR>* 获取最后插入的ID <BR>* @access function <BR>* @param <BR>* @return integer 最后插入时的数据ID <BR>*/ <BR>static function getLastInsId(){ <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>return self::$lastInsertId; <BR>} <BR>/** <BR>* 获取DB版本 <BR>* @access function <BR>* @param <BR>* @return string <BR>*/ <BR>static function getDbVersion(){ <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>return self::$dbVersion; <BR>} <BR>/** <BR>* 取得数据库的表信息 <BR>* @access function <BR>* @return array <BR>*/ <BR>static function getTables() { <BR>$info = array(); <BR>if(self::query("SHOW TABLES")) { <BR>$result = self::getAll(); <BR>foreach ($result as $key => $val) { <BR>$info[$key] = current($val); <BR>} <BR>} <BR>return $info; <BR>} <BR>/** <BR>* 取得数据表的字段信息 <BR>* @access function <BR>* @return array <BR>*/ <BR>static function getFields($tableName) { <BR>// 获取数据库联接 <BR>$link = self::$link; <BR>$sql = "SELECT <BR>ORDINAL_POSITION ,COLUMN_NAME, COLUMN_TYPE, DATA_TYPE, <BR>IF(ISNULL(CHARACTER_MAXIMUM_LENGTH), (NUMERIC_PRECISION + NUMERIC_SCALE), CHARACTER_MAXIMUM_LENGTH) AS MAXCHAR, <BR>IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY, EXTRA, COLUMN_COMMENT <BR>FROM <BR>INFORMATION_SCHEMA.COLUMNS <BR>WHERE <BR>TABLE_NAME = :tabName AND TABLE_SCHEMA='".DB_NAME."'"; <BR>self::$queryStr = sprintf($sql, $tableName); <BR>$sth = $link->prepare($sql); <BR>$sth->bindParam(':tabName', $tableName); <BR>$sth->execute(); <BR>$result = $sth->fetchAll(constant('PDO::FETCH_ASSOC')); <BR>$info = array(); <BR>foreach ($result as $key => $val) { <BR>$info[$val['COLUMN_NAME']] = array( <BR>'postion' => $val['ORDINAL_POSITION'], <BR>'name' => $val['COLUMN_NAME'], <BR>'type' => $val['COLUMN_TYPE'], <BR>'d_type' => $val['DATA_TYPE'], <BR>'length' => $val['MAXCHAR'], <BR>'notnull' => (strtolower($val['IS_NULLABLE']) == "no"), <BR>'default' => $val['COLUMN_DEFAULT'], <BR>'primary' => (strtolower($val['COLUMN_KEY']) == 'pri'), <BR>'autoInc' => (strtolower($val['EXTRA']) == 'auto_increment'), <BR>'comment' => $val['COLUMN_COMMENT'] <BR>); <BR>} <BR>// 有错误则抛出异常 <BR>self::haveErrorThrowException(); <BR>return $info; <BR>} <BR>/** <BR>* 关闭数据库 <BR>* @access function <BR>*/ <BR>static function close() { <BR>self::$link = null; <BR>} <BR>/** <BR>* SQL指令安全过滤 <BR>* @access function <BR>* @param string $str SQL指令 <BR>* @return string <BR>*/ <BR>static function escape_string($str) { <BR>return addslashes($str); <BR>} <BR>/*********************************************************************************************************/ <BR>/* 内部操作方法 */ <BR>/*********************************************************************************************************/ <BR>/** <BR>* 有出错抛出异常 <BR>* @access function <BR>* @return <BR>*/ <BR>static function haveErrorThrowException() { <BR>$obj = empty(self::$PDOStatement) ? self::$link : self::$PDOStatement; <BR>$arrError = $obj->errorInfo(); <BR>if(count($arrError) > 1) { // 有错误信息 <BR>//$this->rollback(); <BR>self::$error = $arrError[2]. "<br /><br /> [ SQL语句 ] : ".self::$queryStr; <BR>//throw_exception($this->error); <BR>throw_exception(self::$error); <BR>return false; <BR>} <BR>//主要针对execute()方法抛出异常 <BR>if(self::$queryStr=='')throw_exception('Query was empty<br /><br />[ SQL语句 ] :'); <BR>} <BR>/** <BR>* where分析 <BR>* @access function <BR>* @param mixed $where 查询条件 <BR>* @return string <BR>*/ <BR>static function parseWhere($where) { <BR>$whereStr = ''; <BR>if(is_string($where) || is_null($where)) { <BR>$whereStr = $where; <BR>} <BR>return empty($whereStr)?'':' WHERE '.$whereStr; <BR>} <BR>/** <BR>* order分析 <BR>* @access function <BR>* @param mixed $order 排序 <BR>* @return string <BR>*/ <BR>static function parseOrder($order) { <BR>$orderStr = ''; <BR>if(is_array($order)) <BR>$orderStr .= ' ORDER BY '.implode(',', $order); <BR>else if(is_string($order) && !empty($order)) <BR>$orderStr .= ' ORDER BY '.$order; <BR>return $orderStr; <BR>} <BR>/** <BR>* limit分析 <BR>* @access function <BR>* @param string $limit <BR>* @return string <BR>*/ <BR>static function parseLimit($limit) { <BR>$limitStr = ''; <BR>if(is_array($limit)) { <BR>if(count($limit)>1) <BR>$limitStr .= ' LIMIT '.$limit[0].' , '.$limit[1].' '; <BR>else <BR>$limitStr .= ' LIMIT '.$limit[0].' '; <BR>} else if(is_string($limit) && !empty($limit)) { <BR>$limitStr .= ' LIMIT '.$limit.' '; <BR>} <BR>return $limitStr; <BR>} <BR>/** <BR>* group分析 <BR>* @access function <BR>* @param mixed $group <BR>* @return string <BR>*/ <BR>static function parseGroup($group) { <BR>$groupStr = ''; <BR>if(is_array($group)) <BR>$groupStr .= ' GROUP BY '.implode(',', $group); <BR>else if(is_string($group) && !empty($group)) <BR>$groupStr .= ' GROUP BY '.$group; <BR>return empty($groupStr)?'':$groupStr; <BR>} <BR>/** <BR>* having分析 <BR>* @access function <BR>* @param string $having <BR>* @return string <BR>*/ <BR>static function parseHaving($having) { <BR>$havingStr = ''; <BR>if(is_string($having) && !empty($having)) <BR>$havingStr .= ' HAVING '.$having; <BR>return $havingStr; <BR>} <BR>/** <BR>* fields分析 <BR>* @access function <BR>* @param mixed $fields <BR>* @return string <BR>*/ <BR>static function parseFields($fields) { <BR>if(is_array($fields)) { <BR>array_walk($fields, array($this, 'addSpecialChar')); <BR>$fieldsStr = implode(',', $fields); <BR>}else if(is_string($fields) && !empty($fields)) { <BR>if( false === strpos($fields,'`') ) { <BR>$fields = explode(',',$fields); <BR>array_walk($fields, array($this, 'addSpecialChar')); <BR>$fieldsStr = implode(',', $fields); <BR>}else { <BR>$fieldsStr = $fields; <BR>} <BR>}else $fieldsStr = '*'; <BR>return $fieldsStr; <BR>} <BR>/** <BR>* sets分析,在更新数据时调用 <BR>* @access function <BR>* @param mixed $values <BR>* @return string <BR>*/ <BR>private function parseSets($sets) { <BR>$setsStr = ''; <BR>if(is_array($sets)){ <BR>foreach ($sets as $key=>$val){ <BR>$key = self::addSpecialChar($key); <BR>$val = self::fieldFormat($val); <BR>$setsStr .= "$key = ".$val.","; <BR>} <BR>$setsStr = substr($setsStr,0,-1); <BR>}else if(is_string($sets)) { <BR>$setsStr = $sets; <BR>} <BR>return $setsStr; <BR>} <BR>/** <BR>* 字段格式化 <BR>* @access function <BR>* @param mixed $value <BR>* @return mixed <BR>*/ <BR>static function fieldFormat(&$value) { <BR>if(is_int($value)) { <BR>$value = intval($value); <BR>} else if(is_float($value)) { <BR>$value = floatval($value); <BR>} elseif(preg_match('/^\(\w*(\+|\-|\*|\/)?\w*\)$/i',$value)){ <BR>// 支持在字段的值里面直接使用其它字段 <BR>// 例如 (score+1) (name) 必须包含括号 <BR>$value = $value; <BR>}else if(is_string($value)) { <BR>$value = '\''.self::escape_string($value).'\''; <BR>} <BR>return $value; <BR>} <BR>/** <BR>* 字段和表名添加` 符合 <BR>* 保证指令中使用关键字不出错 针对mysql <BR>* @access function <BR>* @param mixed $value <BR>* @return mixed <BR>*/ <BR>static function addSpecialChar(&$value) { <BR>if( '*' == $value || false !== strpos($value,'(') || false !== strpos($value,'.') || false !== strpos($value,'`')) { <BR>//如果包含* 或者 使用了sql方法 则不作处理 <BR>} elseif(false === strpos($value,'`') ) { <BR>$value = '`'.trim($value).'`'; <BR>} <BR>return $value; <BR>} <BR>/** <BR>+---------------------------------------------------------- <BR>* 去掉空元素 <BR>+---------------------------------------------------------- <BR>* @access function <BR>+---------------------------------------------------------- <BR>* @param mixed $value <BR>+---------------------------------------------------------- <BR>* @return mixed <BR>+---------------------------------------------------------- <BR>*/ <BR>static function removeEmpty($value){ <BR>return !empty($value); <BR>} <BR>/** <BR>* 执行查询 主要针对 SELECT, SHOW 等指令 <BR>* @access function <BR>* @param string $sql sql指令 <BR>* @return mixed <BR>*/ <BR>static function query($sql='') { <BR>// 获取数据库联接 <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>self::$queryStr = $sql; <BR>//释放前次的查询结果 <BR>if ( !empty(self::$PDOStatement) ) self::free(); <BR>self::$PDOStatement = $link->prepare(self::$queryStr); <BR>$bol = self::$PDOStatement->execute(); <BR>// 有错误则抛出异常 <BR>self::haveErrorThrowException(); <BR>return $bol; <BR>} <BR>/** <BR>* 数据库操作方法 <BR>* @access function <BR>* @param string $sql 执行语句 <BR>* @param boolean $lock 是否锁定(默认不锁定) <BR>* @return void <BR>public function execute($sql='',$lock=false) { <BR>if(empty($sql)) $sql = $this->queryStr; <BR>return $this->_execute($sql); <BR>}*/ <BR>/** <BR>* 执行语句 针对 INSERT, UPDATE 以及DELETE <BR>* @access function <BR>* @param string $sql sql指令 <BR>* @return integer <BR>*/ <BR>static function execute($sql='') { <BR>// 获取数据库联接 <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>self::$queryStr = $sql; <BR>//释放前次的查询结果 <BR>if ( !empty(self::$PDOStatement) ) self::free(); <BR>$result = $link->exec(self::$queryStr); <BR>// 有错误则抛出异常 <BR>self::haveErrorThrowException(); <BR>if ( false === $result) { <BR>return false; <BR>} else { <BR>self::$numRows = $result; <BR>self::$lastInsertId = $link->lastInsertId(); <BR>return self::$numRows; <BR>} <BR>} <BR>/** <BR>* 是否为数据库更改操作 <BR>* @access private <BR>* @param string $query SQL指令 <BR>* @return boolen 如果是查询操作返回false <BR>*/ <BR>static function isMainIps($query) { <BR>$queryIps = 'INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|LOAD DATA|SELECT .* INTO|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK'; <BR>if (preg_match('/^\s*"?(' . $queryIps . ')\s+/i', $query)) { <BR>return true; <BR>} <BR>return false; <BR>} <BR>/** <BR>* 过滤POST提交数据 <BR>* @access private <BR>* @param mixed $data POST提交数据 <BR>* @param string $table 数据表名 <BR>* @return mixed $newdata <BR>*/ <BR>static function filterPost($table,$data) { <BR>$table_column = self::getFields($table); <BR>$newdata=array(); <BR>foreach ($table_column as $key=>$val){ <BR>if(array_key_exists($key,$data) && ($data[$key])!==''){ <BR>$newdata[$key] = $data[$key]; <BR>} <BR>} <BR>return $newdata; <BR>} <BR>/** <BR>* 启动事务 <BR>* @access function <BR>* @return void <BR>*/ <BR>static function startTrans() { <BR>//数据rollback 支持 <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>if (self::$transTimes == 0) { <BR>$link->beginTransaction(); <BR>} <BR>self::$transTimes++; <BR>return ; <BR>} <BR>/** <BR>* 用于非自动提交状态下面的查询提交 <BR>* @access function <BR>* @return boolen <BR>*/ <BR>static function commit() { <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>if (self::$transTimes > 0) { <BR>$result = $link->commit(); <BR>self::$transTimes = 0; <BR>if(!$result){ <BR>throw_exception(self::$error()); <BR>return false; <BR>} <BR>} <BR>return true; <BR>} <BR>/** <BR>* 事务回滚 <BR>* @access function <BR>* @return boolen <BR>*/ <BR>public function rollback() { <BR>$link = self::$link; <BR>if ( !$link ) return false; <BR>if (self::$transTimes > 0) { <BR>$result = $link->rollback(); <BR>self::$transTimes = 0; <BR>if(!$result){ <BR>throw_exception(self::$error()); <BR>return false; <BR>} <BR>} <BR>return true; <BR>} <BR>} <BR>?> <BR>