ShopCMS 开发文档
HFramework 开发文档

6.2 数据库操作方法

在ShopCMS系统中的模型基类中,已经基于此类编写了面向对象的数据库操作方法,使用更方便、开发更快。如果您是基于ShopCMS二次开发法,建议您直接使用ShopCMS的模型基类,参见:
4.1 模型简介
4.2 框架模型基类功能概述
4.3 框架模型基类提供的方法
如果ShopCMS模型基类提供的方法不能满足您的需求,您可以使用本类中的方法。
注:因为ShopCMS模型基类是基于本类开发的,并且是单利模式调用本类的方法,所以,使用本类设置的SQL执行回调函数,在ShopCMS模型基类执行SQL操作时,被触发SQL回调函数。


本数据库类,为您提供了更原始通用的数据库读写方法。

数据库操作类有两部分组成:
一部分是数据库操作类(即本类,位于 framework/extension/HDb.php);
另一部分是查询条件类(位于 framework/extension/HDbCondition.php,详情见下一章节的讲解)。


本类基于PHP PDO 开发,支持MYSQL数据库主分离,如果有多个从数据库,则框架会通过加权随机的方式选择从数据库,关于加权随机的配置参见主配置文件中 db 节的说明。
本类的实例化,建议您使框架提供的单利模式方法进行实例化,用下面的语句:
H::db();
如执行SQL语句用:
H::db()->execute($sql);
其中H::db()是单利模式实例化数据库对象,整个会话过程中,多次调用,仅会实例化一次。

框架数据库对象提供的方法有:
<?php 

/**
 * HFramework 数据库操作类
 * 本类基于PHP PDO开发,阅读本类,您需要有PHP PDO 方面的知识
 */
class HDb{

	/**
	 * 构造函数
	 * @param menu $dbType 待操作的数据库类型,
	 * 可选值为:master、slave,分别表示主数据库、从数据库
	 */
	function __construct($type = 'master')
	
	/**
	 * 删除扩展字段
	 * @param string $tableName 仅限适用的数据表的表名
	 */
	public function removeExtFields($tableName)
	
	/**
	 * 设置回调函数
	 * 相同的场景多次调用此方法,只会以最后一次调用为准
	 * @param string $scene 触发的场景,可选值有:INSERT/DELETE/UPDATE/SELECT,分别表示插入、更新、删除时触发
	 * @param string $tableName 适用的数据表的表名,只有此表被插入时才会触发对应的回调函数
	 * @param mixed $callback 可回调的函数,参数可接收的类型有:
	 * 此参数可以是一个string 型函数名,函数必须是全局可访问的
	 * 此参数可以是一个array型一维数组索引,数组第一项可以是类名或者类的实例,第二项是类的方法名;如果第一项是类名,则第二项必须是静态方法
	 * 注:$callback对应的函数需要有2个参数,第一个参数用于接收当前执行的SQL语句,第2个参数用于接收当前绑定的参数
	 */
	public static function setCallback($scene, $tableName, $callback)
	
	/**
	 * 删除回调
	 * @param string $scene 触发的场景,可选值有:INSERT/DELETE/UPDATE/SELECT,分别表示插入/删除/更新/查找 时触发
	 * @param string $tableName 仅限适用的数据表的表名
	 * @return void 无返回值
	 */
	public static function removeCallback($scene, $tableName)
	
	/**
	 * 从SQL语句中提炼表名和操作
	 * @param string $sql SQL语句
	 * @return array 一位索引数组,array[0] 表示表名, array[1]表示操作
	 */
	public static function getTableScene($sql)

	/**
	 * 执行SQL语句
	 * @param string $sql SQL语句
	 * @param array $params 绑定参数,格式为 array(':column1'=>'myData1', ':column2'=>'myData'...)
	 * @return boolen true=成功;失败返回false,异常会抛出错误
	 * 注:执行成功未必更新了数据(如执行后前后为变化)
	 */
	public function execute($sql, $params=array())
	
	/**
	 * 获取上一个 SQL语句操作后影响的行数
	 * @return int 行数
	 * 注:如果$sql中包含多个英文分号分隔的SQL语句,则获取更新行数时,返回第一个SQL语句的影响行数
	 */
	public function rowCount()
	
	/**
	 * 获取当前数据库连接的最后一次插入的记录ID(或者序列)
	 * 经实际测试,此方法不会对所有的数据库有效,例如对postgresSQL是无效的。
	 * @return string ID或者序列
	 */
	public function lastInsertId()
	
	/**
	 * 查询一条记录
	 * @param string $sql SQL语句,如果sql参数中没有“limit”关键词,则此方法会在SQL结尾自动添加"LIMIT 0 OFFSET 1" (此limit写法,兼容性更好)
	 * @param array $params 绑定参数,一维数组
	 * @return $mixed 成功返回 array(一维关联数组),失败返回 boolen false
	 * 判断是否查到数据,可以使用  !==false 或者 is_array() 判断,
	 * 不可以用 count(),因为count(false)的返回值是 1,
	 * 也不建议直接使用  if(返回值) 判断结果,因为 if(array())的返回值是false
	 */
	public function getRow($sql, $params = array())
	
	/**
	 * 查询多条记录
	 * @param string $sql  SQL语句,因为默认是查询所有符合条件的记录,数据量可能会很大,建议在SQL中使用limit语句
	 * @param array $params 绑定参数,一维数组
	 * @return array 二维关联数组,没有查到数据返回空数组
	 */
	public function getRows($sql, $params = array())

	/**
	 * 获取execute方法执行后返回的结果集
	 * 每次执行获取一行记录,多次执行则逐行依次返回
	 * @return mixed 成功返回 array一维关联数组,没有取到数据返回 boolen false
	 */
	public function fetch()
	
	/**
	 * 获取execute方法执行后返回的全部记录
	 * @return array 成功返回  array,没有取到数据返回空数组
	 */
	public function fetchAll()
	
	/**
	 * 启动事务
	 * @param object $creater 调用事务的对象
	 * 此参数用于实现事务的嵌套(标记事务的第最外层创建者,只有最外层创建者才能提交和回滚事务)
	 * @return boolen 成功返回 true, 或者在失败时返回 false
	 */
	public function transBegin($creater=null)
	
	/**
	 * 提交事务
	 * 内层嵌套的事务不会真正提交
	 * 如果内层事务已回滚外层事务提交会抛出错误
	 * @param object $creater 调用事务的对象
	 * @return boolen 成功返回 true, $this->_pdo->commit();在失败时返回 false
	 */
	public function transCommit($creater=null)
	
	/**
	 * 回滚事务
	 * 内层嵌套的事务不会真正回滚
 	 * 如果内层回滚,外层事务将不能提交(强制提交会抛出错误)
	 * @param object $creater 调用事务的对象,可以赋值为任何类的实例,用于判断事物嵌套关系
	 * @param string $errorMsg 回滚原因,用于其他对象捕获错误信息
	 * @return boolen 成功返回 true, 或者在失败时返回 false在
	 * 注:子事务中回滚,会一直返回false
	 */
	public function transRollback($creater=null, $errorMsg='')
	
	/**
	 * 单利模式实例化SQL条件对象
	 * 仅用于模型类创建查询条件
	 * @return object HDbCondition对象
	 */
	public function condition()
	
	/**
	 * 打印所有执行过的SQL语句和绑定的参数
	 * 仅在调试模式下有效
	 * @return void
	 */
	public function debug()
	
	/**
	 * 创建PDO对象,具体参数请参阅PHP的官方文档
	 * @param string $dsn  PDO配置参数
	 * @param string $username  数据库用户名
	 * @param stirng $password 数据库密码
	 * @param $driver_options  array PDO驱动相关的配置
	 */
	private function createPdo($dsn, $username, $password, $driver_options)

	/**
	 * 转换SQL语句
	 * 将表前缀转换与表名合并
	 * @param string $sql SQL语句
	 * @return string 合并后的SQL语句
	 */
	private function convertSql($sql)
}
?>
关键词:PDO MYSQL主从分离 执行SQL语句 加权随机选择数据库 数据库回调 SQL回调 PDO回调
阅读:2960 | 发布时间:2019-01-01 17:42