论坛首页 编程语言技术论坛

YY 下 sql查询封装类 不知道好不好使

浏览 1634 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-18  
PHP
<?php
class Pkg_Db_Actor {
	
	/**
	 * 查询结果记录集
	 */
	const MODE_SELECT_GETALL = 0x1001;
	
	/**
	 * 查询第一条记录
	 */
	const MODE_SELECT_GETROW = 0x1002;
	
	/**
	 * 查询第一条记录的第一个字段
	 */
	const MODE_SELECT_GETONE = 0x1003;
	
	/**
	 * 查询结果集的指定列
	 */
	const MODE_SELECT_GETCOL = 0x1004;
	
	/**
	 * 检索数据
	 * 
	 * @param string $mode 模式 [MODE_SELECT_GETALL,MODE_SELECT_GETROW,MODE_SELECT_GETONE,MODE_SELECT_GETCOL]
	 * @param mixed $arguments 参数[不同模式参数不同,缺省为sql字符串]
	 * @param string $callback 查询结果集的回调处理函数
	 * @param mixed $return 处理的结果
	 * 
	 * @return void
	 */
	static function select($mode, $arguments, $callback, &$return = null){
		$dbo = Core_App::$defaultDbExecutor->getReader();
		
		$arguments = (array) $arguments;
		
		$sql = array_shift($arguments);// 缺省第一个参数是sql字符串
		
		switch ($mode){
			case self::MODE_SELECT_GETALL: // 如果sql里面带了limit则不能使用counter
				$limit = array_shift($arguments);
				$counter = array_shift($arguments);
				if ($counter){
					$counter_sql = "SELECT COUNT(*) FROM ( $sql ) as _count_table";					
				}else {
					$counter_sql = null;
				}
				if ($limit) $sql .= Core_DBSqlHelper::getLimitSql($limit);
				$result = $dbo->getAll($sql);
				if ($counter_sql){
					$result = array(
						'counter' => $dbo->getOne($counter_sql),
						'rows' => $result,
					);
				}				
				break;
			case self::MODE_SELECT_GETROW:
				$result = $dbo->getRow($sql);
				break;
			case self::MODE_SELECT_GETONE:
				$result = $dbo->getOne($sql);
				break;
			case self::MODE_SELECT_GETCOL:
				$col = (int) array_shift($arguments);
				$result = $dbo->getCol($sql,$col);
				break;
			default:
				throw new Exception("未定义的 Pkg_Db_Actor SELECT 模式");
		}
		
		$callback = self::callbackWraper($callback);
		$return = empty($callback) ? $result : call_user_func_array($callback,array($result));
	}
	
	static function callbackWraper($callback){		
		if (!empty($callback)){
			if (is_callable($callback)) return $callback;// call_user_func_array($callback, $args);
			$cbInst = Core_Helper_Callback::getInstance();
			if ($cbInst->exists($callback))	return $cbInst->get($callback);
		}		
		return null;
	}
	
}

 

测试代码如下:

<?php
/**
 * 
 * @author xuxh
 */
class App_Controller_Cui_Actor_Run extends Core_Mvc_Web_Controller
{
	
	function II(array $rows){
		return array(
			'counter' => 3,
			'rows' => $rows
		);
	} 
	
	function actionIndex(){
		
//		$sql = "SELECT * FROM worksheet_order Limit 1";		
//		Pkg_Db_Actor::select(Pkg_Db_Actor::MODE_SELECT_GETALL ,$sql,array($this,'II'),$return);		
//		Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_SELECT_GETALL');
//		
//		Pkg_Db_Actor::select(Pkg_Db_Actor::MODE_SELECT_GETONE ,"SELECT count(*) FROM worksheet_order",NULL,$return);		
//		Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_SELECT_GETONE');
		
		Pkg_Db_Actor::select(Pkg_Db_Actor::MODE_SELECT_GETALL ,array(
			"SELECT id,sale_order_id FROM worksheet_order",array(1,3),true
		),NULL,$return);		
		Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_SELECT_GETALL');
		
	}
	
}
 

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics