php数据库操作类

时间:2022-12-11 10:16:56

话不多说,直接上代码!

model.php

这里面为PHP的数据库操作类。

  1 <?php
  2 $config = include 'config.php';
  3 $m = new Model($config);
  4 // $m->limit('0,5')
  5 //   ->table('imooc_cate')
  6 //   ->field('id,cName')
  7 //   ->order('id desc')
  8 //   ->where('id>3')
  9 //   ->select();
 10 // var_dump($m->sql);
 11 
 12 // var_dump($m->limit('0,5')->table('imooc_cate')->field('id,cName') ->where('id>=3') ->select());
 13 // var_dump($m->sql);
 14 
 15 //插入
 16 // $data = ['Cname'=>'面包屑'];
 17 // $insertId = $m->table('imooc_cate')->insert($data);
 18 // var_dump($insertId);
 19 
 20 //删除
 21 //   $deleteId = $m->table('imooc_cate')->where('cName=数码产品')->delete();
 22 //   var_dump($deleteId);
 23 //   var_dump($m->sql);
 24 
 25 // 更新
 26 // $data = ['cName'=>'你真搞笑'];
 27 // var_dump($m->table('imooc_cate')->where('id=7')->update($data));
 28 // var_dump($m->sql);
 29 
 30 //max函数
 31 // var_dump($m->table('imooc_cate')->max('id'));
 32 
 33 var_dump($m->getBycName('你真搞笑'));
 34 class Model{
 35 //    主机名
 36     protected $host;
 37 //     用户名
 38     protected $user;
 39 //     密码
 40     protected $pwd;
 41 //     数据库名
 42     protected $dbname;
 43 //     字符集
 44     protected $charset;
 45 //     数据表前缀
 46     protected $prefix;
 47     
 48     
 49 //     数据库连接资源
 50     protected $link;
 51 //     数据表名 可以指定表名
 52     protected $tableName='imooc_cate';
 53 //     sql语句
 54     protected $sql;
 55 //     操作数组  存放的是所有的查询条件
 56     protected $options;
 57     
 58 //     构造方法,对成员变量进行初始化
 59 function __construct($config){
 60     //对成员变量进行初始化
 61     $this->host  = $config['DB_HOST'];
 62     $this->user = $config['DB_USER'];
 63     $this->pwd = $config['DB_PWD'];
 64     $this->dbname = $config['DB_NAME'];
 65     $this->charset = $config['DB_CHARSET'];
 66     $this->prefix = $config['DB_PREFIX'];
 67     
 68     //连接数据库
 69     $this->link = $this->connect();
 70     
 71     //得到数据表名 User=》UserModel Article=》ArticleModel
 72     $this->tableName = $this->getTableName();
 73     //初始化options数组
 74     $this->initOptions();
 75 }
 76 //连接数据库
 77 protected function connect(){
 78     $link = mysqli_connect($this->host, $this->user, $this->pwd);
 79     if (!$link){
 80         die('数据库连接失败');
 81     }
 82     mysqli_select_db($link, $this->dbname);
 83     mysqli_set_charset($link, $this->charset);
 84     return $link;
 85 }
 86 //得到表名
 87 protected function getTableName(){
 88     //如果设置了成员变量,那么就通过成员变量来得到表名
 89     if (!empty($this->tableName)){
 90         return $this->prefix.$this->tableName;
 91     }
 92     //如果没有设置成员变量,那么通过类名来得到表名
 93      /*得到当前类名  表名字符串*/
 94     $className = get_class($this);
 95     $table = strtolower(substr($className, 0,-5));
 96     return $this->prefix.$table;
 97 }
 98 //初始化操作数组
 99 protected function initOptions(){
100     $arr = ['where','table','field','order','group','having','limit'];
101     foreach ($arr as $value){
102         //将options数组中键的值全部清空
103         $this->options[$value]= '';
104         //将table默认设置为table
105         if($value == 'table'){
106             $this->options[$value] =$this->tableName;
107         }elseif ($value == 'field'){
108             $this->options[$value] = '*';
109         }
110     }
111 }
112 //     field方法
113 function field($field){
114     //如果不为空再进行处理
115     if (!empty($field)){
116         if (is_string($field)){
117             $this->options['field'] = $field;
118         }elseif (is_array($field)){
119             $this->options['field']= join(',', $field);
120         }
121     }
122     return $this;
123 }
124 //     table方法
125 function table($table){
126     if (!empty($table)){
127         $this->options['table']=$table;
128     }
129     return $this;
130 }
131 //     where方法
132 function where($where){
133     if (!empty($where)){
134         $this->options['where'] = 'where '.$where;
135     }
136     return $this;
137 }
138 //     group方法
139 function group($group){
140     if (!empty($group)) {
141         $this->options['group'] = 'group by'.$group;
142     }
143     return $this;
144 }
145 //     having方法
146 function having($having){
147     if (!empty($having)) {
148         $this->options['having'] = 'having '.$having;
149     }
150     return $this;
151 }
152 //     order方法
153 function order($order){
154     if (!empty($order)) {
155         $this->options['order'] =' order by '.$order ;
156     }
157     return $this;
158 }
159 //     limit方法
160 function limit($limit){
161     if (!empty($limit)) {
162         if (is_string($limit)){
163             $this->options['limit'] = ' limit '.$limit;
164         }elseif (is_array($limit)){
165             $this->options['limit'] = ' limit ' .join(',',$limit);
166         }
167     }
168     return $this;
169 }
170 //     select方法 查询
171 function select(){
172       //先预写一个带有占位符的sql语句
173      $sql = 'select %FIELD% from %TABLE%
174           %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%';
175      //将options中对应的值以此替换上面的占位符
176      $sql  = str_replace(['%FIELD%','%TABLE%','%WHERE%','%GROUP% ','%HAVING%','%ORDER%',' %LIMIT%']
177                          , [$this->options['field'],$this->options['table'],$this->options['where'],
178                             $this->options['group'],$this->options['having'],$this->options['order'],
179                             $this->options['limit']], $sql);
180      //保存一份sql语句,便于调试
181      $this->sql = $sql;
182      //执行生气了语句
183      return $this->query($sql);
184 }
185 //insert方法 插入 
186 //$data为关联数组,键是字段名,值就是字段值
187 function insert($data){
188     //处理字符串问题 两边需要加单双引号
189     $data  = $this->parseValue($data);
190     //insert into table(字段) value (值)
191     //提取所以的键(字段)
192     $keys = array_keys($data);
193     //提取所有的值
194     $values = array_values($data);
195     //增加数据的sql语句
196     $sql = 'insert into %TABLE%(%FIELE%) values (%VALUES%)';
197     $sql = str_replace(['%TABLE%','%FIELE%','%VALUES%'], 
198                        [$this->options['table'],join(',', $keys),join(',', $values)], $sql);
199     $this->sql = $sql;
200     return $this->exec($sql,true);
201 }
202 
203 //传递进来一个数组,将数组中值为字符串的两边加引号
204 protected function parseValue($data){
205     foreach ($data as $key => $value){
206         //判断是不是为字符串
207         if(is_string($value)){
208             $value = '"'.$value.'"';
209         }
210         $newData[$key] = $value;
211     }
212     return $newData;
213 }
214 
215 
216 //delete函数 删除
217 function delete(){
218     $sql = 'delete from %TABLE% %WHERE%';
219     $sql = str_replace(['%TABLE%','%WHERE%'],
220            [$this->options['table'],$this->options['where']], 
221             $sql);
222     $this->sql = $sql;
223     
224     return $this->exec($sql);
225 }
226 //更新函数 update
227 //$data为关联数组,键是字段名,值就是字段值
228 //update 表名  set 字段名=字段值,字段名=字段值
229 function update($data){
230     //处理字符串问题 两边需要加单双引号
231     $data  = $this->parseValue($data);
232     //拼接为固定的格式
233     $value = $this->parseUpdate($data);
234     //准备sql语句
235     $sql = 'update %TABLE%   set  %VALUE% %WHERE%';
236     $sql = str_replace(['%TABLE% ','%VALUE%','%WHERE%']
237             , [$this->options['table'],$value,$this->options['where']], $sql);
238     $this->sql = $sql;
239     return $this->exec($sql);
240 }
241 protected function parseUpdate($data){
242     foreach ($data as $key => $value){
243         $newData[] = $key.'='.$value;
244     }
245     return join(',', $newData);
246 }
247 
248 
249 
250 //     query 有结果集
251 function query($sql){
252     //清空options中的值
253     $this->initOptions();
254     
255 //     var_dump($sql);
256 //     exit();
257 
258     $result = mysqli_query($this->link, $sql);
259     //提取结果集存放到数组中
260     if ($result && mysqli_affected_rows($this->link)) {
261         while ( $data = mysqli_fetch_assoc($result)){
262             $newData[] = $data;
263         }
264     }
265     return $newData;
266 }
267 //     exec 无结果集
268 function exec($sql,$isInsert=false){
269     //清空options中的值
270     $this->initOptions();
271     
272     $result = mysqli_query($this->link, $sql);
273     if ($result && mysqli_affected_rows($this->link)) {
274         if($isInsert){
275             return mysqli_insert_id($this->link);
276         }else{
277             return mysqli_affected_rows($this->link);
278         }
279     }
280     return false;
281 }
282 
283 //获取sql语句
284 function __get($name){
285     if ($name == 'sql') {
286         return $this->sql;
287     }
288     return false;
289 } 
290 
291 
292 // max函数
293 function max($field){
294     $result = $this->field('max('.$field.') as max')
295     ->select();
296     return $result[0]['max'];
297 }
298 //析构方法
299 function __destruct(){
300     mysqli_close($this->link);
301 }
302 //魔术方法 getBy+你要查询的字段名称
303 function __call($name,$args){
304         //获取钱5个字符
305         $str = substr($name, 0,5);
306         //获取后面的字段名
307         $field = strtolower(substr($name, 5));
308         //判断前五个是否为getBy
309         if ($str == 'getBy') {
310             return $this->where($field.'="'.$args[0].'"')->select();
311         }
312         return false;
313 }
314 
315 
316 
317 }

config.php

为数据库连接是需要的配置信息

<?php
header('Content-type:text/html;charset=utf8');
return [
    'DB_HOST' => 'localhost',
    'DB_USER' => 'root',
    'DB_PWD'=>'l密码',
    'DB_NAME'=>'你的数据库名',
    'DB_CHARSET'=>'utf8',
    'DB_PREFIX'=>''
];