博客列表 >数据库操作pod类

数据库操作pod类

意外的博客
意外的博客原创
2019年05月12日 13:23:50821浏览
<?php
/**
 * 数据库工具类,采用pdo方式
 * 当前仅支持MySql
 */
class Db{

	public function __construct(){
		// 数据库连接池
		$this->pdo_list = [];
	}

	// 初始化pdo
	private function init($db){
		if(isset($this->pdo_list[$db]) && $this->pdo_list[$db]){
			$this->pdo = $this->pdo_list[$db];
			return;
		}
		// 数据库配置
		$dsn = "mysql:host=127.0.0.1;dbname=imqq";
		$this->pdo = new \PDO($dsn,'root','root');
		$this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
		$this->pdo_list[$db] = $this->pdo;
	}

	// 指定表名,支持多数据库
	public function table($table,$db='default'){
		$this->init($db);

		$this->table = $table;
		$this->field = '*';
		$this->order = '';
		$this->limit = 0;
		$this->where = [];

		$this->lastsql = '';
		$this->binds = [];
		return $this;
	}

	// 指定查询字段
	public function field($field='*'){
		$this->field = $field;
		return $this;
	}

	// 指定where条件,where支持数组、字符串
	public function where($where){
		$this->where = $where;
		return $this;
	}

	// 限制结果数量,$limit:整数
	public function limit($limit){
		$this->limit = $limit;
		return $this;
	}

	// 排序
	public function order($order=''){
		$this->order = $order;
		return $this;
	}

	// 查询一条记录
	public function item(){
		$sql = $this->build_sql('select').' limit 1';
        $stmt = $this->pdo->prepare($sql);
        $this->bindValue($stmt);
        $stmt->execute();
        $item = $stmt->fetchAll(\PDO::FETCH_ASSOC);
        return $item ? $item[0] : false;
	}

	// 查询列表
	public function lists(){
		$sql = $this->build_sql('select');
        $stmt = $this->pdo->prepare($sql);
        $this->bindValue($stmt);
        $stmt->execute();
        return $stmt->fetchAll(\PDO::FETCH_ASSOC);
	}

	// 自定义索引列表,$index:自定义索引的字符串
	public function cates($index){
		$result = [];
		$lists = $this->lists();
		if(!$lists){
			return $result;
		}
		foreach ($lists as $key => $value) {
			$result[$value[$index]] = $value;
		}
		return $result;
	}

	// 查询总数
	public function count(){
		$sql = $this->build_sql('count');
        $stmt = $this->pdo->prepare($sql);
        $this->bindValue($stmt);
        $stmt->execute();
        $total = $stmt->fetchColumn(0);
        return $total;
	}

	// 分页
	public function pages($page = 1,$pageSize = 10,$path=''){
		$this->limit = ($page-1)*$pageSize.','.$pageSize;
		$total = $this->count();
		$data = $this->lists();
		$pages = $this->_subPages($page,$pageSize,$total,$path);
		$result = array('total'=>$total,'data'=>$data,'page'=>$page,'pages'=>$pages);
		return $result;
	}

	// 添加记录$data数组
	public function insert($data){
		$sql = $this->build_sql('insert',$data);
		$this->sqls[] = $sql;
		$stmt = $this->pdo->prepare($sql);
		$this->bindValue($stmt,$data);
		$stmt->execute();
        return $this->pdo->lastInsertId();
	}

	// 修改记录$data数组
	public function update($data){
		$sql = $this->build_sql('update',$data);
		$stmt = $this->pdo->prepare($sql);
		$this->bindValue($stmt,$data);
        return $stmt->execute();
	}

	// 删除记录
	public function delete(){
		$sql = $this->build_sql('delete');
		$stmt = $this->pdo->prepare($sql);
		$this->bindValue($stmt);
		return $stmt->execute();
	}

	// 构造sql
	private function build_sql($type,$data = null){
		$sql = '';
		// query
		if($type == 'select'){
			$where = $this->_build_where();
			$sql = "SELECT {$this->field} FROM {$this->table}" . ($where ? " WHERE {$where}" : '');
			$this->order && $sql .= " order by {$this->order}";
			$this->limit && $sql .= " limit {$this->limit}";
		}
		// count
		if($type == 'count'){
			$where = $this->_build_where();
			$field = count(explode(',',$this->field))>1?'*':$this->field;
			$sql = "SELECT count({$field}) FROM {$this->table}" . ($where ? " WHERE {$where}" : '');
		}
		// insert
		if($type == 'insert'){
			$sql = $this->_build_insert($data);
		}
		// update
		if($type == 'update'){
			$sql = $this->_build_update($data);
		}
		// delete
		if($type == 'delete'){
			$sql = $this->_build_delete();
		}

		$this->lastsql = $sql;
		return $sql;
	}

	// 构造查询条件where
	private function _build_where(){
		$where = '';
		if(is_array($this->where)){
			foreach ($this->where as $key => $item) {
				$where .= " and `{$key}`=:{$key}";
			}
		}else{
			$where = $this->where;
		}
		$where = ltrim($where,' and');
		return $where;
	}

	// 构造添加数据sql
	private function _build_insert($data){
		if(!$data){
			return false;
		}
		$sql = "insert into {$this->table}";
		$fields = $values = [];
		foreach ($data as $key => $val) {
			$fields[] = '`'.$key.'`';
			$values[] = ":$key";
		}
		$sql .= ('('.implode(',',$fields).')values('.implode(',',$values).')');
		return $sql;
	}

	// 构造更新数据sql
	private function _build_update($data){
		$where = $this->_build_where();
		$str_update = '';
		foreach ($data as $key => $val) {
			$str_update .= ('`'.$key.'`=:'.$key.',');
		}
		$sql = "UPDATE {$this->table} SET {$str_update}";
		$sql = rtrim($sql,',');
		$sql .= ' WHERE '.$where;
		return $sql;
	}

	// 构造删除数据sql
	private function _build_delete(){
		$where = $this->_build_where();
		$sql = "DELETE {$this->table}" . ($where ? " WHERE {$where}" : '');
		return $sql;
	}

	// 参数绑定
	private function bindValue($stmt,$data = null){
		if($this->where && is_array($this->where)){
	        foreach($this->where as $key => $item){
	        	$stmt->bindValue(':'.$key,$item);
	        	$this->binds[$key] = $item;
	        }
    	}
    	if($data){
    		foreach ($data as $k => $value) {
    			$stmt->bindValue(':'.$k,$value);
    			$this->binds[$k] = $value;
    		}
    	}
	}

	// 获取最后执行的sql
	public function getlastsql(){
		if(!$this->lastsql){
			return '';
		}

		foreach ($this->binds as $key => $value) {
			$value = is_string($value) ? "'".$value."'" : $value;
			$this->lastsql = str_replace(':'.$key, $value, $this->lastsql);
		}
		echo $this->lastsql.'<br>';
	}

	// 构造分页(bootstrap风格)
	// cur_page:当前第几页
	private function _subPages($cur_page,$pageSize,$total=0,$path=''){
		$html = '';
		// 分页数
		$page_count = ceil($total / $pageSize);
		if($page_count == 1){
			return $html;
		}
		// path
		$symbol = '?';
		$is_and = strpos($path,'?');
		if($is_and !== false && $is_and >= 0){
			$symbol = '&';
		}

		// 添加“首页”
		if($cur_page>1){
			$pre_page = $cur_page-1;
			$html = "<li><a href='{$path}{$symbol}page=1'><span>首页</span></a></li>";
			$html .= "<li><a href='{$path}{$symbol}page={$pre_page}'><span>下一页</span></a></li>";
		}

		// 每次最多显示几页
		$max_page_limit = 6;
		// 当前页向前显示几页
		$cur_page_pre = (int)$max_page_limit/2;

		// 第一页
		$start = $cur_page > ($page_count - $max_page_limit) ? ($page_count - $max_page_limit) : $cur_page;
		// 最后一页
		$end = ($cur_page + $max_page_limit) >$page_count ? $page_count : ($cur_page + $max_page_limit);
		if($start - $cur_page_pre > 0){
			$start = $start - $cur_page_pre;
			$end = $end -$cur_page_pre;
		}
		if($cur_page+$cur_page_pre>=$end && $page_count>$max_page_limit){
			$start = $start + $cur_page_pre;
			$end = $end +$cur_page_pre;
		}

		$start = $start <= 0 ? 1 : $start;
		for($i=$start;$i<$end;$i++){
			$html .= $cur_page == $i ? "<li class='active'><a>{$i}</a></li>":"<li><a href='{$path}{$symbol}page={$i}'>{$i}</a></li>";
		}

		// 添加尾页
		if($cur_page<$page_count){
			$after_page = $cur_page+1;
			$html .= "<li><a href='{$path}{$symbol}page={$after_page}'>下一页</a></li>";
			$html = $html . "<li><a href='{$path}{$symbol}page={$page_count}'>尾页</a></li>";
		}

		$html =  '<ul class="pagination">'.$html.'</ul>';
		return $html;
	}
}


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议