vb2005xu 发表于 2013-2-7 00:47:48

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

<?phpclass Pkg_Db_Actor {/** * 读 记录集 */const MODE_READ_GETALL = 0x1001;/** * 读 第一条记录 */const MODE_READ_GETROW = 0x1002;/** * 读 第一条记录的第一个字段 */const MODE_READ_GETONE = 0x1003;/** * 读 记录集的指定列 */const MODE_READ_GETCOL = 0x1004;/** * 写 (插入) 操作 */const MODE_WRITE_INSERT = 0x2001;/** * 写 (更新) 操作 */const MODE_WRITE_UPDATE = 0x2002;/** * 写 (删除) 操作 */const MODE_WRITE_DELETE = 0x2002;/** * 执行 读 操作 ** @param string $mode 模式 * @param mixed $arguments 参数[不同模式参数不同,缺省为sql字符串] * @param string $callback 查询记录集的回调处理函数 * @param mixed $return 处理的结果 ** @return void */static function read($mode, $arguments, $callback, &$return = null){$dbo = Core_App::$defaultDbExecutor->getReader();$arguments = (array) $arguments;$sql = array_shift($arguments);// 缺省第一个参数是sql字符串switch ($mode){case self::MODE_READ_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_READ_GETROW:$result = $dbo->getRow($sql);break;case self::MODE_READ_GETONE:$result = $dbo->getOne($sql);break;case self::MODE_READ_GETCOL:$col = (int) array_shift($arguments);$result = $dbo->getCol($sql,$col);break;default:throw new Exception("未定义的 Pkg_Db_Actor READ 模式");}$callback = self::callbackWraper($callback);$return = empty($callback) ? $result : call_user_func_array($callback,array($result));}/** * 执行 更新/删除 操作 ** @param string $mode 模式 * @param mixed $arguments 参数[不同模式参数不同,缺省为sql字符串] * @param string $callback 查询结果集的回调处理函数 * @param mixed $return 处理的结果 ** @return void */static function write($mode, $arguments, $callback, &$return = null){$dbo = Core_App::$defaultDbExecutor->getWriter();$arguments = (array) $arguments;$sql = array_shift($arguments);// 缺省第一个参数是sql字符串$result = $dbo->execute($sql);switch ($mode){case self::MODE_WRITE_INSERT: // 插入操作可选 得到主键标识$id = array_shift($arguments);$result = $id ? $dbo->lastInsertId() : $dbo->lastQueryAffectedRows();break;case self::MODE_WRITE_UPDATE:case self::MODE_WRITE_DELETE:$result = $dbo->lastQueryAffectedRows();break;default:throw new Exception("未定义的 Pkg_Db_Actor WRITE 模式");}$callback = self::callbackWraper($callback);$return = empty($callback) ? $result : call_user_func_array($callback,array($result));}/** * 回调函数包装器 ** 如果函数是可调用的,则返回 回调函数,否则返回NULL ** @param string $callback 回调函数 ** @return callback */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::read(Pkg_Db_Actor::MODE_READ_GETALL ,$sql,array($this,'II'),$return);//Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_READ_GETALL');////Pkg_Db_Actor::read(Pkg_Db_Actor::MODE_READ_GETONE ,"SELECT count(*) FROM worksheet_order",NULL,$return);//Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_READ_GETONE');Pkg_Db_Actor::read(Pkg_Db_Actor::MODE_READ_GETALL ,array("SELECT id,sale_order_id FROM worksheet_order",array(1,3),true),NULL,$return);Core_AppUtils::dump($return,'Pkg_Db_Actor::MODE_READ_GETALL');}} 
测试结果如下:
<div class="quote_title">D:\AppServ\www\orderun\prototype\app>php rake.php q=cui.actor.run.indexPkg_Db_Actor::MODE_READ_GETALL :Array(    => 2957    => Array      (             => Array                (                   => 5                   => 5                )      ))
页: [1]
查看完整版本: YY 下 sql查询封装类 不知道好不好使