PHP数据库连接操作模块之数据库操作类
发布时间:2022-11-09 12:42:10 所属栏目:PHP教程 来源:
导读: 1.初值设置:
1)关于数据库名字的获取
分为两种情况:数据库有名字=>赋值数据库的名字
数据库没有名字=>(数据库名字是由作用加上model的,例如userModel)可以通过获取类的名字,经过
1)关于数据库名字的获取
分为两种情况:数据库有名字=>赋值数据库的名字
数据库没有名字=>(数据库名字是由作用加上model的,例如userModel)可以通过获取类的名字,经过
|
1.初值设置: 1)关于数据库名字的获取 分为两种情况:数据库有名字=>赋值数据库的名字 数据库没有名字=>(数据库名字是由作用加上model的,例如userModel)可以通过获取类的名字,经过截取,再转化 为小写最终得到数据数据库表名 在表名上加上前缀 2)初始化options数组,options数组在整个类中的作用是:保存各个数据库功能模块的数据,为最终拼接数据库的SQL语句提供支持,所以它的初始化是将各个内容置为空PHP数据库,然后在后期再对数据进行填充 2.相关SQL的拼接: 拼接步骤: 1)插入 先写一个带有占位符的SQL语句: $sql='select %FIELD% from %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%'; 再利用str_replace()将占位符进行替换 $sql=str_replace(['%FIELD%', '%TABLE%', '%WHERE%' ,'%GROUP%', '%HAVING%', '%ORDER%', '%LIMIT%'], [$this->options['field'],$this->options['table'],$this->options['where'],$this->options['group'],$this->options['having'],$this->options['order'],$this->options['limit']], $sql); 最后保存SQL语句到本地,便于测试,并且调用query方法执行SQL语句 注:在query中判断SQL语句执行的标准是:result有返回值且返回受影响的行数。 代码如下: limit('0,5')->table('user')->field('age,name')->order('money,desc')->where('id>1')->select(); //var_dump($m->limit('0,2')->where('id>0')->table('user')->field('age,name')->order('age desc')->select()); //var_dump($m->sql); //测试插入函数 //$data=['name'=>'成龙','age'=>30,'money'=>2000]; //$insertId=$m->table('user')->insert($data); //var_dump($insertId); //测试删除函数 //var_dump($m->table('user')->where('id=3')->delete()); //测试update //$data=['name'=>'张三丰','age'=>90]; //var_dump($m->table('user')->where('id=2')->update($data)); //测试max函数 var_dump($m->table('user')->max('money')); class Model{ //主机名 protected $host; //用户名 protected $user; //密码 protected $pass; //数据库名 protected $dbName; //字符集 protected $charset; //表前缀 protected $prefix; //数据库连接资源 protected $link; //数据库表名 protected $tableName; //SQL语句 protected $sql; //操作数组 protected $options; //构造方法,对成员变量进行初始化 function __construct($config){ $this->host=$config['DB_HOST']; $this->user=$config['DB_USER']; $this->pwd=$config['DB_PWD']; $this->dbName=$config['DB_NAME']; $this->charset=$config['DB_CHARSET']; $this->prefix=$config['DB_PREFIX']; //连接数据库 $this->link=$this->connect(); //得到数据表名 一个表对应一个类 user==>userModel类 $this->tableName=$this->getTableName(); //初始化options数组 $this->initOptions(); } //连接数据库 protected function connect(){ //创建连接 $link=mysqli_connect($this->host,$this->user,$this->pwd); //判断连接 if(!$link){ exit("数据库连接失败"); } //设置字符集 mysqli_set_charset($link,$this->charset); //选择数据库 mysqli_select_db($link,$this->dbName); //返回连接成功的资源 return $link; } protected function getTableName(){ //设置了成员变量,那么通过成员变量的到表名 if(!empty($this->tableName)){ return $this->prefix.$this->tableName; } //没有设置成员变量,通过类名的到表名 //得到当前类名字符串 $className=get_class($this); //处理表名 user===>UserModel $tableName=strtolower(substr($className, 0,-5)); return $this->prefix.$tableName; } protected function initOptions(){ $arr=['where','table','filed','order','group','having','limit']; foreach ($arr as $value) { //将options数组中对应的值全部清空 $this->options[$value]=''; //将table默认设置为tableName if($value=='table'){ $this->options['value']=$this->tableName; } } } //filed方法与order by相连,让数据按照一定的规律排序,是一个数组,元素以逗号隔开 function field($field){ //如果不为空,再进行处理 if(!empty($field)){ //如果传递的是字符串 if(is_string($field)){ $this->options['field']= $field; }else if(is_array($field)){ //如果传递的是数组 $this->options['field']=join(',',$field); } } //如果为空则返回 return $this; } //table方法 function table($table){ if(!empty($table)){ $this->options['table']=$table; } return $this; } //where方法 function where($where){ if(!empty($where)){ $this->options['where']='where '.$where; } return $this; } //group方法 function group($group){ if(!empty($group)){ $this->options['group']='group by '.$group; } return $this; } //having方法 function having($having){ if(!empty($having)){ $this->options['having']='having '.$having; } return $this; } //order方法 function order($order){ if(!empty($order)){ $this->options['order']='order by '.$order; } return $this; } //limit方法 function limit($limit){ if(!empty($limit)){ //如果是字符串 if(is_string($limit)){ $this->options['limit']='limit '.$limit; }else if(is_array($limt)){ //如果是数组 $this->options['limit']='limit'.join(',',$limit); } } return $this; } //select方法 function select(){ //先预写一个带有占位符的SQL语句 $sql='select %FIELD% from %TABLE% %WHERE% %GROUP% %HAVING% %ORDER% %LIMIT%'; //将options对应的值依次替换上面的占位符 $sql=str_replace(['%FIELD%', '%TABLE%', '%WHERE%' ,'%GROUP%', '%HAVING%', '%ORDER%', '%LIMIT%'], [$this->options['field'],$this->options['table'],$this->options['where'],$this->options['group'],$this->options['having'],$this->options['order'],$this->options['limit']], $sql); //保存一份SQL语句 $this->sql=$sql; //执行SQL语句 return $this->query($sql); } //query方法 function query($sql){ //执行SQL语句 //var_dump($sql); //die(); $result=mysqli_query($this->link,$sql); //返回查询结果并将其存放到数组中 if($result && mysqli_affected_rows($this->link)){ while($data=mysqli_fetch_assoc($result)){ $newData[]=$data; } } //返回数组 return $newData; } //exec方法,判断是否是插入 function exec($sql,$isInsert=false){ //执行SQL语句 //var_dump($sql); $result=mysqli_query($this->link,$sql); //如果执行成功 if($result && mysqli_affected_rows($this->link)){ //判断是否是插入语句,根据不同的语句来实现不同的情况 if($isInsert){ //返回插入的id return mysqli_insert_id($this->link); } //否则返回影响的行数 else{ return mysqli_affected_rows($this->link); } } return false; } //在外部调用受保护的sql语句,所以要使用get魔术方法 function __get($name){ if($name='sql'){ return $this->sql; } return false; } //insert函数,data为关联数组,键就是字段名,值是字段值 function insert($data,$isInsert=false){ //处理字符串问题(values中值如果是字符串要加单双引号) $newData=$this->parseValue($data); var_dump($newData); //SQL语句insert into 表名 (字段名) values (数组值) //提取所有的字段 $keys=array_keys($data); var_dump($keys); //提取所有的值 $value=array_values($newData); //使用占位符写SQL语句 $sql='insert into %TABLE% (%FIELD%) values (%VALUES%)'; //替换字符串 $sql=str_replace(['%TABLE%','%FIELD%','%VALUES%'], [$this->options['table'],join(',',$keys),join(',',$value)], $sql); //保存SQL语句 $this->sql=$sql; var_dump($this->sql); return $this->exec($sql,true); } //删除函数 function delete(){ //写SQL语句 $sql='delete from %TABLE% %WHERE%'; //替换SQL语句 $sql=str_replace(['%TABLE%','%WHERE%'], [$this->options['table'],$this->options['where']], $sql); //保存SQL语句 $this->sql=$sql; return $this->exec($sql); } //传递进来一个数组,将数组中值为字符串的数组成员加上单双引号 protected function parseValue($data){ //遍历数组,判断是否是字符串 //var_dump($data); foreach ($data as $key => $value) { //如果是字符串,加上单引号 if(is_string($value)){ $value='"'.$value.'"'; } //保存到新数组上 $newData[$key]=$value; var_dump($newData); } //返回新数组 return $newData; } //更新函数 //update 表名 set 字段名=字段值 where function update($data){ //var_dump($data); //处理字符串加引号问题 $data=$this->parseValue($data); //var_dump($newData); //将关联数组拼接为固定的格式 $value=$this->parseUpdate($data); var_dump($value); //准备SQL语句 $sql='update %TABLE% set %VALUE% %WHERE%'; //替换SQL语句 $sql=str_replace(['%TABLE%','%VALUE%','%WHERE%'], [$this->options['table'],$value,$this->options['where']], $sql); //保存SQL语句 $this->sql=$sql; //执行SQL语句 return $this->exec($sql); } protected function parseUpdate($data){ //var_dump($data); foreach ($data as $key => $value) { $newData[]=$key.'='.$value; //var_dump($newData); } return join(',',$newData); } function max($field){ //通过调用自己的封装的方法进行查询 $result=$this->field('max('.$field.') as max')->select(); //返回最大值 select方法返回的是二维数组 return $result[0]['max']; } } ?> (编辑:开发网_运城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


浙公网安备 33038102330464号