zoukankan      html  css  js  c++  java
  • 关于php如何连贯操作类方法(以数据库为例)

    关于php如何连贯操作类方法(以数据库为例)

    1、下面是我写好的关于mysqli操作数据库的一些常用方法,大神请掠过

      1 <?php
      2 
      3 class Db
      4 {
      5     static private $config = [
      6         'datahost'  =>  '',     // 主机名
      7         'dataname'  =>  '',     // 数据库名
      8         'username'  =>  '',     // 用户名
      9         'password'  =>  '',     // 用户密码
     10         'charset'   =>  'utf8', // 默认字符集
     11         'prefix'    =>  '',     // 表前缀
     12         'dataport'  =>  '3306',     // 端口号
     13         'returntype'=>  MYSQLI_ASSOC,// 查询返回的类型,默认是关联数组
     14         'pk'        =>  'id',    // 默认主键名称
     15     ];
     16     static private $con = null; // mysqli数据库对象
     17     static public $obj  = null; // Db类对象
     18     static private $error= '';  // 报错信息
     19     static public $data = [
     20         'name'  => '',  // 表名称
     21         'where' => '',  // 条件
     22         'field' => '*',  // 所需字段
     23         'limit' => '',  // 查询条数
     24         'order' => '',  // 排序
     25         'group' => '',  // 分组
     26         'having'=> '',  // having
     27         'join'  => '',  // 内连接
     28         // 'leftjoin' => '', // 左连接
     29         // 'rightjoin'=> '', // 右连接
     30         'on'    => '',  // 连接关联字段
     31         'sql'   => '',  // 最后一次执行的sql
     32     ]; // 数据集
     33 
     34     /**
     35      * 初始化
     36      */
     37     private function __construct()
     38     {
     39         // 连接数据库操作
     40         self::connect();
     41     }
     42 
     43     /**
     44      * 连接数据库
     45      */
     46     static private function connect()
     47     {
     48         self::$con = @mysqli_connect(self::$config['datahost'], self::$config['username'], self::$config['password'], self::$config['dataname'], self::$config['dataport']);
     49         if (! self::$con)
     50         {
     51             die('数据库连接失败'.mysqli_connect_error());
     52         }
     53         // 设置字符集
     54         mysqli_set_charset(self::$con, self::$config['charset']);
     55     }
     56 
     57     /**
     58      * 设置变量
     59      */
     60     public function __set($name, $value)
     61     {
     62         if (array_key_exists($name, self::$config))
     63         {
     64             self::$config[$name] = $value;
     65         }
     66     }
     67 
     68     /**
     69      * 释放变量
     70      */
     71     public function __unset($name)
     72     {
     73         if (array_key_exists($name, self::$config))
     74         {
     75             unset(self::$config[$name]);
     76         }
     77     }
     78 
     79     /**
     80      * 初始化
     81      * @param array $config 配置文件
     82      */
     83     static public function init($config = [])
     84     {
     85         // 初始化配置文件
     86         self::parseParams($config);
     87         if (!is_object(self::$obj))
     88         {
     89             self::$obj = new self;
     90         }
     91         return self::$obj;
     92     }
     93 
     94     /**
     95      * 设置配置文件
     96      * @param array $config 配置文件
     97      */
     98     static private function parseParams($config)
     99     {
    100         // 加载调用时的config配置
    101         if (is_array($config))
    102         {
    103             foreach ($config as $key => $val)
    104             {
    105                 if (array_key_exists($key, self::$config))
    106                 {
    107                     self::$config[$key] = $val;
    108                 }
    109             }
    110         }
    111     }
    112 
    113     /**
    114      * 执行一条sql语句
    115      */
    116     static private function query($sql = '')
    117     {
    118         if (empty($sql))
    119         {
    120             $query = mysqli_query(self::$con, self::$data['sql']);
    121         }
    122         else
    123         {
    124             $query = mysqli_query(self::$con, $sql);
    125         }
    126         return $query;
    127     }
    128 
    129     /**
    130      * 释放结果集
    131      */
    132     static private function free($result)
    133     {
    134         if (!is_bool($result))
    135         {
    136             // 释放结果集
    137             mysqli_free_result($result);
    138             // 重置所有值
    139             foreach (self::$data as $k => $v)
    140             {
    141                 if ($k == 'field')
    142                 {
    143                     self::$data[$k] = '*';
    144                 }
    145                 else
    146                 {
    147                     self::$data[$k] = '';
    148                 }
    149             }
    150         }
    151     }
    152 
    153     /**
    154      * 返回INSERT UPDATE DELETE 影响行数
    155      */
    156     static public function rowNum()
    157     {
    158         if (self::$con)
    159         {
    160             return mysqli_affected_rows(self::$con);
    161         }
    162     }
    163 
    164     /**
    165      * 设置出错信息
    166      */
    167     static public function setError()
    168     {
    169         if (self::$con)
    170         {
    171             self::$error = mysqli_error(self::$con);
    172         }
    173     }
    174 
    175     /**
    176      * 设置表名(不带前缀)
    177      * @param string $table_name 表名称
    178      */
    179     public function name($table_name)
    180     {
    181         self::$data['name'] = self::$config['prefix'].$table_name;
    182         return self::$obj;
    183     }
    184 
    185     /**
    186      * 设置表名(带前缀)
    187      * @param tring $table_name 表名称
    188      */
    189     public function table($table_name)
    190     {
    191         self::$data['name'] = $table_name;
    192         return self::$obj;
    193     }
    194 
    195     /**
    196      * 需要的字段
    197      * @param string $value 需要字段,如id,username,password
    198      */
    199     public function field($value)
    200     {
    201         self::$data['field'] = " {$value} ";
    202         return self::$obj;
    203     }
    204 
    205     /**
    206      * 获取指定记录
    207      * @param int $star 开始位置
    208      * @param int $end 结束位置
    209      */
    210     public function limit($star, $end = '')
    211     {
    212         if (!empty($end))
    213         {
    214             self::$data['limit'] = " LIMIT {$star},{$end} ";
    215         }
    216         else
    217         {
    218             self::$data['limit'] = " LIMIT {$star} ";
    219         }
    220         return self::$obj;
    221     }
    222 
    223     /**
    224      * 查询的条件
    225      * @param string 查询的条件,如:id='32' AND username='test'
    226      */
    227     public function where($value)
    228     {
    229         if (!empty($value) && is_string($value))
    230         {
    231             self::$data['where'] = " WHERE {$value} ";
    232         }
    233         return self::$obj;
    234     }
    235 
    236     /**
    237      * 内联接
    238      */
    239     public function join($value, $method = 'join')
    240     {
    241         if (!empty($value))
    242         {
    243             switch(strtolower($method))
    244             {
    245                 case 'join':
    246                 default:
    247                     self::$data['join'] = " JOIN {$value} ";
    248                     break;
    249                 case 'ljoin':
    250                     self::$data['join'] = " LEFT JOIN {$value} ";
    251                     break;
    252                 case 'rjoin':
    253                     self::$data['join'] = " RIGHT JOIN {$value} ";
    254                     break;
    255             }
    256             
    257         }
    258         return self::$obj;
    259     }
    260 
    261     /**
    262      * 联接查询绑定
    263      */
    264     public function on($value)
    265     {
    266         if (!empty($value))
    267         {
    268             self::$data['on'] = " ON {$value} ";
    269         }
    270         return self::$obj;
    271     }
    272 
    273     /**
    274      * having 筛选
    275      */
    276     public function having($value)
    277     {
    278         //
    279         return self::$obj;
    280     }
    281 
    282     /**
    283      * 字段排序
    284      * @param string $value 排序的字段和排序方式,如:id desc,username asc
    285      */
    286     public function order($value)
    287     {
    288         if (!empty($value))
    289         {
    290             self::$data['order'] = " ORDER BY {$value} ";
    291         }
    292         return self::$obj;
    293     }
    294 
    295     /**
    296      * 分组
    297      * @param string $value 字段分组,如:id,username
    298      */
    299     public function group($value)
    300     {
    301         if (!empty($value))
    302         {
    303             self::$data['group'] = " GROUP BY {$value} ";
    304         }
    305         return self::$obj;
    306     }
    307 
    308     /**
    309      * 删除
    310      */
    311     public function delete()
    312     {
    313         if (!empty(self::$data['where']))
    314         {
    315             self::$data['sql'] = "DELETE FROM `".self::$data['name']."`".self::$data['where'];
    316             $query = self::query();
    317 
    318             if (is_bool($query))
    319             {
    320                 self::free($query);
    321                 return self::rowNum(); // 返回0表示没有行数影响,执行时成功的,返回>0的数字表示影响行数
    322             }
    323             else
    324             {
    325                 self::setError(); // 设置错误信息
    326                 return false;
    327             }
    328         }
    329         return false; // 没有带条件的删除不能成功
    330         
    331     }
    332 
    333     /**
    334      * 更新
    335      */
    336     public function save($value)
    337     {
    338         if (is_string($value))
    339         {
    340             if (!empty(self::$data['where']))
    341             {
    342                 self::$data['sql'] = "UPDATE `".self::$data['name']."` SET ".$value.self::$data['where'];
    343                 $query = self::query();
    344 
    345                 if (is_bool($query))
    346                 {
    347                     self::free($query);
    348                     return self::rowNum(); // 返回0表示没有行数影响,执行时成功的,返回>0的数字表示影响行数
    349                 }
    350                 else
    351                 {
    352                     self::setError(); // 设置错误信息
    353                     return false;
    354                 }
    355             }
    356             else
    357             {
    358                 return false; // 没有带条件的更新不能成功
    359             }
    360         }
    361     }
    362 
    363     /**
    364      * 新增(可以传两种值,一种是数组,一种是字段和对应的值)
    365      * 数组:$data['username'] = 'abcd' 或 $data = ['username'=>'abcd']
    366      * 键值:'username', "'abcd'"
    367      */
    368     public function insert()
    369     {
    370         if (func_num_args() === 2) // 两个参数,第一个是字段,第二个是值
    371         {
    372             list($field, $value) = func_get_args();
    373             self::$data['sql'] = "INSERT INTO ".self::$data['name']."({$field}) VALUES({$value})";
    374             $query = self::query();
    375         }
    376         elseif(func_num_args() === 1) // 一个参数,数组
    377         {
    378             list($data) = func_get_args();
    379             $field      = '';
    380             $value      = '';
    381             if (is_array($data))
    382             {
    383                 foreach ($data as $key => $val)
    384                 {
    385                     $field .= "{$key},";
    386                     if (is_string($val))
    387                     {
    388                         $value .= "'{$val}',";
    389                     }
    390                     else
    391                     {
    392                         $value .= "{$val},";
    393                     }
    394                 }
    395                 $field = rtrim($field, ',');
    396                 $value = rtrim($value, ',');
    397                 self::$data['sql'] = "INSERT INTO ".self::$data['name']."({$field}) VALUES ({$value})";
    398                 $query = self::query();
    399             }
    400         }
    401 
    402         if (is_bool($query))
    403         {
    404             self::free($query);
    405             return self::rowNum(); // 返回0表示没有行数影响,执行时成功的,返回>0的数字表示影响行数
    406         }
    407         else
    408         {
    409             self::setError(); // 设置错误信息
    410             return false;
    411         }
    412     }
    413 
    414     /**
    415      * 获取记录数
    416      * @param string $aliax 别名
    417      */
    418     public function count($alias = 'num')
    419     {
    420         self::$data['sql'] = "SELECT COUNT(*) AS {$alias} FROM ".self::$data['name'].self::$data['where'];
    421         $query  = self::query();
    422 
    423         $result = mysqli_fetch_array($query, self::$config['returntype']);
    424 
    425         self::free($query);
    426 
    427         return $result[$alias];
    428     }
    429 
    430     /**
    431      * 查询一条记录
    432      * @param string $id 主键字段的值
    433      * @return array $result 返回结果数组
    434      */
    435     public function find($id = '')
    436     {
    437         if (empty($id))
    438         {
    439             self::$data['sql'] = "SELECT ".self::$data['field']." FROM `".self::$data['name']."`".self::$data['where'].self::$data['order']; // sql语句
    440         }
    441         else
    442         {
    443             self::$data['sql'] = "SELECT ".self::$data['field']." FROM `".self::$data['name']."` WHERE `".self::$config['pk']."`={$id}".self::$data['order'];
    444         }
    445 echo self::$data['sql'];
    446         $query  = self::query();
    447 
    448         if (!is_bool($query))
    449         {
    450             $result = mysqli_fetch_array($query, self::$config['returntype']);
    451 
    452             self::free($query); // 释放结果集
    453 
    454             return $result; // 返回结果
    455         }
    456         else
    457         {
    458             self::setError();
    459             return ;
    460         }
    461     }
    462 
    463     /**
    464      * 查询记录
    465      * @param string $sql 查询的sql语句
    466      */
    467     public function select($sql = '')
    468     {
    469         if (!empty($sql))
    470         {
    471             $query = self::query($sql);
    472         }
    473         else
    474         {
    475             self::$data['sql'] = "SELECT ".self::$data['field']." FROM `".self::$data['name']."` ".self::$data['join'].self::$data['on'].self::$data['where'].self::$data['group'].self::$data['order'].self::$data['limit'];
    476             $query = self::query();
    477         }
    478         if (!is_bool($query))
    479         {
    480             $result = mysqli_fetch_all($query, self::$config['returntype']);
    481 
    482             self::free($query);
    483 
    484             return $result;
    485         }
    486         else
    487         {
    488             self::setError();
    489             return ;
    490         }
    491     }
    492 
    493     /**
    494      * 返回错误信息
    495      */
    496     public function getError()
    497     {
    498         return self::$error;
    499     }
    500 
    501     /**
    502      * 获取当前数据库服务器版本
    503      */
    504     public function getVersion()
    505     {
    506         if (self::$con)
    507         {
    508             return  mysqli_get_server_info(self::$con);
    509         }
    510     }
    511 
    512     /**
    513      * 关闭数据库连接
    514      */
    515     public function __destruct()
    516     {
    517         if (self::$con)
    518         {
    519             mysqli_close(self::$con);
    520         }
    521     }
    522 
    523     /**
    524      * 调用不存在的公共方法是触发
    525      */
    526     public function __call($name, $arguments)
    527     {
    528         exit("在Core\Db中不存在{$name}方法!");
    529     }
    530 
    531     /**
    532      * 当调用不存在的静态方法是触发
    533      */
    534     static public function __callStatic($name, $params)
    535     {
    536         call_user_func_array(['self', 'init'], $params);
    537     }
    538 }

    2、我们如何使用这个类

      1)使用 find() 方法:

      

     1 require 'Db.php';
     2 
     3 $config = [
     4     'datahost'  => 'localhost',
     5     'username'  =>  'root',
     6     'password'  =>  '12345678',
     7     'charset'   =>  'utf8',
     8     'dataname'  =>  'test',
     9     'prefix'    =>  't_',
    10 ];  // 这是数据库配置文件,可以写在外部
    11 
    12 var_dump( Db::init($config)->name('user')->where("id=3")->find() );

      2)使用 select($sql) 方法(查询所有记录):

       1 var_dump( Db::init($config)->name('user')->where("id=3")->select() ); 

      3)save($data)更新,insert()插入,delete()删除,join,order,group,where,name,table,limit,field等等方法,自己研究研究。

    还有其他的方法,不一一列举了,看类文件一目了然。

    I need you ideas!
  • 相关阅读:
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    C++生产和使用的临时对象
    RecyclerView0基于使用
    Docker创建MySQL集装箱
  • 原文地址:https://www.cnblogs.com/xfjpeter/p/6021377.html
Copyright © 2011-2022 走看看