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

1.初值设置:

          1)关于数据库名字的获取

              分为两种情况:数据库有名字=>赋值数据库的名字

               数据库没有名字=>(数据库名字是由作用加上model的,例如userModel)可以通过获取类的名字,经过截取,再转化                 为小写最终得到数据数据库表名

                在表名上加上前缀

          2)初始化options数组,options数组在整个类中的作用是:保存各个数据库功能模块的数据,为最终拼接数据库的SQL语句提供支持,所以它的初始化是将各个内容置为空,然后在后期再对数据进行填充

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有返回值且返回受影响的行数。

代码如下:

<?php 
$config=include('config.php');
$m=new Model($config);
//测试查询函数
//$m->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'];
	}
	
}
	
	
?>

猜你喜欢

转载自blog.csdn.net/sinat_35161044/article/details/82390735