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有返回值且返回受影响的行数。
代码如下:
<?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'];
}
}
?>
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|