美文网首页PHP经验分享
php数据库类Mysqli篇

php数据库类Mysqli篇

作者: 欧巴冰冰 | 来源:发表于2016-12-13 11:20 被阅读70次

    数据库查询类(1)

    
    <?php
    
    /**
     * @author [Demon] <508037051@qq.com>
     *
     * 数据库操作类采用Mysqli进行处理
     * 数据库操作分为:
     *          查询 支持 fields='id,name' 指定获取的字段
     *              查询列表 listInfo() 支持 page size 分页 返回一个列表数组
     *              查询详情 detailInfo() 返回一个数组详情
     *          修改 支持 fields='id,name' 指定获取的字段
     *              添加数据 updateInfo(); 参数没有id视为添加数据
     *              修改数据 updateInfo(); 参数有id视为修改数据
     *
     */
    
    // 操作实例
    /*
    // 查询
    D(ZDB::model('test')->detailInfo([ 'id' => 3 ,'fields' => 'id,name' ]));
    D(ZDB::model('test')->listInfo(['page'=>'1','size'=> '2', 'fields' => '*' ]));
    
    // 修改
    D(ZDB::model('test')->updateInfo(['name'=>'12312', 'fields' => '*' ]));
    D(ZDB::model('test')->updateInfo(['name'=> time() ,'id'=>'1', 'fields' => 'id,name' ]));
    
    die(' 数据库操作类实例结束 ');
     */
    
    /**
    * 数据库操作封装类
    */
    class ZDB extends DB
    {
        /** @var [type] [单例] */
        private static $instance;
    
        /** @var [type] [description] */
        public $tableName;
        /** @var [type] [description] */
        private $fields = [];
        /** @var [type] [description] */
        // private $where;
    
    
        /**
         * [model 加载模型对象]
         * @param  string $tableName [description]
         * @return [type]            [description]
         */
        public static function model($tableName = '')
        {
            return static::getModel($tableName);
        }
    
        /**
         * [getModel 获取单例对象]
         * @param  string $tableName [description]
         * @return [type]        [description]
         */
        public static function getModel( $tableName = '')
        {
            if(is_null(self::$instance))
            {
            }
            $argv = array
            (
                'host'     => 'xxxxx',
                'user'     => 'xxx',
                'password' => 'xxx',
                'port'     => 3306,
                'database' => 'xxx',
                'charset'  => 'utf8'
            );
            self::$instance = new static($argv);
            self::$instance->tableName = $tableName;
            self::$instance->getMeta();
    
            // D( self::$instance->tableName );
            return self::$instance;
        }
    
        /**
         * [updateData description]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function updateData( $params = [] )
        {
            $setStr = '';
            foreach ($params as $key => $value)
            {
                foreach ($this->fields as $field)
                {
                    if ( $field['field'] == $key)
                    {
                        $setStr .= "$key='$value', ";
                    }
                }
            }
    
            $setStr = rtrim($setStr,', ');
            $sql="update {$this->tableName} set {$setStr} WHERE id = {$params['id']}";
    
            $this->query($sql);
    
            $detailInfo = [];
            if ( $this->affected_rows > 0 )
            {
                $detailParams = [ 'id' => $params['id'] ];
                empty($params['fields']) OR $detailParams['fields'] = $params['fields'];
                $detailInfo = $this->detailInfo($detailParams);
            }
            return $detailInfo;
        }
    
        /**
         * [addData description]
         * @param array $params [description]
         */
        public function addData( $params = [] )
        {
            //拼接SQL语句
            $field_str='';
            $value_str='';
            foreach ($params as $key => $value)
            {
                foreach ($this->fields as $field)
                {
                    if ( $field['field'] == $key && $key != 'id' )
                    {
                        $field_str .= $this->escape($key).',';
                        $value_str .=  "'" . $this->escape($value) . "',";
                    }
                }
            }
            //
            //去掉最后一个逗号
            $field_str= rtrim($field_str,',');
            $value_str=  rtrim($value_str,',');
    
            //准备执行的SQL语句
            $sql="INSERT INTO {$this->tableName} ({$field_str}) VALUES ({$value_str})";
            $this->query($sql);
    
            $detailInfo = [];
            if ( $this->insert_id > 0 )
            {
                $detailParams = ['id' => $this->insert_id];
                empty($params['fields']) OR $detailParams['fields'] = $params['fields'];
                $detailInfo = $this->detailInfo($detailParams);
            }
            return $detailInfo;
        }
    
    
        /**
         * [getFields description]
         * @param  [type] $fields [description]
         * @return [type]         [description]
         */
        public function getFields( $fields )
        {
            // $arrField = '*';
            $arrField = [];
            $arrFields = is_string($fields) ? explode(',',$fields): $fields;
            foreach ($arrFields as $fieldName)
            {
                foreach ($this->fields as $field)
                {
                    if ( $field['field'] == $fieldName )
                    {
                        $arrField[] = $fieldName;
                    }
                }
            }
    
            return empty($arrField) ? '*' : rtrim(implode(',', $arrField),',') ;
        }
    
        /**
         * [updateInfo description]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function updateInfo( $params = [] )
        {
            $detailInfo = [];
            if (empty($params['id']))
            {
                $detailInfo = $this->addData($params);
            }
            else
            {
                $params['modifyTime'] = date('Y-m-d H:i:s',time());
                $detailInfo = $this->updateData($params);
            }
            return $detailInfo;
        }
    
        /**
         * [detailInfo description]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function detailInfo( $params = [] )
        {
            $detailInfo = [];
            if (!empty($params))
            {
                $params['size'] = 1;
                $listInfo = $this->listInfo($params);
                empty($listInfo[0]) OR $detailInfo = $listInfo[0];
            }
            return $detailInfo;
        }
    
    
        /**
         * [attributes description]
         * @return [type] [description]
         */
        public function attributes()
        {
            $fields = [];
            foreach ($this->fields as $key => $value)
            {
                $fields[$value['field']] = $value['content'];
            }
            return $fields;
        }
    
    
        /**
         * [arrCondition 特殊条件]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function arrCondition($params = [])
        {
            $attributes = $this->attributes();
            $arrCondition  = [];
            foreach ($params as $key => $value)
            {
                $arrKey = [];
    
                // startPosition search=古交
                $space =  ' ';
                if ( strpos($key,$space) !== FALSE ) //如果存在空格
                {
                    $arrKey = explode($space, $key);
                }
                // startPosition_search=古交
                else if ( stristr($key,'_search') !== FALSE ) //如果存在空格
                {
                    $arrKey = $arrKey = explode('_', $key);
                }
    
                if (count($arrKey) == 2)
                {
                    $arrKey[0] = trim( $arrKey[0] );
                    if (   array_key_exists(  $arrKey[0], $attributes )  &&  isset($value) )
                    {
                        // 'targetType <=' => 2
                        if( in_array($arrKey[1], ['<','>','>=','<=','=']) )
                        {
                            $arrCondition[] = " {$arrKey[0]} {$arrKey[1]} '{$value}' ";
                        }
                        // else if( $arrKey[1] === 'in' ) //$params[CRITERIA_KEY::WHERE]['id in'] = $targetID;
                        // {
                        //     $arrCondition[] = " {$arrKey[0]} {$arrKey[1]} {$value} ";
                        // }
                        // else if( $arrKey[1] === 'notin' )
                        // {
                        //     $arrCondition[] = " {$arrKey[0]} {$arrKey[1]} {$value} ";
                        // }
                        else if( $arrKey[1] === 'search' )
                        {
                            // sprintf('%s', trim($arrKey[1]);
                            $arrCondition[] = " {$arrKey[0]} like '%{$value}%'  ";
                        }
                    }
                }
            }
    
            return $arrCondition;
        }
    
        /**
         * [validParams 合法的参数]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function validParams($params = [])
        {
            $checkParams = [];
            if(!empty($params) && is_array($params) )foreach ($params as $key => $value)
            {
                foreach ($this->fields as $field)
                {
                    if ( $field['field'] == $key )
                    {
                        $checkParams[$key] = $value;
                    }
                }
            }
            return $checkParams;
        }
    
        /**
         * [arrCriteria 标准的=条件]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function arrCriteria($params = [])
        {
            !isset($params['status']) && $params['status'] = '1'; // 默认
            $arrCriteria = [];
    
            foreach ($params as $key => $value)
            {
                foreach ($this->fields as $field)
                {
                    if ( $field['field'] == $key )
                    {
                        $arrCriteria[] =  "{$key} = '" . $this->escape($value) . "'";
                    }
                }
            }
            return $arrCriteria;
        }
    
        /**
         * [getWhere description]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function where($params = [])
        {
            $arrCriteria = $this->arrCriteria($params);
            $arrCondition = $this->arrCondition($params);
            $arrWhere = array_merge($arrCriteria,$arrCondition);
            $condition='';
            if(!empty($arrWhere))
            {
                $condition = '  ' . implode(' and ',$arrWhere);
            }
            return $condition;
        }
    
    
        /**
         * [listInfo description]
         * @param  array  $params [description]
         * @return [type]         [description]
         */
        public function listInfo( $params = [] )
        {
            $where = $this->where($params);
            $where = empty($where) ? '': ' WHERE ' . $where;
            $fields = empty($params['fields']) ? '*' : $this->getFields( $params['fields'] );
            $page   = empty($params['page']) ? 1 : $params['page'] ;
            $size   = empty($params['size']) ? 10 : $params['size'] ;
            $order   = empty($params['order']) ? ' id DESC ' : $params['order'] ;
            // $size   = empty($params['size']) ? 3 : $params['size'] ;
            $offset = intval( $page-1 ) * $size ;
            $limit  = " ORDER BY {$order}  LIMIT {$offset}, {$size} ";
            if(!empty($params['_count']))
            {
                $fields = $params['_count'];
                $limit = '';
            }
            $sql    = "SELECT {$fields} FROM {$this->defaultDB}.{$this->tableName} {$where}  {$limit} ";
            $listInfo = $this->find( $sql );
            return $listInfo;
        }
    
        public function count( $params = [] )
        {
            $count = 0;
            $params['_count'] =  'count(id) as count ';
            $params['size'] = '1';
            $listInfo = $this->listInfo($params);
            empty($listInfo[0]['count']) OR $count = $listInfo[0]['count'];
            return $count;
        }
    
        //获取字段信息
        private function getMeta()
        {
            $sql = "SELECT column_name as field, column_comment as content FROM Information_schema.columns WHERE table_schema = '{$this->host_info->database}'AND table_Name = '{$this->tableName}'; ";
            $findList = $this->find($sql);
            // D($sql);
            // D($findList);
            // D($this);
            $this->fields = $findList;
            // D( $this->fields );
        }
    }
    class DB {
    
        protected $defaultDB = null;
        protected $link = null;
        protected $sql = null;
        protected $host_info = null;
        protected $bindValue = null;
        public $num_rows = 0;
        public $affected_rows = 0;
        public $insert_id = 0;
        public $queries = 0;
    
    
    
        protected function __construct() {
    
            if(func_num_args()) {
                $argv = func_get_arg(0);
                if(!empty($argv) && is_array($argv)) {
                    $this->connect($argv);
                    $argv['charset'] = isset($argv['charset']) ? $argv['charset'] : 'utf8';
                    $this->setCharset($argv['charset']);
                }
            }
    
        }
    
        public static $mysqli_connect = null;
        public function connect($argv, $charset = null) {
            if($this->link) return false;
            $argv = func_get_arg(0);
            $argv['port'] = isset($argv['port']) ? $argv['port'] : 3306;
            if(is_null(self::$mysqli_connect))
            {
                // D(12);
            }
            self::$mysqli_connect = mysqli_connect( $argv['host'], $argv['user'], $argv['password'], $argv['database'], $argv['port']);
    
            $this->link = self::$mysqli_connect;
            if(mysqli_connect_errno()) {
                echo mysqli_connect_error();
                exit(0);
            }
    
            $this->defaultDB = $argv['database'];
            $this->selectDB($this->defaultDB);
            $this->host_info = (object) $argv;
    
            if($charset) $this->setCharset($charset);
        }
    
        public function selectDB($database){
    
            $int = mysqli_select_db($this->link, $database);
            if($int) $this->defaultDB = $database;
            return $int;
    
        }
    
        public function query($sql) {
            // DD($this->link);
            // D($sql);
            $result = mysqli_query($this->link, $sql);
            if(mysqli_errno($this->link)) {
                echo mysqli_error($this->link);
                exit(0);
            }
    
            $this->queries++;
    
            if(preg_match('/^use\s+(\w+)/', $sql, $matches))
            list($range, $this->defaultDB) = $matches;
    
            if(!preg_match('/^select(.+)$/i', $sql)) {
                $this->affected_rows = mysqli_affected_rows($this->link);
            }else{
                $this->num_rows = mysqli_num_rows($result);
            }
    
            if(preg_match('/^insert(.+)$/i', $sql))
            $this->insert_id = mysqli_insert_id($this->link);
    
            return $result;
    
        }
    
    
        private $sqlLog;
    
        public function find($sql) {
            $this->sqlLog[] = $sql;
            // D( $this->sqlLog );
            $collection = array();
            $result = $this->query($sql);
            while($rows = mysqli_fetch_assoc($result))
            array_push($collection, $rows);
            mysqli_free_result($result);
            return $collection;
    
        }
    
    
        public function getSqlLog() {
    
            return $this->sqlLog;
        }
        public function setCharset($charset) {
    
            return mysqli_set_charset($this->link, $charset);
    
        }
    
        /*
        public function prepare($sql) {
    
            $this->sql = $sql;
    
        }
    
        public function bindValue($search, $value) {
    
            $this->bindValue = array();
            $this->bindValue[$search] = $value;
    
        }
    
        public function execute() {
    
            if(func_num_args()) {
                $argv = func_get_arg(0);
                if(!empty($argv) && is_array($argv)) {
                    if(!is_array($this->bindValue)) $this->bindValue = array();
                    $this->bindValue = array_merge($this->bindValue, $argv);
                }
            }
    
            if($this->bindValue) {
                foreach($this->bindValue as $search => $value) {
                    $this->sql = str_replace($search, $this->escape($value), $this->sql);
                }
                $this->bindValue = null;
            }
    
            $int = $this->query($this->sql);
            //$this->sql = null;
            return (boolean) $int;
        }*/
    
    
        /** [escape description] */
        public function escape($string)
        {
            return mysqli_real_escape_string($this->link, $string);
        }
    
        /** [close description] */
        public function close() {
    
            return mysqli_close($this->link);
    
        }
    
        /** [ping description] */
        public function ping() {
    
            return mysqli_ping($this->link);
    
        }
    
        /** [beginTransaction description] */
        public function beginTransaction($boolean) {
    
            return mysqli_autocommit($this->link, $boolean);
    
        }
    
        public function commit() {
    
            return mysqli_commit($this->link);
    
        }
    
        public function rollback() {
    
            return mysqli_rollback($this->link);
    
        }
    
        public function __destruct() {
    
            if($this->link) $this->close();
            unset($this->link, $this->defaultDB, $this->bindValue, $this->sql, $this->result, $this->num_rows, $this->affected_rows, $this->insert_id, $this->host_info);
    
        }
    
    }
    
    
    

    数据库查询类(2)

    
    
    
    <?php 
    
    
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASSWORD', '');
    define('DB_DATABASE', 'demo');
    define('DB_PORT', '3306');
    define('CHARSET', 'utf-8');
    
    
    // 打印变量  调试
    function D() {echo '<pre>'; print_r( func_get_args() ); echo '</pre>'; echo "<hr />"; }
    
    
    // 单例设计模式,只连接一次数据库
    class DBConnect 
    {
        private static $_instance = null;
        //私有构造函数,防止外界实例化对象
        // private function __construct() {}
        //私有克隆函数,防止外办克隆对象
        // private function __clone() {}
    
    
        //静态方法,单例统一访问入口
        public static function getInstance() 
        {
           if(is_null(self::$_instance))
            {
                // D('tableName');
                self::$_instance = mysqli_connect( DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE, DB_PORT );
            }
            return self::$_instance;
        }
    }
    
    
    class DBModel
    {
        // 成员属性
        private $sqlCache;
        private $tableName;
        private $connect;
        private $tableColumn;
    
        // 初始化对象
        public function __construct( $tableName = '')
        {
            // 连接数据库
            $this->tableName = $tableName;
            $this->connect = DBConnect::getInstance();
            mysqli_set_charset($this->connect, CHARSET); 
            $this->tableColumn = $this->getTableColumn($this->tableName);
            $this->sqlCache = [];
        }
    
    
        // 获取列表
        public function getList($params = [])
        {
            $listInfo = [];
    
            // 默认查询列表
            $sql = " SELECT * FROM {$this->tableName}  ";
            $sql .= $this->getWhere($params);
            
            $order = empty($params['order']) ? ' id desc ' : $params['order'];
            $sql .= " ORDER BY {$order} ";
            // 分页参数
            $page = empty($params['page']) ? 1 : $params['page'];
            $size = empty($params['size']) ? 10 : $params['size'];
    
            // 当前页码 - 1  乘以 显示的条数  例:limit  0,5
            $page = ($page - 1) * $size;
            $sql .= " limit {$page},$size ";
    
            if(isset($this->sqlCache[$sql]))
            {
                $listInfo = $this->sqlCache[$sql];
            }
            else
            {
                $result = $this->mysqliQuery($sql);
                // 查看贴子列表
                $listInfo = array();
                while($rows = mysqli_fetch_assoc($result))
                {
                    $listInfo[] = $rows;
                }
                $this->sqlCache[$sql] = $listInfo;
            }
            // D($this->sqlCache);
            return $listInfo;
        }
    
        // 获取详情
        public function getDetail($params = [])
        {
            $getDetail = [];
            $list = $this->getList($params);
            if(!empty($list[0]))
            {
                $getDetail = $list[0];
            }
            return $getDetail;
        }
    
        // 修改数据 params 必须包含ID
        public function update($params = [])
        {
            $detail = [];
            $column = $this->getColumn($params);
            if(!empty($column['id']))
            {
                // UPDATE `demo`.`user` SET `name`='33', `age`='22' WHERE `id`='6';
                $sql = " UPDATE  {$this->tableName}  SET ";
    
                $field = '';
                foreach ($column as $key => $value) 
                {
                    $field .= " `{$key}` = '{$value}',";
                }
    
                $field = trim($field, ',');
                $sql .= $field;
                $sql .= " WHERE id = {$column['id']} ";
                $result = $this->mysqliQuery($sql);
                $rows  = mysqli_affected_rows($this->connect);
                // var_dump($rows);
                if(!empty($rows))
                {
                    $detail = $this->getDetail(['id' => $column['id'] ]);
                }
            }
            return $detail;
        }
    
        // 添加数据
        public function addInfo($params = [])
        {
            $detail = [];
    
            $column = $this->getColumn($params);
            $sql = " INSERT INTO  {$this->tableName} ";
            // INSERT INTO `demo`.`user` (`name`, `age`) VALUES ('1', '2');
    
            $keys = '';
            $values = '';
            foreach ($column as $key => $value) 
            {
                $keys .= "`{$key}`,";
                $values .= "'{$value}',";
            }
            $keys = trim($keys, ',');
            $values = trim($values, ',');
    
            $sql.= " ($keys) ";
            $sql.= ' VALUES ';
            $sql.= " ($values) ";
    
            // 执行添加
            $result = $this->mysqliQuery($sql);
    
            // D($column);
            // D($keys);
            // D($values);
            // D($sql);
            // var_dump($result);
    
            if( $result=== true )
            {
                $insertID = mysqli_insert_id($this->connect); 
                $detail = $this->getDetail(['id' => $insertID]);
            }
    
            return $detail;
        }
    
        // 删除数据 params 必须有ID
        public function delete($params = [])
        {
            $rows = 0;
            if(!empty($params['id']))
            {
                $sql = " DELETE FROM {$this->tableName}  WHERE `id`='{$params['id']}' ";
                $result = $this->mysqliQuery($sql);
                $rows  = mysqli_affected_rows($this->connect);
            }
            return $rows;
        }
    
        // 查询数据
        public function mysqliQuery( $sql = '' )
        {
            D($sql);
            $result =  mysqli_query($this->connect, $sql);
            return $result;
        }
    
        // 组装有效的where
        public function getWhere( $params =  [] )
        {
            $strWhere = [];
            
            $column = $this->getColumn($params);
            foreach ($column as $key => $value) 
            {
                $strWhere[] = " {$key} =  '{$value}' ";
            }
    
            $strWhere = implode(' AND ', $strWhere);
    
            foreach ($params as $key => $value) 
            {
                if(is_int($key))
                {
                    $strWhere .= $value;
                }
            }
            if(!empty($strWhere))
            {
                $strWhere = " WHERE {$strWhere} ";
            }
            // D($params);
            // D($column);
            return $strWhere;
        }
    
        // 获取表的列字段
        public function getTableColumn($tableName = '')
        {
            $listTableColumn = [];
            $sql = " desc {$tableName}";
            
            $result = $this->mysqliQuery($sql);
            // 查看贴子列表
            $tableColumn = array();
            while($rows = mysqli_fetch_assoc($result))
            {
    
                $tableColumn[$rows['Field']] = $rows;
            }
    
            return $tableColumn;
        }
        // 获取参数的有效字段
        public function getColumn( $params =  [] )
        {
            $column = [];
            foreach ($params as $key => $value) 
            {
                if(isset($this->tableColumn[$key]))
                {
                    $column[$key] = $value;
                }
            }
            return $column;
        }   
    
    }
    
    // 实例化对象
    // $userModel = new DBModel('user');
    
    // 参数
    // $params = [];
    // 等值查询
    // $params['id']  = '5';
    // 特殊查询
    // $params[]  = '  name like "%c%" ';
    // 无效字段
    // $params['xxxx']  = '213';
    // 获取列表
    // $userList = $userModel->getList($params);
    // D($userList);
    
    // 获取详情
    // $detail = $userModel->getDetail($params);
    // $detail = $userModel->getDetail($params);
    // $detail = $userModel->getDetail($params);
    // D($detail);
    // D($userModel);
    
    // 添加数据
    // $addInfo = [];  // 添加的参数
    // $addInfo['name'] = 'opp';
    // $addInfo['age'] = '2';
    // $addInfo['username'] = 'opp';
    // $addInfo['avatar'] = 'opp';
    // $addInfo = $userModel->addInfo($addInfo);
    // D($addInfo);
    
    // $update = [];
    // $update['id'] = 6;
    // $update['name'] = '12312';
    // $update = $userModel->update($update);
    // D($update);
    
    /*$delete = [];
    $delete['id'] = 10;
    $delete = $userModel->delete($delete);
    var_dump($delete);*/
    
    
    // 单例测试
    $userModel = new DBModel('user');
    
    $params = [];
    $params['page'] = 2;
    // $params['order'] = ' age desc ';
    $params['size'] = 5;
    $list = $userModel->getList($params);
    D($list);
    
    
    

    __以上两例代码是业余时间写的,,有些许不完美的情况有待各位读者尽力完善
    适合初学者和想熟悉其它框架数据库的同学。
    以上代码修改下数据库配置信息,可以很方便的使用去一些小功能哦
    感觉不错的,记得给个喜欢哦 :)🙃 __


    相关文章

      网友评论

        本文标题:php数据库类Mysqli篇

        本文链接:https://www.haomeiwen.com/subject/zhnvmttx.html