MySQL数据库操作类,PHP实现,支持连贯操作

  1 <?php
  2 /**
  3  * Author: suvan
  4  * CreateTime: 2018/2/27
  5  * description: 数据库操作类(仅对接MySQL数据库,主要利用MySQLi函数)
  6  */
  7 class Database{
  8 
  9     //MySQL主机地址
 10     private $_host;
 11     //MySQL用户名
 12     private $_user;
 13     //MySQL用户密码
 14     private $_password;
 15     //指定数据库名称
 16     private $_database;
 17     //MySQL数据库端口号
 18     private $_port;
 19     private $_socket;
 20     //当前数据库对象
 21     private $_dbObj;
 22     //数据库表
 23     private $_table;
 24     //数据库表对象
 25     private $_tableObj;
 26     // 最近错误信息
 27     protected $error            =   '';
 28     // 数据信息
 29     protected $data             =   array();
 30     // 查询表达式参数
 31     protected $options          =   array();
 32     protected $_validate        =   array();  // 自动验证定义
 33     protected $_auto            =   array();  // 自动完成定义
 34     protected $_map             =   array();  // 字段映射定义
 35     protected $_scope           =   array();  // 命名范围定义
 36     // 链操作方法列表
 37     protected $methods          =   array('strict','order','alias','having','group','lock','distinct','auto','filter','validate','result','token','index','force');
 38 
 39     /**
 40      * Database类初始化函数
 41      * 取得DB类的实例对象 字段检查
 42      * @access public
 43      * @param string $host MySQL数据库主机名
 44      * @param string $user MySQL数据库用户名
 45      * @param string $password MySQL数据库密码
 46      * @param string $database 指定操作的数据库
 47      * @return mixed  数据库连接信息、错误信息
 48      */
 49     public function __construct($host,$user,$passowrd,$database,$port=3306){
 50         $this->_initialize();
 51         if(!isset($host)||!isset($user)||!isset($passowrd)||!isset($database)){
 52             return false;
 53         }else{
 54             $this->_host     = $host;
 55             $this->_user     = $user;
 56             $this->_password = $passowrd;
 57             $this->_database = $database;
 58             $this->_port     = $port;
 59             $_dbObj = new mysqli($host,$user,$passowrd,$database,$port);
 60             if($_dbObj->connect_errno){
 61                 $this->error = $_dbObj->connect_error;
 62                 return false;
 63             }else{
 64                 $this->_dbObj = $_dbObj;
 65                 return $this;
 66             }
 67         }
 68     }
 69     /**
 70      * 错误信息函数
 71      * 返回数据库操作过程中最后一次执行时的错误信息
 72      * @access public
 73      * @return mixed  数据库连接错误信息(正常返回'')
 74      */
 75     public function error(){
 76         return $this->error;
 77     }
 78     // 回调方法 初始化模型
 79     protected function _initialize() {}
 80     /**
 81      * 设置数据对象的值
 82      * @access public
 83      * @param string $name 名称
 84      * @param mixed $value 值
 85      * @return void
 86      */
 87     public function __set($name,$value) {
 88         // 设置数据对象属性
 89         $this->data[$name] = $value;
 90     }
 91 
 92     /**
 93      * 获取数据对象的值
 94      * @access public
 95      * @param string $name 名称
 96      * @return mixed
 97      */
 98     public function __get($name) {
 99         return isset($this->data[$name])?$this->data[$name]:null;
100     }
101 
102     /**
103      * 检测数据对象的值
104      * @access public
105      * @param string $name 名称
106      * @return boolean
107      */
108     public function __isset($name) {
109         return isset($this->data[$name]);
110     }
111 
112     /**
113      * 销毁数据对象的值
114      * @access public
115      * @param string $name 名称
116      * @return void
117      */
118     public function __unset($name) {
119         unset($this->data[$name]);
120     }
121     /**
122      * 利用__call方法实现一些特殊的方法(对于调用类中不存在方法的解决方案)
123      * @access public
124      * @param string $method 方法名称
125      * @param array $args 调用参数
126      * @return mixed
127      */
128     public function __call($method,$args) {
129         /*if(in_array(strtolower($method),$this->methods,true)) {
130             // 连贯操作的实现
131             $this->options[strtolower($method)] =   $args[0];
132             return $this;
133         }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){
134             // 统计查询的实现
135             $field =  isset($args[0])?$args[0]:'*';
136             return ;
137         }elseif(strtolower(substr($method,0,5))=='getby') {
138             // 根据某个字段获取记录
139             $field   =   parse_name(substr($method,5));
140             $where[$field] =  $args[0];
141             return ;
142         }elseif(strtolower(substr($method,0,10))=='getfieldby') {
143             // 根据某个字段获取记录的某个值
144             $name   =   parse_name(substr($method,10));
145             $where[$name] =$args[0];
146             return ;
147         }elseif(isset($this->_scope[$method])){// 命名范围的单独调用支持
148             return ;
149         }else{
150 
151         }*/
152     }
153     /*
154      * 选择数据库
155      * @access public
156      * @param string $database 选择的数据库名称
157      * @return mixed 数据库连接信息
158      * */
159     public function select_db($database){
160         $select_db = mysqli_select_db($this->_dbObj,$database);
161         if($select_db){
162             $this->_database = $database;
163             $_dbObj = new mysqli($this->_host,$this->_user,$this->_password,$database,$this->_port);
164             $this->_dbObj = $_dbObj;
165             return $this;
166         }else{
167             $this->error = mysqli_error($this->_dbObj);
168             return false;
169         }
170     }
171     /*
172      * 数据库用户更换
173      * @access public
174      * @param string $user 数据库用户名称
175      * @param string $password 数据库用户密码
176      * @return mixed 数据库连接信息
177      * */
178     public function change_user($user,$password){
179         $change_user = mysqli_change_user($this->_dbObj,$user,$password,$this->_database);
180         if($change_user){
181             $this->_user = $user;
182             $this->_password = $password;
183             $_dbObj = new mysqli($this->_host,$this->_user,$this->_password,$this->_database,$this->_port);
184             $this->_dbObj = $_dbObj;
185             return $this;
186         }else{
187             $this->error = mysqli_error($this->_dbObj);
188             return false;
189         }
190     }
191     /*
192      * 查询数据库中所有的表名
193      * @access public
194      * @return array 数据表的数量和表名
195      * */
196     public function tables(){
197         $sql = 'show tables';
198         $search_res = mysqli_query($this->_dbObj,$sql);
199         if($search_res){
200             $num_rows = $search_res->num_rows;
201             $tables_msg = array(
202                 'count'=>$num_rows,
203                 'tables'=>array()
204             );
205             for($i=0;$i<$num_rows;$i++){
206                 $row = $search_res->fetch_assoc();
207                 $key = 'Tables_in_'.$this->_database;
208                 array_push($tables_msg['tables'],$row[$key]);
209             }
210             mysqli_free_result($search_res);
211             return $tables_msg;
212         }else{
213             mysqli_free_result($search_res);
214             return false;
215         }
216     }
217     /*
218      * 获取指定表中所有信息
219      * @access public
220      * @param string $table 数据表名称
221      * @return array 数据表的详细信息
222      * */
223     public function select_table($table){
224         $sql = 'select * from '.$table;
225         $search_res = mysqli_query($this->_dbObj,$sql);
226         if($search_res){
227             $this->_table = $table;
228             $table_msg = self::query_handle($search_res);
229             $this->_tableObj = $table_msg;
230             mysqli_free_result($search_res);
231             return $table_msg;
232         }else{
233             mysqli_free_result($search_res);
234             return false;
235         }
236     }
237     /*
238      * 获取指定表的字段详细信息
239      * @access public
240      * @param string $table 数据表名称
241      * @return array 数据表的字段详细信息
242      * */
243     public function select_table_fields($table){
244         $sql = 'show fields from '.$table;
245         $search_res = mysqli_query($this->_dbObj,$sql);
246         if($search_res){
247             $this->_table = $table;
248             $fields_msg = self::query_handle($search_res);
249             mysqli_free_result($search_res);
250             return $fields_msg;
251         }else{
252             mysqli_free_result($search_res);
253             return false;
254         }
255     }
256     /*
257      * 获取数据表中指定字段信息(允许多字段同时查询)
258      * @access public
259      * @param mixed $field 指定字段(字符串传入使用,间隔)
260      * @return array 数据表中指定字段信息
261      * */
262     public function getField($field){
263         $fields = self::param_handle($field);
264         $count = count($fields);
265         for($i=0;$i<$count;$i++){
266             $index = $fields[$i];
267             $sql = 'select '.$index.' from '.$this->_table;
268             $res = mysqli_query($this->_dbObj,$sql);
269             $field_msg[$index] = self::query_handle($res);
270         }
271         return $field_msg;
272     }
273     /*
274      * mysqli_query函数结果处理函数
275      * @access protected
276      * @param object $obj mysqli_query函数结果
277      * @return array 数据表中指定字段信息
278      * */
279     protected function query_handle($obj){
280         $res = array();
281         for($i=0;$i<$obj->num_rows;$i++){
282             $row = $obj->fetch_assoc();
283             array_push($res,$row);
284         }
285         return $res;
286     }
287     /*
288      * 传入参数处理函数
289      * @access protected
290      * @param mixed $param 传入参数
291      * @return array 处理后数组数据
292      * */
293     public function param_handle($param){
294         if(is_string($param)&&!empty($param)){
295             $params = explode(',',$param);
296         }elseif(is_array($param)&&!empty($param)){
297             $params = $param;
298         }else{
299             return false;
300         }
301         return $params;
302     }
303     /*
304      * 查询表达式参数处理函数
305      * @access protected
306      * @param mixed $param 传入参数(where limit order)
307      * @return string 处理后字符串数据
308      * */
309     public function options_handle($param){
310         if(is_numeric($param)){
311             $option = $param;
312         }elseif(is_string($param)&&!empty($param)&&!is_numeric($param)){
313             $params = explode(',',$param);
314             $count = count($params);
315             $option = implode(' and ',$params);
316         }elseif(is_array($param)&&!empty($param)){
317             $params = $param;
318             $count = count($params);
319             $arr = array();
320             foreach($param as $key=>$value){
321                 $tip = "$key=$value ";
322                 array_push($arr,$tip);
323             }
324             $option = implode(' and ',$arr);
325         }else{
326             return false;
327         }
328         return $option;
329     }
330     /*
331      * 查询表达式$options处理函数
332      * @access protected
333      * @return string 处理后字符串数据
334      * */
335     protected function option(){
336         $options = $this->options;
337         $option = '';
338         if(isset($options['where'])){
339             $option .= 'where '.$options['where'].' ';
340         }
341         if(isset($options['order'])){
342             $option .= 'order by '.$options['order'].' '.$options['order_type'].' ';
343         }
344         if(isset($options['limit'])){
345             $option .= 'limit '.$options['limit'];
346         }
347         return $option;
348     }
349     /*
350      * 根据查询表达式查询数据(符合条件的所有记录)
351      * @access public
352      * @return array 满足查询表达式的特定数据
353      * */
354     public function find(){
355         $option = self::option();
356         $sql = 'select * from '.$this->_table.' '.$option;
357         $search_res = mysqli_query($this->_dbObj,$sql);
358         $msg = self::query_handle($search_res);
359         return $msg;
360     }
361     /*
362      * 查询表达式 where处理函数
363      * @access public
364      * @param mixed $where where查询条件
365      * @return object $this
366      * */
367     public function where($where){
368         $this->options['where'] = self::options_handle($where);
369         return $this;
370     }
371     /*
372      * 查询表达式 limit处理函数
373      * @access public
374      * @param mixed $limit limit查询条件(数字)
375      * @return object $this
376      * */
377     public function limit($limit){
378         $this->options['limit'] = self::options_handle($limit);
379         return $this;
380     }
381     /*
382      * 查询表达式 order处理函数
383      * @access public
384      * @param string $order order查询条件
385      * @param string $type order查询条件的顺序(默认降序)
386      * @return object $this
387      * */
388     public function order($order,$type='desc'){
389         $this->options['order'] = $order;
390         $this->options['order_type'] = $type;
391         return $this;
392     }
393     /*
394      * 数据处理函数(最多处理二维数据)
395      * @access public
396      * @param array $data 需要插入的数据
397      * @return object $this
398      * */
399     public function data(array $data){
400         $values = array();
401         $fields = array();
402         if(is_array($data)){
403             foreach($data as $key=>$value){
404                 if(is_array($value)){       //二维数组
405                     $tip = 1;
406                     array_push($values,'('.implode(',',array_values($value)).')');
407                     array_push($fields,'('.implode(',',array_keys($value)).')');
408                 }else{      //一维数组
409                     $tip = 0;
410                 }
411             }
412         }else{
413             return false;
414         }
415         if(!$tip){
416             array_push($values,'('.implode(',',array_values($data)).')');
417             array_push($fields,'('.implode(',',array_keys($data)).')');
418         }
419         $this->data['fields'] = $fields[0];
420         $this->data['values'] = implode(',',$values);
421         return $this;
422     }
423     /*
424      * 数据新增函数
425      * @access public
426      * @return mixed 数据库新增信息
427      * */
428     public function add(){
429         $fields = $this->data['fields'];
430         $values = $this->data['values'];
431         $sql = 'INSERT INTO '.$this->_table.$fields.'VALUES'.$values;
432         $res = mysqli_query($this->_dbObj,$sql);
433         return $res;
434     }
435     /*
436      * 数据更新函数(一维数组)
437      * @access public
438      * @param array $data 需要更新的数据
439      * @return mixed 数据库新增信息
440      * */
441     function save(array $data){
442         $tip = array();
443         if(is_array($data)){
444             foreach($data as $key=>$value){
445                 array_push($tip,"$key=$value");
446             }
447         }else{
448             return false;
449         }
450         $set_msg = implode(',',$tip);
451         $sql = 'UPDATE '.$this->_table.' SET '.$set_msg.' WHERE '.$this->options['where'];
452         $res = mysqli_query($this->_dbObj,$sql);
453         return $res;
454     }
455     /*
456      * 数据删除函数
457      * @access public
458      * @return mixed 数据库删除信息
459      * */
460     public function delete(){
461         $sql = 'DELETE FROM '.$this->_table.' WHERE '.$this->options['where'];
462         $res = mysqli_query($this->_dbObj,$sql);
463         return $res;
464     }
465     /*
466      * SQL语句查询
467      * */
468     public function query($sql){
469         $search_res = mysqli_query($this->_dbObj,$sql);
470         return $search_res;
471     }
472     /*
473      * mysql中查询语句
474      * */
475     protected function sql(){
476         /*
477          * 基本SQL语句
478          * 插入数据:INSERT INTO tb_name(id,name,score)VALUES(NULL,'张三',140),(NULL,'张四',178),(NULL,'张五',134);
479          * 更新语句:UPDATE tb_name SET score=189 WHERE id=2;
480          * 删除数据:DELETE FROM tb_name WHERE id=3;
481          * WHERE语句:SELECT * FROM tb_name WHERE id=3;
482          * HAVING 语句:SELECT * FROM tb_name GROUP BY score HAVING count(*)>2
483          * 相关条件控制符:=、>、<、<>、IN(1,2,3......)、BETWEEN a AND b、NOT AND 、OR Linke()用法中      %  为匹配任意、  _  匹配一个字符(可以是汉字)IS NULL 空值检测
484          * MySQL的正则表达式:SELECT * FROM tb_name WHERE name REGEXP '^[A-D]'   //找出以A-D 为开头的name
485          * */
486     }
487     /*
488      * 关闭连接
489      * */
490     public function close(){
491         $close = mysqli_close($this->_dbObj);
492         if($close){
493             return true;
494         }else{
495             return false;
496         }
497     }
498     function __destruct(){
499         mysqli_close($this->_dbObj);
500     }
501 }

  使用示例

  1 include '/classes/db.php';
  2             $db = new \Database('localhost', 'root', '901230', 'weixin');
  3             //$db = new \mysqli('localhost','root','901230','weixin');
  4             //$db->select_db('visitor');
  5             //dump($db->error());
  6             //$db->change_user('helen','901230');
  7             $table = 'zyd_fuweng_user';
  8             //dump($db->select_table_fields($table));
  9             //dump($db->error());
 10             $db->select_table($table);
 11             $param1 = '123';
 12             $param2 = 'id>1,record>100';
 13             $param3 = array(
 14                 /*array('count'=>1,'openid'=>'123','record'=>'100'),
 15                 array('count'=>2,'openid'=>'234','record'=>'200'),*/
 16                 array('count' => 4, 'openid' => '456', 'record' => '500')
 17             );
 18             $param4 = array('count' => 4, 'openid' => '456', 'record' => '500');
 19             //dump($db->where(')->save($param4));
 20             dump($db->where('count=4')->delete());
 21 
 22             die;
 23             dump($db->data($param3)->add());
 24             dump(array_keys($param3));
 25             dump(array_values($param3));
 26             dump(implode(',', array_values($param3)));
 27             dump(implode(',', array_keys($param3)));
 28 
 29             dump($db->where($param2)->order('id')->limit(2)->find());
 30             dump($db->options_handle($param1));
 31             dump($db->options_handle($param2));
 32             dump($db->options_handle($param3));
 33             $array = array('id', 'count');
 34 
 35             $num = '123';
 36             if (is_string($num)) {
 37                 echo 'true';
 38             }
 39 
 40             dump($db->getField($array));
 41             dump($db->select_table_fields($table));
 42             /*$array = array('a','b');
 43             $array1 = array();
 44             dump($db->getField('a,b'));
 45             dump($db->getField($array));
 46             dump($db->getField($array1));
 47             dump($db->getField(''));*/
 48             /*$str = '';
 49             if(empty($str)){
 50                 echo 'true';
 51             }*/
 52             /*$model = M('zyd_fuweng_user');
 53             $res = $model->getField('create_time,count');
 54             dump($res);*/
 55             die;
 56             //
 57             $table = 'zyd_fuweng_user';
 58             //选择指定的数据库,并返回其中全部信息
 59             $table_msg = $db->select_table($table);
 60             //选择指定数据库,返回数据库的字段信息
 61             $table_field_msg = $db->select_table_fields($table);
 62             //条件搜索,传入条件均为数据
 63             $where = array(
 64                 'id' => 1
 65             );
 66             $data = array(
 67                 'headimgurl' => 'helen.jpg'
 68             );
 69             dump($db->where($where)->field('field'));
 70             dump($table);
 71 
 72 
 73             /*$dbObj = new \mysqli('localhost','helen','901230','weixin','3306');
 74             //$query = 'select * from zyd_fuweng_user';
 75             $query = 'show fields from zyd_fuweng_user';
 76             $tables = mysqli_query($dbObj,$query);
 77             //dump($tables);
 78             $count = $tables->num_rows;
 79             $arr = array();
 80             for($i=0;$i<$count;$i++){
 81                 $row = $tables->fetch_assoc();
 82                 //dump($row);
 83                 array_push($arr,$row);
 84             }
 85             mysqli_free_result($tables);
 86             dump($arr);
 87             die;
 88             $query1 = 'select * from zyd_fuweng_user';
 89             $table_msg = mysqli_query($dbObj,$query1);
 90             //输出查询结果
 91             $num = $table_msg->num_rows;
 92             for($i=0;$i<$num;$i++){
 93                 $row = $table_msg->fetch_assoc();
 94                 dump($row);
 95             }
 96             dump($dbObj);
 97             dump($tables);
 98             dump($table_msg);
 99             $res = mysqli_close($dbObj);
100             dump($res);*/