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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章