这次是逆雪寒的数据库类分析:

 <?php
/*
这个讲 phpcms 的数据库类 和 phpcms 的文本缓存的实现.看了看 都是很简单的东西.大家看着我注释慢慢看吧.慢慢理解,最好能装了PHPCMS 在来看.因为这样可以看下它的数据库结构信息.可以帮助理解. 不明白的继续问吧. 首先是数据库类,phpcms 的数据库 分mysql 和mssql 版本. MSSQL 版本的我就不说了.
他们主要的sql 语句不同点就在于我们分页常用到的 limit 语句.所以.在 mssql 数据库类驱动里.他做了个挺好的封装.
让MYSQL 和MSSQL在SQL语句方面的差异性就很小了.可以说PHPCMS你可以随便转换数据库只要在代码中换下数据库类驱动就行.
[php]
<?php
/*
mysql数据库类。写得比较简单。也没什么好说的。大家自己看下理解下。
然后就可以跳过了。
*/ /*
这个东西是不是很熟呀。对了。在上一章已经讲过了。也已经在上一章的common.inc.php 启动文件里面定义了 IN_PHPCMS
所以在以下的PHP文件里都检测下是否是人为”跳墙“进来的。是就中断
*/
defined('IN_PHPCMS') or exit('Access Denied'); /*
* Mysql 数据库类,支持Cache功能
*/ class db_mysql
{ /*
* MySQL 连接标识
* @var resource
*/
var $connid; /*
* 整型变量用来计算被执行的sql语句数量
* @var int
*/
var $querynum = 0; /*
* 数据库连接,返回数据库连接标识符
* @param string 数据库服务器主机
* @param string 数据库服务器帐号
* @param string 数据库服务器密码
* @param string 数据库名
* @param bool 是否保持持续连接,1为持续连接,0为非持续连接
* @return link_identifier
*/
function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0)
{
global $CONFIG; /*
mysql_pconnect() 为常连接。它和mysql_connect 的区别是 前者在多进程的WEB服务器上效率比较好。
但也有瑕疵就是在有关事务和数据表锁方面。详情请查看自己的手册。
*/
$func = $pconnect == 1 ? 'mysql_pconnect' : 'mysql_connect'; if(!$this->connid = @$func($dbhost, $dbuser, $dbpw))
{
$this->halt('Can not connect to MySQL server');
} // 当mysql版本为4.1以上时,启用数据库字符集设置
if($this->version() > '4.1' && $CONFIG['dbcharset'])
{
mysql_query("SET NAMES '".$CONFIG['dbcharset']."'" , $this->connid);
} // 当mysql版本为5.0以上时,设置sql mode,mysql5数据库带了字符集模式。设置下就好
if($this->version() > '5.0')
{
mysql_query("SET sql_mode=''" , $this->connid);
} if($dbname)
{
// if($email=!@mysql_select_db($dbname)!@mysql_select_db($dbname($email) , $this->connid))
{
$this->halt('Cannot use database '.$dbname);
}
} return $this->connid;
} /*
* 选择数据库
* @param string 数据库名
*/
function select_db($dbname)
{
return mysql_select_db($dbname , $this->connid);
} /*
* 执行sql语句
* @param string sql语句
* @param string 默认为空,可选值为 CACHE UNBUFFERED
* @param int Cache以 秒为单位 的生命周期
* @return resource
*/
function query($sql , $type = '' , $expires = 3600, $dbname = '')
{
/*
mysql_unbuffered_query 效率更好。节省内存 看手册
*/
$func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query'; if(!($query = $func($sql , $this->connid)) && $type != 'SILENT')
{
$this->halt('MySQL Query Error', $sql);
} $this->querynum++; return $query;
} /*
* 执行sql语句,只得到一条记录
* @param string sql语句
* @param string 默认为空,可选值为 CACHE UNBUFFERED
* @param int Cache以秒为单位的生命周期
* @return array
*/
function get_one($sql, $type = '', $expires = 3600, $dbname = '')
{
$query = $this->query($sql, $type, $expires, $dbname); $rs = $this->fetch_array($query); $this->free_result($query); return $rs ;
} /*
* 从结果集中取得一行作为关联数组
* @param resource 数据库查询结果资源
* @param string 定义返回类型
* @return array
*/
function fetch_array($query, $result_type = MYSQL_ASSOC)
{
return mysql_fetch_array($query, $result_type);
} /*
* 取得前一次 MySQL 操作所影响的记录行数
* @return int
*/
function affected_rows()
{
return mysql_affected_rows($this->connid);
} /*
* 取得结果集中行的数目
* @return int
*/
function num_rows($query)
{
return mysql_num_rows($query);
} /*
* 返回结果集中字段的数目
* @return int
*/
function num_fields($query)
{
return mysql_num_fields($query);
} /*
* @return array
*/
function result($query, $row)
{
return @mysql_result($query, $row);
} function free_result($query)
{
return mysql_free_result($query);
} /*
* 取得上一步 INSERT 操作产生的 ID
* @return int
*/
function insert_id()
{
return mysql_insert_id($this->connid);
} /*
* @return array
*/
function fetch_row($query)
{
return mysql_fetch_row($query);
} /*
* @return string
*/
function version()
{
return mysql_get_server_info($this->connid);
} function close()
{
return mysql_close($this->connid);
} /*
* @return string
*/
function error()
{
return @mysql_error($this->connid);
} /*
* @return int
*/
function errno()
{
/*
mysql_errno() 函数也挺好使的哦。自己试下
*/
return intval(@mysql_errno($this->connid)) ;
} /*
* 显示mysql错误信息
*/
function halt($message = '', $sql = '')
{
exit("MySQL Query:$sql <br>
MySQL Error:".$this->error()." <br>
MySQL Errno:".$this->errno()." <br>
Message:$message");
}
}
?>

 

phpcms 源码分析四: 数据库类实现的更多相关文章

  1. Heritrix源码分析(四) 各个类说明(转)

    Heritrix的类的确很繁琐,往往继承了一层又一层,最多的继承好像有7层.下面就一个包一个包的说明每个类的作用,由于里面Heritrix组件分明,很多组件没用到的同时该组件的类我也没怎么接触,所以这 ...

  2. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  3. JUC源码分析-其它工具类(一)ThreadLocalRandom

    JUC源码分析-其它工具类(一)ThreadLocalRandom ThreadLocalRandom 是 JDK7 在 JUC 包下新增的随机数生成器,它解决了 Random 在多线程下多个线程竞争 ...

  4. ABP源码分析四十:ZERO的Application和Tenant

    ABP的Zero模块以数据库为数据源实现了ABP框架中的tenant management (multi-tenancy), role management, user management, ses ...

  5. ABP源码分析四十一:ZERO的Audit,Setting,Background Job

    AuditLog: 继承自Entity<long>的实体类.封装AuditLog的信息. AuditingStore: 实现了IAuditingStore接口,实现了将AuditLog的信 ...

  6. ABP源码分析四十三:ZERO的本地化

    ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库管理本地化的功能.其通过数据库保存本地化语言及其资源. ApplicationLanguage:代表本地化语言的实体类.一种语言 ...

  7. ABP源码分析四十六:ABP ZERO中的Ldap模块

    通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...

  8. ABP源码分析四十七:ABP中的异常处理

    ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationExce ...

  9. 转:Ogre源码分析之Root类、Facade模式

    Ogre源码分析(一)Root类,Facade模式 Ogre中的Root对象是一个Ogre应用程序的主入口点.因为它是整个Ogre引擎的外观(Façade)类.通过Root对象来开启和停止Ogre是最 ...

随机推荐

  1. Outlook接收qq的邮件

    1.先去qq邮箱,设置,账户 开启pop3服务,假如之前开启过,最好关闭之后重新开启 最新版本的必须使用邮箱的独立密码才可以收取邮件 (否则就算你之前开通了,也无法用你的qq账号和密码收取邮件的) 2 ...

  2. GIS数据格式:Geodatabase

    转自:http://www.cnblogs.com/quansixiang/archive/2010/09/17/1829286.html 1  Geodatabase概念 Geodatabase是A ...

  3. MongoDB之三(高级操作 聚合、游标)

    一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...

  4. LightOJ 1341 Aladdin and the Flying Carpet 数学

    题意:给个矩形的面积a,和矩形的最小边长b,问有多少种矩形的方案(不能是正方形) 分析:a可以写成x,y,因为不能是正方形,所以设x<y,那么x<sqrt(a),y>sqrt(a) ...

  5. [转]ASP.NET MVC 入门6、TempData

    ASP.NET MVC的TempData用于传输一些临时的数据,例如在各个控制器Action间传递临时的数据或者给View传递一些临时的数据,相信大家都看过“在ASP.NET页面间传值的方法有哪几种” ...

  6. HashPasswordForStoringInConfigFile 已过时

    在.net 4.5版本下,使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile进行MD5加密时,会出 ...

  7. Java笔记(二十九)……网络编程

    概述 网络模型 网络通讯的要素 ip地址:网络中设备的标识符 端口:用于标识同一台设备上不同的进程,有效端口:0~65535,其中0~1024是系统使用端口或者保留端口 TCP与UDP UDP特点: ...

  8. NOIP2000 单词接龙

    题三.  单词接龙                (27分)    问题描述    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...

  9. grep环境变量常用配置

    vim ~/.bashrc GREP_OPTIONS="-irns --exclude-dir=output --exclude=tags --exclude=*.files" 然 ...

  10. 【转载】HBase 数据库检索性能优化策略

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-HBase/index.html 高性能 HBase 数据库 本文首先介绍了 HBase 数据库基本 ...