/** * 执行 */ public function execute() { //参数重载 if (func_num_args() == 1) { return $this->_executeParam1(func_get_arg(0)); } switch (trim($this->action)) { case 'SELECT': $databaseObject = CDatabase::getDatabase($this->configName, false); $sql = $this->_sql = $this->_createSelectSQL(); $rsReult = array(); $btime = $etime = 0; //检查缓存 if (!empty($this->_cache)) { //尝试直接从缓存获取 $cacheData = Cache::getInstance()->get($this->_cache); if (null != $cacheData) { //查询结果对象 $resultObject = new CResult(); $resultObject->setIsMaster(false); $resultObject->setSql($sql); $resultObject->setIsCache(true); $resultObject->setValue($cacheData->asArray()); $resultObject->setCastTime($etime > $btime ? round($etime - $btime, 6) : 0); //执行查询后钩子函数 CHooks::callHooks(HOOKS_EXECUTE_END, $resultObject); $this->_clearSelf(); return $cacheData; } } try { //执行查询前钩子函数 CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this); $btime = microtime(true); $rs = $databaseObject->prepare($this->_sql); if (!$rs) { $errorData = $databaseObject->errorInfo(); //发生SQL错误时 触发钩子 $dbError = new CDBError(); $dbError->setSQLErrorCode($errorData[0]); $dbError->setDriverErrorCode($errorData[1]); $dbError->setErrorMessage($errorData[2]); $dbError->setSql($this->_sql); CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError); throw new PDOException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']'); } $rs->execute($this->whereValue); $rs->setFetchMode(PDO::FETCH_OBJ); $rsReult = $rs->fetchAll(); $etime = microtime(true); } catch (PDOException $pdoException) { throw new CDbException($pdoException->getMessage()); } //查询结果对象 $resultObject = new CResult(); $resultObject->setIsMaster(false); $resultObject->setSql($sql); $resultObject->setWhereValue($this->whereValue); $resultObject->setValue($rsReult); $resultObject->setCastTime($etime > $btime ? round($etime - $btime, 6) : 0); //执行查询后钩子函数 CHooks::callHooks(HOOKS_EXECUTE_END, $resultObject); //缓存结果 if (!empty($this->_cache)) { $cacheData = Cache::getInstance()->set($this->_cache, $resultObject, $this->_cacheTime); } //清理 $this->_clearSelf(); return $resultObject; break; case 'INSERT INTO': // 强制主库操作新增 $this->isMaster = true; $databaseObject = CDatabase::getDatabase($this->configName, $this->isMaster); $sql = $this->_sql = $this->_createInsertSQL(); //执行查询前钩子函数 CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this); $insertStatus = $databaseObject->exec($this->_sql); if ($insertStatus > 0) { //执行操作 $execObject = new CExec(); $execObject->setSql($sql); $execObject->setRow($insertStatus); $execObject->setStatus(true); $execObject->setLastInsertId($databaseObject->lastInsertId()); //执行查询后钩子函数 CHooks::callHooks(HOOKS_EXECUTE_END, $execObject); //清理 $this->_clearSelf(); return $execObject; } else { //发生错误 $errorData = $databaseObject->errorInfo(); //发生SQL错误时 触发钩子 $dbError = new CDBError(); $dbError->setSQLErrorCode($errorData[0]); $dbError->setDriverErrorCode($errorData[1]); $dbError->setErrorMessage($errorData[2]); $dbError->setSql($this->_sql); CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError); throw new CDbException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']'); } //清理 $this->_clearSelf(); break; case 'UPDATE': // 强制主库操作更新 $this->isMaster = true; $databaseObject = CDatabase::getDatabase($this->configName, $this->isMaster); $sql = $this->_sql = $this->_createUpdateSQL(); //执行查询前钩子函数 CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this); $rs = $databaseObject->prepare($this->_sql); $updateStatus = $rs->execute($this->whereValue); if (false === $updateStatus) { $errorData = $databaseObject->errorInfo(); //发生SQL错误时 触发钩子 $dbError = new CDBError(); $dbError->setSQLErrorCode($errorData[0]); $dbError->setDriverErrorCode($errorData[1]); $dbError->setErrorMessage($errorData[2]); $dbError->setSql($this->_sql); CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError); throw new CDbException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']'); } else { $execObject = new CExec(); $execObject->setSql($sql); $execObject->setRow($updateStatus); $execObject->setWhereValue($this->whereValue); $execObject->setStatus(true); //执行查询后钩子函数 CHooks::callHooks(HOOKS_EXECUTE_END, $execObject); $this->_clearSelf(); return $execObject; } $this->_clearSelf(); break; case 'DELETE': // 强制主库操作删除 $this->isMaster = true; $databaseObject = CDatabase::getDatabase($this->configName, $this->isMaster); $sql = $this->_sql = $this->_createDeleteSQL(); //执行查询前钩子函数 CHooks::callHooks(HOOKS_EXECUTE_BEFORE, $this); //echo '<pre>';print_r($this->whereValue);exit; $rs = $databaseObject->prepare($this->_sql); $deleteStatus = $rs->execute($this->whereValue); if (false === $deleteStatus) { $errorData = $databaseObject->errorInfo(); //发生SQL错误时 触发钩子 $dbError = new CDBError(); $dbError->setSQLErrorCode($errorData[0]); $dbError->setDriverErrorCode($errorData[1]); $dbError->setErrorMessage($errorData[2]); $dbError->setSql($this->_sql); CHooks::callHooks(HOOKS_EXECUTE_ERROR, $dbError); throw new CDbException('[' . $errorData[1] . '] ' . $errorData[2] . ' with SQL [' . $this->_sql . ']'); } else { $execObject = new CExec(); $execObject->setSql($sql); $execObject->setWhereValue($this->whereValue); $execObject->setRow($deleteStatus); $execObject->setStatus(true); //执行查询后钩子函数 CHooks::callHooks(HOOKS_EXECUTE_END, $execObject); $this->_clearSelf(); return $execObject; } $this->_clearSelf(); break; default: if (!empty($this->prepare)) { } throw new CDbException('[查询错误]未指定操作方法'); break; } $this->_clearSelf(); }