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