设为首页 收藏本站
查看: 641|回复: 0

[经验分享] 封装的一个mysql_lib.php, 主要是一个分页模型

[复制链接]

尚未签到

发表于 2016-10-18 09:21:49 | 显示全部楼层 |阅读模式
  转发请声明出处...
  

  提供的单元测试中没有给出相关数据库, 如要使用, 请自行设计...
  

  有哪些不足和需要改进的地方, 请不吝赐教...

  

  库文件:
  <?php/*** author: selfimpr* mail: lgg860911@yahoo.com.cn* blog: http://blog.csdn.net/lgg201*/#服务器配置信息keydefine('DB_CFG_K_HOST','host');define('DB_CFG_K_USERNAME','username');define('DB_CFG_K_PASSWORD','password');define('DB_CFG_K_PORT','port');#默认字符集define('MYSQL_DEFAULT_CHARSET','UTF8');#分页SQL拆分相关宏define('PAGINATE_COUNT_ALIAS','count');define('PAGINATE_COUNT_SQL_PATTERN','/(?<=(?<!`|\'|")SELECT).*(?=(?<!`|\'|")FROM)/i');define('PAGINATE_COUNT_SQL_REPLACEMENT',' count(*) AS ' . PAGINATE_COUNT_ALIAS . ' ');#分页默认信息define('PAGINATE_DEFAULT_PAGE',1);define('PAGINATE_DEFAULT_PAGESIZE',10);#分页数据模型keydefine('PAGEMODEL_KEY_PAGE_CURRENT','page_current');define('PAGEMODEL_KEY_PAGE_PREV','page_prev');define('PAGEMODEL_KEY_PAGE_NEXT','page_next');define('PAGEMODEL_KEY_PAGE_SIZE','page_size');define('PAGEMODEL_KEY_PAGE_TOTAL','page_total');define('PAGEMODEL_KEY_RECORD_OFFSET','record_offset');define('PAGEMODEL_KEY_RECORD_NUMBER','record_number');define('PAGEMODEL_KEY_RECORD_TOTAL','record_total');define('PAGEMODEL_KEY_DATA','data');/*** 获取数据库连接* @param mixed $cfg 数据库服务器配置, 数组, key为DB_CFG_K_*系列常量* @param mixed $dbname 数据库名* @param mixed $charset 字符集* @return void*/function mysql_get_connection($cfg, $dbname = NULL, $charset = MYSQL_DEFAULT_CHARSET) {$host= $cfg[DB_CFG_K_HOST] . ':' . $cfg[DB_CFG_K_PORT];$username= $cfg[DB_CFG_K_USERNAME];$password= $cfg[DB_CFG_K_PASSWORD];$connection= mysql_connect($host, $username, $password);mysql_switch_db($connection, $dbname);mysql_switch_charset($connection, $charset);return $connection;}/*** 释放数据库连接* @param mixed $conn 数据库连接对象* @return void*/function mysql_free_connection($conn) {if ( is_resource($conn) ) mysql_close($conn);}/*** 切换数据库* @param mixed $conn 数据库连接对象* @param mixed $dbname 数据库名* @return void*/function mysql_switch_db($connection, $dbname) {if ( $dbname ) mysql_select_db($dbname, $connection);}/*** 切换字符集* @param mixed $conn 数据库连接对象* @param mixed $charset 字符集名* @return void*/function mysql_switch_charset($connection, $charset) {if ( $charset ) mysql_set_charset($charset, $connection);}/*** 获取数据库中一行记录* @param mixed $conn 数据库连接对象* @param mixed $sql 查询语句* @return void*/function mysql_get_row($conn, $sql) {$rs= mysql_query($sql, $conn);$row= mysql_fetch_array($rs);mysql_free_result($rs);return $row;}/*** 获取数据库中多行记录* @param mixed $conn 数据库连接对象* @param mixed $sql 查询语句* @return void*/function mysql_get_rows($conn, $sql) {$rows= array();$rs= mysql_query($sql, $conn);while ( $row = mysql_fetch_array($rs) ) $rows[]= $row;mysql_free_result($rs);return $rows;}/*** 向数据库插入数据* @param mixed $conn 数据库连接对象* @param mixed $sql INSERT语句* @param mixed $id 最后一次插入ID* @return void*/function mysql_insert($conn, $sql, &$id = NULL) {mysql_query($sql, $conn);$id= mysql_insert_id($conn);return mysql_affected_rows($conn);}/*** 从数据库删除记录* @param mixed $conn 数据库连接对象* @param mixed $sql 删除语句* @return void*/function mysql_delete($conn, $sql) {mysql_query($sql, $conn);return mysql_affected_rows($conn);}/*** 更新数据库记录* @param mixed $conn 数据库连接对象* @param mixed $sql 更新语句* @return void*/function mysql_update($conn, $sql) {mysql_query($sql, $conn);return mysql_affected_rows($conn);}/*** 分页查询接口* @param mixed $conn 数据库连接对象* @param mixed $sql 查询语句* @param mixed $page 要获取的当前页码* @param mixed $page_size 每页记录数* @return $pagemodel分页模型, 数据, key为PAGEMODEL_KEY_*系列常量*/function mysql_paginate($conn, $sql, $page = PAGINATE_DEFAULT_PAGE, $page_size = PAGINATE_DEFAULT_PAGESIZE) {$count_sql= preg_replace(PAGINATE_COUNT_SQL_PATTERN, PAGINATE_COUNT_SQL_REPLACEMENT, $sql);$count_ret= mysql_get_row($conn, $count_sql);$record_total= $count_ret[PAGINATE_COUNT_ALIAS];$page_model= pagemodel_create($page, $page_size, $record_total);$offset= $page_model[PAGEMODEL_KEY_RECORD_OFFSET];$limit= $page_model[PAGEMODEL_KEY_RECORD_NUMBER];$fetch_sql= $sql . " limit $offset, $limit";$fetch_result= mysql_get_rows($conn, $fetch_sql);pm_d($page_model, $fetch_result);return $page_model;}/*** 创建分页模型* @param mixed $page_current 当前页码* @param mixed $page_size 每页记录数* @param mixed $record_total 总记录数* @param mixed $data 可选. 数据* @return $pagemodel分页模型, 数据, key为PAGEMODEL_KEY_*系列常量*/function pagemodel_create($page_current, $page_size, $record_total, $data = NULL) {$page_total= ceil($record_total / $page_size);$page_current= max(1, min($page_current, $page_total));$page_prev= max(1, $page_current - 1);$page_next= min($page_total, $page_current + 1);$record_offset= ($page_current - 1) * $page_size;$record_number= $page_current == $page_total ? $record_total - $page_size * ($page_total - 1) : $page_size;return array(PAGEMODEL_KEY_PAGE_CURRENT=> $page_current, PAGEMODEL_KEY_PAGE_PREV=> $page_prev, PAGEMODEL_KEY_PAGE_NEXT=> $page_next, PAGEMODEL_KEY_PAGE_SIZE=> $page_size, PAGEMODEL_KEY_PAGE_TOTAL=> $page_total, PAGEMODEL_KEY_RECORD_OFFSET=> $record_offset, PAGEMODEL_KEY_RECORD_NUMBER=> $record_number, PAGEMODEL_KEY_RECORD_TOTAL=> $record_total, PAGEMODEL_KEY_DATA=> $data, );}/*** 读取/设置分页模型中的当前页码* @param mixed $pagemodel 分页模型* @param mixed $page_current 可选. 如果传本参数, 则修改当前页码* @return void当前页码*/function pm_pc(&$pagemodel, $page_current = NULL) {if ( isset($page_current) ) $pagemodel[PAGEMODEL_KEY_PAGE_CURRENT] = $page_current;return $pagemodel[PAGEMODEL_KEY_PAGE_CURRENT];}/*** 读取/设置分页模型中的前一页页码* @param mixed $pagemodel 分页模型* @param mixed $page_prev 可选. 如果传本参数, 则修改前一页页码* @return void前一页页码*/function pm_pp(&$pagemodel, $page_prev = NULL) {if ( isset($page_prev) ) $pagemodel[PAGEMODEL_KEY_PAGE_PREV] = $page_prev;return $pagemodel[PAGEMODEL_KEY_PAGE_PREV];}/*** 读取/设置分页模型中后一页页码* @param mixed $pagemodel 分页模型* @param mixed $page_next 可选. 如果传本参数, 则修改后一页页码* @return void后一页页码*/function pm_pn(&$pagemodel, $page_next = NULL) {if ( isset($page_next) ) $pagemodel[PAGEMODEL_KEY_PAGE_NEXT] = $page_next;return $pagemodel[PAGEMODEL_KEY_PAGE_NEXT];}/*** 获取/设置分页模型中每页记录数* @param mixed $pagemodel 分页模型* @param mixed $page_size 可选. 如果传本参数, 则修改每页记录数* @return void每页记录数*/function pm_ps(&$pagemodel, $page_size = NULL) {if ( isset($page_size) ) $pagemodel[PAGEMODEL_KEY_PAGE_SIZE] = $page_size;return $pagemodel[PAGEMODEL_KEY_PAGE_SIZE];}/*** 获取/设置分页模型中总页数* @param mixed $pagemodel 分页模型* @param mixed $page_total 可选. 如果传本参数, 则修改总页数* @return void总页数*/function pm_pt(&$pagemodel, $page_total = NULL) {if ( isset($page_total) ) $pagemodel[PAGEMODEL_KEY_PAGE_TOTAL] = $page_total;return $pagemodel[PAGEMODEL_KEY_PAGE_TOTAL];}/*** 获取/设置分页模型中的本页开始记录偏移量* @param mixed $pagemodel 分页模型* @param mixed $record_offset 可选. 如果传本参数, 则修改本页开始记录偏移量* @return void本页开始记录偏移量*/function pm_ro(&$pagemodel, $record_offset = NULL) {if ( isset($record_offset) ) $pagemodel[PAGEMODEL_KEY_RECORD_OFFSET] = $record_offset;return $pagemodel[PAGEMODEL_KEY_RECORD_OFFSET];}/*** 获取/设置分页模型中本页记录数* @param mixed $pagemodel 分页模型* @param mixed $record_number 可选. 如果传本参数, 则修改本页记录数* @return void本页记录数*/function pm_rn(&$pagemodel, $record_number = NULL) {if ( isset($record_number) ) $pagemodel[PAGEMODEL_KEY_RECORD_NUMBER] = $record_number;return $pagemodel[PAGEMODEL_KEY_RECORD_NUMBER];}/*** 获取/设置分页模型中总记录数* @param mixed $pagemodel 分页模型* @param mixed $record_total 可选. 如果传本参数, 则修改总记录数* @return void总记录数*/function pm_rt(&$pagemodel, $record_total = NULL) {if ( isset($record_total) ) $pagemodel[PAGEMODEL_KEY_RECORD_TOTAL] = $record_total;return $pagemodel[PAGEMODEL_KEY_RECORD_TOTAL];}/*** 获取/设置分页模型中的数据* @param mixed $pagemodel 分页模型* @param mixed $data 可选. 如果传本参数, 则修改数据* @return void数据*/function pm_d(&$pagemodel, $data = NULL) {if ( isset($data) ) $pagemodel[PAGEMODEL_KEY_DATA] = $data;return $pagemodel[PAGEMODEL_KEY_DATA];}
  单元测试:
  <?php/*** author: selfimpr* mail: lgg860911@yahoo.com.cn* blog: http://blog.csdn.net/lgg201*/require_once dirname(__FILE__) . '/mysql_lib.php';$mysql_cfg= array(DB_CFG_K_HOST=> '', DB_CFG_K_USERNAME=> '', DB_CFG_K_PASSWORD=> '', DB_CFG_K_PORT=> '', );function pm_print($pagemodel) {printf("page_first: 1, page_prev: %d, page_current: %d, page_next: %d, page_last: %d, record: %d-%d(%d of %d)\n", pm_pp($pagemodel), pm_pc($pagemodel), pm_pn($pagemodel), pm_pt($pagemodel), pm_ro($pagemodel) + 1, pm_ro($pagemodel) + pm_rn($pagemodel), pm_rn($pagemodel), pm_rt($pagemodel));}define('DB_NAME_EXAMPLE','example');$conn= mysql_get_connection($mysql_cfg, DB_NAME_EXAMPLE);$ret= mysql_paginate($conn, 'SELECT * FROM example WHERE id > 100 order by id desc', $argv[1], $argv[2]);pm_print($ret);

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-287781-1-1.html 上篇帖子: Mysql innodb存储引擎的性能优化二 下篇帖子: Linux平台使用二进制包将MySQL 5.1安装到个人目录简易指南
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表