Blogger Information
Blog 38
fans 0
comment 3
visits 43822
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
数据库操作pod类
意外的博客
Original
815 people have browsed it
<?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;
	}
}


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post