<?php
/**
* 数据库操作基类,继承后即可使用数据库操作相关的函数
* 查询函数,query、queryWithTotal、one、detail、countNum
* 操作函数,insert、insertMulit、replace、replaceMulti、update、delete、incr
* 事务函数,startTransct、commitTransact、rollbackTransact
* 配置函数,setDbType、setDbName、setTable、setField
*/
namespace app\lib\db;
class DbBase {
const NO_ERROR = 0;
const ERROR_COMMON = 1;
/**
* 数据库连接
* @var resource
*/
protected $_dbLink;
/**
* 数据库类型
* @var string
*/
protected $_dbType = 'mysql';
/**
* 数据库配置信息
* @var array
*/
protected $_dbConfig = array();
/**
* 数据库名称
* @var string
*/
protected $_dbName;
/**
* 表名
* @var string
*/
protected $_tableName;
/**
* 字段
* @var string
*/
protected $_fields = array();
public function __construct($dbName = '', $tableName = '', $dbType = '', $dbConfig = array())
{
if ( $dbName ) {
$this->_dbName = $dbName;
}
if ( $tableName ) {
$this->_tableName = $tableName;
}
if ( $dbType ) {
$this->_dbType = $dbType;
}
if ( $dbConfig ) {
$this->_dbConfig = $dbConfig;
}
$this->init();
}
public function init()
{
$this->_dbLink = DbTool::getInstance($this->_dbName, $this->_dbType, $this->_dbConfig);
$this->_dbLink->select_db($this->_dbName);
}
public function setDbType($dbType)
{
if ( $dbType ) {
$this->_dbType = $dbType;
}
}
public function setDbName($dbName)
{
if ( $dbName ) {
$this->_dbName = $dbName;
}
}
public function setTable($tableName)
{
if ( $tableName ) {
$this->_tableName = $tableName;
}
}
public function getTable()
{
return $this->_tableName;
}
public function setField($fields = array())
{
if ( !empty($fields) ) {
$this->_fields = $fields;
}
}
public function getField()
{
return $this->_fields;
}
/**
* 事务 - 开启
*/
public function startTransct()
{
$this->_dbLink->start_transaction();
}
/**
* 事务 - 提交
*/
public function commitTransact()
{
$this->_dbLink->commit();
}
/**
* 事务 - 回滚
*/
public function rollbackTransact()
{
$this->_dbLink->rollback();
}
/**
* 查询数据
* @param array $param 查询条件,条件数组或者条件SQL
* @param string $order 排序规则
* @param string $limit 获取条数
* @param string $field 查询的列,默认为*
* @param string $group 分组规则
* @return array 数据列表
*/
public function query($param = array(), $order = false, $limit = false, $field = '*', $group = false)
{
$str_where = $this->_assembleWhere($param);
if ( $group ) {
$str_where .= (preg_match('/group\s+by/i', $order) ? '' : ' group by ') . $this->escape($group);
}
if ( $order ) {
$str_where .= (preg_match('/order\s+by/i', $order) ? '' : ' order by ') . $this->escape($order);
}
if ( $limit ) {
$str_where .= (preg_match('/limit\s*/i', $order) ? '' : ' limit ') . $this->escape($limit);
}
$sql = 'select ' . $this->escape($field) . ' from ' . $this->escape($this->_tableName) . ' ' . $str_where;
$query = $this->_dbLink->query($sql);
$arr_data = array();
if ( !$this->_dbLink->errno() ) {
if ( $this->_dbLink->num_rows($query) ) {
while ($data = $this->_dbLink->fetch_assoc($query)) {
$arr_data[] = $data;
}
}
}
return $this->initReturn($this->_dbLink->errno() ? self::ERROR_COMMON : self::NO_ERROR, $this->_dbLink->errno(), $this->_dbLink->errno() ? $this->_dbLink->error() : $arr_data);
}
/**
* 查询数据,并返回值总数
* @param array $param 查询条件,条件数组或者条件SQL
* @param string $order 排序规则
* @param string $limit 获取条数
* @param string $field 查询的列,默认为*
* @param string $group 分组规则
* @return array(
* 'total' => ''(总数),
* 'data' => ''(数据列表),
* )
*/
public function queryWithTotal($param , $order = false , $limit = false , $field = '*', $group = false)
{
$resultTotal = $this->countNum($param);
if ( $resultTotal['state'] ) {
return $resultTotal;
}
$resultQuery = $this->query($param , $order , $limit , $field, $group);
if ( $resultQuery['state'] ) {
return $resultQuery;
}
$result = array(
'total' => $resultTotal['data'],
'data' => $resultQuery['data']
);
return $this->initReturn(self::NO_ERROR, '', $result);
}
/**
* 查询一条数据
* @param array $param 查询条件,条件数组或者条件SQL
* @param string $order 排序规则
* @param string $field 查询的列,默认为*
* @param string $group 分组规则
* @return array 数据
*/
public function one($param, $order = false, $field = '*', $group = false)
{
$result = $this->query($param , $order , '0,1' , $field , $group);
if ( !$result['state'] ) {
$result['data'] = $this->arrayValue(0 , $result['data'] , array());
}
return $result;
}
/**
* 查询一条数据
* @param array $param 查询条件,条件数组或者条件SQL
* @param string $field 查询的列,默认为*
* @return array 数据
*/
public function detail($param, $field = '*')
{
return $this->one($param , false , $field);
}
/**
* 查询数量
* @param array $param 查询条件,条件数组或者条件SQL
* @return integer 数量
*/
public function countNum($param = array())
{
$result = $this->detail($param , 'count(1) num');
if ( !$result['state'] ) {
$result['data'] = $this->arrayValue('num' , $result['data'] , 0);
}
return $result;
}
/**
* 插入一条数据
* @param array $data 插入的数据
* array(
* '{fieldName1}' => '',
* '{fieldName2}' => ''
* )
* @return array(
* 'state' => 0(0成功,其他错误码),
* 'errorCode' => '',
* 'data' => ''(成功返回插入的ID,失败返回错误信息)
* )
*/
public function insert($data)
{
return $this->_insert($data);
}
/**
* 插入一条数据(如果主键已存在,进行update)
* @param array $data 插入的数据
* array(
* '{fieldName1}' => '',
* '{fieldName2}' => ''
* )
* @return array(
* 'state' => 0(0成功,其他错误码),
* 'errorCode' => '',
* 'data' => ''(成功返回插入的ID,失败返回错误信息)
* )
*/
public function replace($data)
{
return $this->_insert($data, true);
}
/**
* 插入多条数据
* @param array $data 插入的数据
* array(
* array(
* '{fieldName1}' => '',
* '{fieldName2}' => ''
* )
* )
* @return array(
* 'state' => 0(0成功,其他错误码),
* 'errorCode' => '',
* 'data' => ''(失败返回错误信息)
* )
*/
public function insertMulti($arr_data)
{
return $this->_insertMulti($arr_data);
}
/**
* 插入多条数据(如果主键已存在,进行update)
* @param array $data 插入的数据
* array(
* array(
* '{fieldName1}' => '',
* '{fieldName2}' => ''
* )
* )
* @return array(
* 'state' => 0(0成功,其他错误码),
* 'errorCode' => '',
* 'data' => ''(失败返回错误信息)
* )
*/
public function replaceMulti($arr_data)
{
return $this->_insertMulti($arr_data, true);
}
protected function _insert($data, $isReplace = false)
{
$sql = $this->_assembleInsert(array($data), $isReplace);
$this->_dbLink->query($sql);
return $this->initReturn($this->_dbLink->errno() ? self::ERROR_COMMON : self::NO_ERROR, $this->_db