- 浏览: 1775003 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
<?php class 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 模式 [MODE_READ_GETALL,MODE_READ_GETROW,MODE_READ_GETONE,MODE_READ_GETCOL] * @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 模式 [MODE_WRITE_UPDATE,MODE_WRITE_DELETE] * @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'); } }
测试结果如下:
D:\AppServ\www\orderun\prototype\app>php rake.php q=cui.actor.run.index Pkg_Db_Actor::MODE_READ_GETALL : Array ( [counter] => 2957 [rows] => Array ( [0] => Array ( [id] => 5 [sale_order_id] => 5 ) ) )
评论
1 楼
vb2005xu
2012-07-19
在这个基础上扩展了一个工具类Pkg_Db_Plugin_Pager
<?php /** * Pkg_Db_Plugin_Pager 类提供数据查询分页功能 * * 构造时传入 sql 和当前页码 参数 即可 * * @author vb2005xu */ class Pkg_Db_Plugin_Pager { /** * 检索的 sql 源 * * @var string */ private $source; /** * 计算实际页码时的基数 * * @var int */ private $_basePageIndex = 0; /** * 每页记录数 * * @var int */ private $pageSize = -1; /** * 数据表中符合查询条件的记录总数 * * @var int */ private $totalCount = -1; /** * 数据表中符合查询条件的记录总数 * * @var int */ private $count = -1; /** * 符合条件的记录页数 * * @var int */ private $pageCount = -1; /** * 第一页的索引,从 0 开始 * * @var int */ private $firstPage = -1; /** * 第一页的页码 * * @var int */ private $firstPageNumber = -1; /** * 最后一页的索引,从 0 开始 * * @var int */ private $lastPage = -1; /** * 最后一页的页码 * * @var int */ private $lastPageNumber = -1; /** * 上一页的索引 * * @var int */ private $prevPage = -1; /** * 上一页的页码 * * @var int */ private $prevPageNumber = -1; /** * 下一页的索引 * * @var int */ private $nextPage = -1; /** * 下一页的页码 * * @var int */ private $nextPageNumber = -1; /** * 当前页的索引 * * @var int */ private $currentPage = -1; /** * 构造函数中提供的当前页索引,用于 setBasePageIndex() 后重新计算页码 * * @var int */ private $_currentPage = -1; /** * 当前页的页码 * * @var int */ private $currentPageNumber = -1; /** * 构造函数 * * $source 参数假定为不带limit的 SQL 语句 * * @param string $source * @param int $currentPage * @param int $pageSize * @param int $basePageIndex */ function __construct($source, $currentPage, $pageSize = 20, $basePageIndex = 0) { // 设置分页索引第一页的基数 $this->_basePageIndex = $basePageIndex; $this->_currentPage = $this->currentPage = $currentPage; $this->pageSize = $pageSize; $this->source = $source; $sql = "SELECT COUNT(*) FROM ( $source ) as _count_table"; Pkg_Db_Actor::read(Pkg_Db_Actor::MODE_READ_GETONE ,$sql,NULL,$totalCount); $this->totalCount = $this->count = (int)$totalCount; $this->computingPage(); } /** * 设置当前页码,以便用 findAll() 获得其他页的数据 * * @param int $page */ function setPage($page) { $this->_currentPage = $page; $this->currentPage = $page; $this->computingPage(); } /** * 返回当前页对应的记录集 * * @return array */ function findAll() { $offset = ($this->currentPage - $this->_basePageIndex) * $this->pageSize; Pkg_Db_Actor::read(Pkg_Db_Actor::MODE_READ_GETALL,array($this->source,array($this->pageSize,$offset)),NULL,$rowset); return $rowset; } /** * 返回分页信息,方便在模版中使用 * * @param boolean $returnPageNumbers * * @return array */ function getPagerData($returnPageNumbers = true) { $data = array( 'pageSize' => $this->pageSize, 'totalCount' => $this->totalCount, 'count' => $this->count, 'pageCount' => $this->pageCount, 'firstPage' => $this->firstPage, 'firstPageNumber' => $this->firstPageNumber, 'lastPage' => $this->lastPage, 'lastPageNumber' => $this->lastPageNumber, 'prevPage' => $this->prevPage, 'prevPageNumber' => $this->prevPageNumber, 'nextPage' => $this->nextPage, 'nextPageNumber' => $this->nextPageNumber, 'currentPage' => $this->currentPage, 'currentPageNumber' => $this->currentPageNumber, ); if ($returnPageNumbers) { $data['pagesNumber'] = array(); for ($i = 0; $i < $this->pageCount; $i++) { $data['pagesNumber'][$i] = $i + 1; } } return $data; } /** * 产生指定范围内的页面索引和页号 * * @param int $currentPage * @param int $navbarLen * * @return array */ function getNavbarIndexs($currentPage = 0, $navbarLen = 8) { $mid = intval($navbarLen / 2); if ($currentPage < $this->firstPage) { $currentPage = $this->firstPage; } if ($currentPage > $this->lastPage) { $currentPage = $this->lastPage; } $begin = $currentPage - $mid; if ($begin < $this->firstPage) { $begin = $this->firstPage; } $end = $begin + $navbarLen - 1; if ($end >= $this->lastPage) { $end = $this->lastPage; $begin = $end - $navbarLen + 1; if ($begin < $this->firstPage) { $begin = $this->firstPage; } } $data = array(); for ($i = $begin; $i <= $end; $i++) { $data[] = array('index' => $i, 'number' => ($i + 1 - $this->_basePageIndex)); } return $data; } /** * 生成一个页面选择跳转控件 * * @param string $caption * @param string $jsfunc */ function renderPageJumper($caption = '%u', $jsfunc = 'fnOnPageChanged') { $out = "<select name=\"PageJumper\" onchange=\"{$jsfunc}(this.value);\">\n"; for ($i = $this->firstPage; $i <= $this->lastPage; $i++) { $out .= "<option value=\"{$i}\""; if ($i == $this->currentPage) { $out .= " selected"; } $out .=">"; $out .= sprintf($caption, $i + 1 - $this->_basePageIndex); $out .= "</option>\n"; } $out .= "</select>\n"; echo $out; } /** * 计算各项分页参数 */ protected function computingPage() { $this->pageCount = ceil($this->count / $this->pageSize); $this->firstPage = $this->_basePageIndex; $this->lastPage = $this->pageCount + $this->_basePageIndex - 1; if ($this->lastPage < $this->firstPage) { $this->lastPage = $this->firstPage; } if ($this->lastPage < $this->_basePageIndex) { $this->lastPage = $this->_basePageIndex; } if ($this->currentPage >= $this->pageCount + $this->_basePageIndex) { $this->currentPage = $this->lastPage; } if ($this->currentPage < $this->_basePageIndex) { $this->currentPage = $this->firstPage; } if ($this->currentPage < $this->lastPage - 1) { $this->nextPage = $this->currentPage + 1; } else { $this->nextPage = $this->lastPage; } if ($this->currentPage > $this->_basePageIndex) { $this->prevPage = $this->currentPage - 1; } else { $this->prevPage = $this->_basePageIndex; } $this->firstPageNumber = $this->firstPage + 1 - $this->_basePageIndex; $this->lastPageNumber = $this->lastPage + 1 - $this->_basePageIndex; $this->nextPageNumber = $this->nextPage + 1 - $this->_basePageIndex; $this->prevPageNumber = $this->prevPage + 1 - $this->_basePageIndex; $this->currentPageNumber = $this->currentPage + 1 - $this->_basePageIndex; } }
发表评论
-
前端截取url成图片
2017-11-09 18:16 1552有些小需求需要将 url 转成图片, 直接使用 ... -
excel-to-csv-inbrowser
2016-08-15 19:20 2891# excel-to-csv-inbrowser exce ... -
ws-http 最简单轻量的PHP CURL工具库
2016-07-29 20:44 2614欢迎大家拍砖 https://github.com/to ... -
常用的 js 代码梳理
2016-06-16 12:00 1917/** * 格式化时间函数 * @param {form ... -
Facade 包装类 -- 解决视图里面长长的命名空间调用问题
2016-04-20 10:48 1742有时候模版里面定义 ... -
搞一个简单的数据打印工具AsDebug の Laravel
2016-01-20 19:47 2991很多时候我们都要纠结于代码开发过程中的数据 dump 工作 ... -
ken\trade
2015-12-18 20:45 1547<?php namespace ken\tra ... -
我承认我手贱: 升级 xcode
2015-11-14 21:11 1885升级 xcode 之后, 在终端运行 git clone 出现 ... -
YII2 模块内自定义错误页
2015-11-07 12:17 5508当前YII框架中把错误异常配置都放置在 web.php 中, ... -
PHP单例模式面试注意事项
2015-10-20 09:57 1950最近面了不少PHP从业者,有实习生也有5/6年以上的开发者 ... -
NGINX 配置 SSL 证书 搭建 HTTPS 网站
2015-10-19 19:19 2914下面是详细的配置过程: 1、在服务器上使用 Open ... -
关于php cron任务管理的实现假想
2015-10-17 21:25 1893之前每开发一个计划任务功能均需要在线上操作crontab来新 ... -
fineuploader 跨子域上传文件 cookie丢失问题的解决
2015-10-14 13:30 4809目前的项目中,使用到了fineuploader 这个纯htm ... -
CentOS 6安全加固及性能优化
2015-07-27 14:54 4285CentOS 6安全加固及性能优化 我们可以通过调整 ... -
常见票据辨别真伪的方法
2015-04-28 09:07 17361、真伪鉴别图示和步 ... -
梳理面试中遇到的HTTP协议相关的问题和知识
2015-04-16 13:45 3939本文会是一个比较长的,持续更新的过程 当你在浏览器地 ... -
面试中遇到的期权问题
2015-04-13 14:33 2736最近在面试一直遇到 ... -
遭遇windows上PHP 不能打开GBK编码文件名的问题
2015-03-09 11:21 3144我在 目录下建了一个文件名为 謀定三國-i8ujlw.js ... -
遭遇jsonp同域下变作post请求的坑
2015-01-28 21:39 4750今天迁移一个站点时遇到一个坑爹问题,同一个jsonp接口在 ... -
nginx 400 错误请求分析
2015-01-27 15:01 3329在服务器上传文件过程中 nginx经常会出现 400 的错误 ...
相关推荐
`SqlHelper`类就是一个这样的封装,它集成了执行SQL语句的基本功能,包括查询、插入、更新和删除等操作。下面我们将详细讨论`SqlHelper`类的设计原理、常用方法及其在实际开发中的应用。 首先,`SqlHelper`类通常会...
在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...
例如,可能有一个`DBHelper`类,其中包含了`Connect()`方法来建立数据库连接,`ExecuteNonQuery()`方法用于执行不返回结果集的SQL命令,以及`ExecuteReader()`方法用于获取查询结果。 ```csharp public class ...
Python操作SQL Server类封装。最近用到Python,要操作数据库,没有现成的操作类,临时写了一个Python的SQLSERVER操作封装类,分享一下,需要安装pymssql包,安装方法:...
C#的sqlserver数据库操作封装类CommonSqlHelper,封装了sql语句的查询、修改、插入、删除操作,以及存储过程的执行,包括有输入、输出参数的存储过程,存储过程的执行无需输入任何参数名称,只需输入参数值即可。...
本篇文章将聚焦于如何使用ActiveX Data Objects(ADO)在C++中封装一个连接到SQL Server的类。ADO是微软提供的一种用于访问数据库的接口,它使得C++程序员能够轻松地与多种数据库进行通信,包括SQL Server。 首先,...
本主题将深入探讨“sql+sqlserver 数据库访问类封装例子”,这是一个利用面向对象编程来简化数据库操作的方法。我们将讨论如何通过配置文件动态连接到SQL Server数据库,并了解此类封装的优势。 首先,`sql+sql...
在这个场景下,使用封装好的类库能够简化编程工作,提高效率。本项目提供了一个基于ADO(ActiveX Data Objects)技术的VC连接SQL的封装类,通过这个类,开发者可以更方便地进行数据操作。 首先,我们来看`ADOConn.h...
2. SQL命令执行:封装类会提供执行SQL查询或命令的方法,如`ExecuteQuery`或`ExecuteCommand`。这些方法可能接受SQL语句作为参数,并返回执行结果,可能是记录集(Recordset)或其他形式的数据。 3. 错误处理:为了...
本文将深入探讨如何使用C++通过ADO方式连接到SQL数据库,并封装成一个类,便于执行SQL语句。 首先,我们需要了解ADO的核心组件:Connection(连接对象)、Command(命令对象)、Recordset(记录集对象)等。这些...
C#操作sql server 的类分装,用于大部分的操作,修改,删除,添加,存储过程等等。
- **简化API**:封装类通常会将复杂的ADO对象和方法包装成更简洁的C++类和成员函数,使代码更易读、易写。 - **错误处理**:封装类可能包含了错误处理机制,统一处理运行时的异常和错误,使得开发者不必为每个...
# 封装查询所有用户姓名的函数 def get_all_user_names(): s = select([users.c.name]) result = engine.execute(s) return [row[0] for row in result] ``` - **Java中的JDBC模板**:Spring框架提供了...
1. **可维护性**:当业务需求变更时,只需修改封装好的SQL方法,而不需要在多处代码中寻找并修改SQL语句,降低了维护成本。 2. **安全性**:通过参数化查询(PreparedStatement)防止SQL注入攻击。在封装的SQL方法...
在这个场景中,标题提到的"JAVA 连接sqlserver类 已封装好",指的是已经有一个预先编写好的Java类,它封装了与SQL Server数据库交互的基本操作,使得开发者可以更方便地进行数据库操作。 `sqljdbc.jar`是一个驱动包...
sql ExcuteNonQuery、ExcuteScalar封装
在SQL Server数据库中,实体类(Entity Class)的封装是一种常见的设计模式,它将数据库中的表映射到程序代码中的类,使得数据操作更加便捷、规范。本项目名为"sqlserver实体类的封装小程序",专门针对SQL Server...
2. **结构体**:`SQLResult`用于封装查询结果,可能包含行数、列数、数据缓冲区等信息。 3. **类定义**:`ODBCManager`类的声明,包括成员变量和成员函数的原型。 最后,`odbcconn.doc`文件应该是关于这个封装类的...