PHP数据库类

<?php

$config=include 'config.php';

$m=new Model($config);

/// 调用这个函数时,要把数据表名写上去,写成常量的形式,要不然不执行
var_dump($m->getByName('成龙'));

/// 测试max函数
/// var_dump($m->table('demo')->max('money'));

 


/// 测试update函数
/// $data=['name'=>'成龙','money'=>'2222'];
/// var_dump($m->table('demo')->where('id=4')->update($data));

 


/// 测试delete函数
/// var_dump($m->table('demo')->where('id=3')->delete());


/// 测试insert函数
/// $data=['age'=>30,'name'=>'成龙','money'=>'2000'];
/// $insertId= $m->table('demo')->insert($data);
/// var_dump($insertId);

/// 测试select函数
/// $m->limit('0,5')->table('demo')->field('age,name')->order('money desc')->where('id>1')->select();
/// var_dump($m->sql);


/// var_dump($m->limit('0,5')->table('demo')->field('age,name')->order('money desc')->where('id>1')->select());
//// var_dump($m->sql);

class Model{
/// 主机名
protected $host;
/// 用户名
protected $user;
/// 密码
protected $pwd;
/// 数据库名
protected $dbname;
/// 字符集
protected $charset;
/// 数据表前缀
protected $prefix;

/// 数据库连接资源
protected $link;
/// 数据表名 这里可以自己指定表明
protected $tableName;

//// 如果调用getByName ,要把表名写上去 protected $tableName='demo';

/// 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();

///得到数据表名
$this->tableName=$this->getTableName();

/// 初始化options数组
$this->initOptions();





}

protected function connect(){
/// 连接数据库
$link=mysqli_connect($this->host,$this->user,$this->pwd);
if(!$link){
die('数据库连接失败');
}
/// 选择数据库
mysqli_select_db($link,$this->dbname);
/// 设置字符集
mysqli_set_charset($link,$this->charset);
/// 返回连接成功的资源
return $link;
}

protected function getTableName(){
/// 第一种,如果设置了成员变量,那么通过成员变量来得到表名
if(!empty($this->tableName)){
return $this->prefix.$this->tableName;
}

/// 第二种,如果没有设置成员变量,那么通过类名来得到表名
/// 得到当前类名字符串
$className=get_class($this);
/// user UserModel goods GoodsModel
$table=strtolower(substr($className,0,-5)) ;
return $this->prefix.$table;
}

protected function initOptions(){
$arr=['where','table','field','order','group','having','limit'];
foreach($arr as $value){
/// 将options数组中这些键对应的值全部清空
$this->options[$value]='';
/// 将table默认设置为tableName
if($value=='table'){
$this->options[$value]=$this->tableName;
}else if($value=='field'){
$this->options[$value]='*';
}
}
}


/// field方法
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($limit)){
$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){


/// 清空options数组中的值
$this->initOptions();
/// var_dump($sql);
/// die();

/// 执行sql语句
$result=mysqli_query($this->link,$sql);
/// 提取结果集存放在数组中
if($result&&mysqli_affected_rows($this->link)){
while($data=mysqli_fetch_assoc($result)){
$newData[]=$data;
}
}
/// 返回结果集
return $newData;
}

/// 获取sql语句
function __get($name){
if($name=='sql'){
return $this->sql;
}
return false;
}


/// exec

function exec($sql,$isInsert=false){


/// 清空options数组
$this->initOptions();
/// 执行sql语句
$result=mysqli_query($this->link,$sql);
if($result&&mysqli_affected_rows($this->link)){
/// 判断是否是插入语句,根据不同的语句返回不同的结果
if($isInsert){
return mysqli_insert_id($this->link);
}else {
return mysqli_affected_rows($this->link);
}
}
return false;

}



/// insert函数
/// $data:关联数组,键就是字段名,值就是字段值
/// insert into table(字段) value(值)
function insert($data){
/// 处理值是字符串问题,两边需要添加单或双引号
$data=$this->parseValue($data);
/// 提取所有的键,即就是所有的字段
$keys=array_keys($data);
/// 提取所有的值
$values=array_values($data);
/// 增加数据的sql语句
$sql='insert into %TABLE%(%FIELD%) values(%VALUES%)';
$sql=str_replace(['%TABLE%','%FIELD%','%VALUES%'],
[$this->options['table'],join(',',$keys),join(',',$values)],$sql);
$this->sql=$sql;
return $this->exec($sql,true);

}


/// 传递进来一个数组,将数组中值为字符串的两边加上引号
protected function parseValue($data){
/// 遍历数组,判断是否为字符串,若是字符串,将其两边添加引号
foreach($data as $key=>$value){
if(is_string($value)){
$value='"'.$value.'"';
}
$newData[$key]=$value;
}
/// 返回处理后的数组
return $newData;
}

/// 删除函数
function delete(){
/// 拼接sql语句
$sql='delete from %TABLE% %WHERE% ';
$sql=str_replace(['%TABLE%','%WHERE%'],[$this->options['table'],$this->options['where']],$sql);
/// 保存sql语句
$this->sql=$sql;
/// 执行sql语句
return $this->exec($sql);

}

/// 更新函数
/// update 表明 set 字段名=字段值 where 条件
function update($data){
/// 处理$data数组中值为字符串加引号问题
$data=$this->parseValue($data);
/// 将关联数组拼接为固定的格式 键=值
$value=$this->parseUpdate($data);
/// 准备sql语句
$sql='update %TABLE% set %VALUE% %WHERE% ';
$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){
foreach ($data as $key =>$value){
$newData[]=$key.'='.$value;

}
return join(',',$newData);

}


/// max函数
function max($field){
/// 通过调用自己的封装的方法进行查询
$result=$this->field('max('.$field.') as max')->select();
/// select方法返回的是一个二维数组
return $result[0]['max'];

}

/// 析构方法
function __destruct(){
mysqli_close($this->link);
}


/// getByName getByAge

/// __call

function __call($name,$args){
/// 获取前五个字符
$str=substr($name,0,5);
/// 获取后面的字段名
$field=strtolower(substr($name,5)) ;
/// 判断前五个字符是否是getby
if($str=='getBy'){
return $this->where($field.'="'.$args[0].'"')->select();
}
return false;

}



}

 


?>

 

 

////   config.php

 

<?php

return [
'DB_HOST'=>'localhost',
'DB_USER'=>'root',
'DB_PWD'=>'12345678',
'DB_NAME'=>'ceshi',
'DB_CHARSET'=>'utf8',
'DB_PREFIX'=>''
];

?>

 

posted @ 2019-09-23 13:56  2538  阅读(328)  评论(0编辑  收藏  举报