加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_运城站长网 (https://www.0359zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP数据库连接操作模块之数据库操作类

发布时间:2022-11-09 12:42:10 所属栏目:PHP教程 来源:
导读:  1.初值设置:

  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'];
   }
  
  }
  
  
  ?>
 

(编辑:开发网_运城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!