设置初始化参数
<?php
/* 精简版Model类*/
/*************************设置初始化参数(需要修改)***************************/
define('DB_HOST','localhost');
define('DB_USER','root');
define('DB_PWD','');
define('DB_CHARSET','utf8');
define('DB_NAME','one');
define('DB_PREFIX','');
class userModel extends Model{
}
$one = new userModel;
使用方法及其规范
/**************使用方法*****************************************
添加: $_POST = array('name'=>'强强','sex'=>1,'age'=>20,'memeda'=>'heiehi');
if($new->insert($_POST))
修改: 1. $_POST = array('name'=>'强强','sex'=>1,'age'=>20,'id'=>'3','meme'=>'hehe');
if($new->update($_POST));
2. $new->where('sex=1')->update($_POST);
if($new->update($_POST))
查询: $row = $one->where("name like '%{$search}%'")->limit($num,$page)->order('id ASC')->select();
返回数组
删除: $new->where('id=1')->delete();
if($new->delete($_POST));
where, limit,order, field 查询指定字段
查询指定字段 $new->field('name')->select();
多表联查 。。。
*********************************************/
代码部分
class Model{
//成员属性
//数据库服务器地址
protected $host;
//数据库服务器用户名
protected $user;
//数据库密码
protected $pwd;
//字符集
protected $charset;
//数据库名
protected $dbname;
//要操作的表名
protected $tabName;
//表前缀
protected $prefix;
//要操作的SQL语句
protected $sql;
//所有的合法字段。
protected $field;
//数据里链接资源
protected $link = null;
//定义一个数组 允许调用不存在的方法关键字
protected $method = array('where','order','limit','field');
//定义where
protected $where;
//定义limit
protected $limit;
//定义order
protected $order;
//定义一个用户可以查询的指定字段
protected $fields;
//定义页
protected $page;
//传入当前页
//protected $nowpage =
//成员方法
//构造方法 初始化成员属性
function __construct($tabName = ''){
//第一初始化配置相关属性
$this->host = DB_HOST;
$this->user = DB_USER;
$this->pwd = DB_PWD;
$this->charset = DB_CHARSET;
$this->dbname = DB_NAME;
$this->prefix = DB_PREFIX;
//第二:初始化运行中需要的属性。
//初始化表名
if($tabName == ''){
//没有参数表名, 他有可能继承。 想办法扣出表名
//get_class() 获取对象的类名
//标前缀 拼接 获取的表名
$this->tabName = $this->prefix.strtolower(substr(get_class($this),0,-5));
//var_dump($a);
}else{
$this->tabName = $this->prefix.$tabName;
}
//第三:初始化数据库链接
$this->link = $this->connect();
//初始化合法字段信息
$this->field = $this->getField();
}
//定义链接数据库的方法
protected function connect(){
//第一:链接数据库和选择数据库
$link = @mysqli_connect($this->host,$this->user,$this->pwd,$this->dbname);
//少一个东西 加 一个判断
if(!$link){
//echo 11111;
return false;
}
//第二:设置字符集
mysqli_set_charset($link,$this->charset);
return $link;
}
//获取合法字段的方法
function getField(){
//设置缓存文件的路径
$cache = './cache/'.$this->tabName.'Cache.php';
//echo $cache;
//检测是否缓存过数据库字段
if(file_exists($cache)){
//直接读取缓存数据
return include $cache;
}else{
//没有缓存文件, 查询数据库 缓存一次。
//准备查询的SQL语句
$sql = "DESC ".$this->prefix.$this->tabName;
$result = $this->query($sql);
//将查询到数据字段的结果 缓存起来 写入文件
return $this->writeField($result);
}
}
//生成缓存的方法 (就是把查询的字段 写入到文件中存储)
function writeField($data){
//设置路径
$cache = './cache/'.$this->tabName.'Cache.php';
//定义写入文件的数组
$fields = array();
//var_dump($data);
foreach($data as $key=>$val){
//获取主键
if($val['Key'] == 'PRI'){
$fields['_pk'] = $val['Field'];
}
//获取自增键
if($val['Extra'] == 'auto_increment'){
$fields['_auto'] = $val['Field'];
}
$fields[] = $val['Field'];
}
//var_dump($fields);
//将$fields数组原样写到文件中
file_put_contents($cache,"<?php\r\n return ".var_export($fields,true)."\r\n?>");
return $fields;
}
//mysql执行数据的方法,返回数据的方法 执行 查询
function query($sql){
//将SQL语句写入到成员属性中 如果一旦报错 可以单独打印SQL语句 帮忙调试
$this->sql = $sql;
//定义返回数组变量
$array = array();
//发送sql
$result = mysqli_query($this->link,$sql);
//清空条件
$this->clearWhere();
//判断
if($result && mysqli_num_rows($result)>0){
while($row = mysqli_fetch_assoc($result)){
$array[] = $row;
}
return $array;
}else{
return false;
}
}
//mysql执行数据的方法,返回受影响行方法 执行 增 、删、改
function exec($sql){
//将SQL语句保存
$this->sql = $sql;
//送sql语句
$result = mysqli_query($this->link,$sql);
//清空条件
$this->clearWhere();
//判断
if($result && mysqli_affected_rows($this->link)>0){
//返回受影响航 表示成功
return mysqli_affected_rows($this->link);
}else{
//返回 false
return false;
}
}
//制作添加数据的方法
public function insert($data){
//声明变量
$keys = '';
$vals = '';
//遍历用户传入的数组 将数组 和 sql语句拼接
foreach($data as $key=>$val){
//判断当前遍历的下标(字段名)是否在缓存的合法字段中出现
var_dump($this->field);
if(in_array($key,$this->field)){
//组合字段字符串
$keys .= '`'.$key.'`,';
$vals .= "'".$val."',";
}
}
//删除字段字符串中最后一个逗号
$keys = rtrim($keys,',');
$vals = rtrim($vals,',');
//
//添加数据的SQL语句
$sql = "INSERT INTO {$this->prefix}{$this->tabName}({$keys}) VALUES({$vals})";
echo $sql;
//echo $sql;exit;
//将SQL语句发送到数据库执行
return $this->exec($sql);
}
//修改数据的方法
public function update($data){
//var_dump($data);
//定义一个变量
$update = '';
$con = '';
foreach($data as $k=>$v){
//过滤掉非法字段 过滤掉主键
if(in_array($k,$this->field) && $k!=$this->field['_pk']){
$update .= '`'.$k.'`="'.$v.'",';
}elseif($k == $this->field['_pk']){
$con = '`'.$k.'`="'.$v.'"';
}
}
$update = rtrim($update,',');
//判断是否有where条件
if(!empty($this->where)){
//有条件
$where = ' WHERE '.$this->where;
}else{
//没有条件 拼接成 id = 1;
$where = ' WHERE '.$con;
}
//echo $update;
$sql = "UPDATE {$this->prefix}{$this->tabName} SET {$update} {$where}";
//echo $sql;
return $this->exec($sql);
}
//定义一个删除的方法
function delete(){
//给条件 用条件
if(!empty($this->where)){
//有删除条件
$where = ' WHERE '.$this->where;
}else{
全删
$where = '';
//自己留条活路 必须 给删除的条件
//return false;
//如果用户没有传入删除的条件 自动判断get数据中是否有为止键 如果有 则删除该唯一键
if(!empty($_GET)){
//var_dump($_GET);
// //在缓存字段中获取主键
$id = $this->field['_pk'];
// $arr = explode(',',$id);
// //键值对调
// $fan = array_flip($_GET);
// var_dump($fan);
// //取交集
// $jiao = array_intersect($arr,$fan);
//var_dump($jiao);
//第二种方法 遍历
foreach($_GET as $k=>$v){
if($id == $k){
//把当前值存入变量中
$val = $v;
}
}
$where = 'WHERE '.$id.'='.$val;
}
}
$sql = "DELETE FROM {$this->prefix}{$this->tabName} {$where}";
return $this->exec($sql);
}
//为多表联合查询备份合法字段
function r_filed($args){
$arr = array();
//2.将多张表的合法字段 缓存
foreach($args as $k=>$v){
$this->tabName = $v;
//初始化合法字段信息
$arr[] = $this->getField();
}
return $arr;
}
//多表联合查询
function r_select($tabname1,$tabname2){
//1.如果需要多表联合查询 必须制定表名
$args = func_get_args();
//缓存安全字段
$result =$this->r_filed($args);
//var_dump($result);
//var_dump($args);
//2.拼接表名
$tabnames = implode(',',$args);
//3.判断是否需要查询指定的字段
$fields = '*';
if(!empty($this->fields)){
$fields = $this->fields;
}
//遍历实参数组 拼接数组 +表名
foreach($args as $k=>$v){
//拼接路径 读取 缓存文件信息
$cache = './cache/'.$v.'Cache.php';
$arr = include $cache;
//var_dump($arr);
foreach($arr as $key=>$val){
$num[] = $v.'.'.$val;
}
}
var_dump($num);
var_dump($fields);
$keys = array();
foreach($fields as $k=>$v){
// var_dump($v);
// $a = strchr($v,' as ',true);
// var_dump($a);
// 截取字符串 做 判断
// bumen.name as bname
if(strchr($v,' as ',true) && in_array(strchr($v,' as ',true),$num)){
//合法
$keys[] = $v;
}elseif(in_array($v,$num)){
$keys[] = $v;
}
}
//var_dump($num);
//加条件
$where = $order = $limit = '';
if(!empty($this->where)){
$where = ' WHERE '.$this->where;
}
if(!empty($this->order)){
$order = ' ORDER BY '.$this->order;
}
if(!empty($this->limit)){
$limit = ' LIMIT '.$this->limit;
}
//3.安全过滤
//去交集
$fields = implode(',',$keys);
//$fields = implode(',',$field);
//echo $fields;exit;
$sql = "SELECT {$fields} FROM {$tabnames} {$where} {$order} {$limit}";
echo $sql;
return $this->query($sql);
}
//单表查询
function select(){
$where = $limit = $order = '';
//查询的条件
if(!empty($this->where)){
$where = ' WHERE '.$this->where;
}
if(!empty($this->limit)){
$limit = ' LIMIT '.$this->limit;
}
if(!empty($this->order)){
$order = ' ORDER BY '.$this->order;
}
//用户是否需要查询指定的字段
if(!empty($this->fields)){
//过滤安全字段 取数组的交集
$hefa = array_intersect($this->fields,$this->field);
//var_dump($hefa);
$fields = implode(',',$hefa);
}else{
$fields = '*';
}
$sql = "SELECT {$fields} FROM {$this->prefix}{$this->tabName} {$where} {$order} {$limit}";
//echo $sql;exit;
return $this->query($sql);
}
//定义一个魔术方法 call 调用一个不存在的方法时自动触发,
//where() order() limit();
function __call($methodName,$vals){
if(in_array($methodName,$this->method)){
if(!empty($vals)){
//判断到底是调用哪一个
if($methodName == 'where'){
if (count($vals)>1) {
$this->where = implode(' and ',$vals);
}else{
$this->where = $vals[0];
}
//var_dump($this->where);
}elseif($methodName == 'order'){
$this->order = $vals[0];
}elseif($methodName == 'limit'){
if(count($vals) > 1){
$this->limit = $vals[0].','.$vals[1];
}else{
$this->limit = $vals[0];
}
}elseif($methodName == 'field'){
//用户需要查询指定字段
//var_dump($vals);
$this->fields = $vals;
}
}
}else{
echo '对不起,您调用的'.$methodName.'方法不存在';
}
return $this;
}
//获取总条数
function total(){
$where = '';
//会有where
if(!empty($this->where)){
$where = ' WHERE '.$this->where;
}
//获取主键
if(isset($this->field['_pk'])){
$pk = $this->field['_pk'];
}else{
$pk = '*';
}
$sql = "SELECT COUNT({$pk}) as total FROM {$this->prefix}{$this->tabName} {$where}";
//echo $sql;
//var_dump(intval($this->query($sql)[0]['total']));
return intval($this->query($sql)[0]['total']);
}
//清除条件
function clearWhere(){
$this->where = null;
$this->limit = null;
$this->order = null;
$this->fields = null;
}
//分页
function fenye($page){
$this->page = $page;
$num = ($this->dpage() - 1) * $page;
$row =$this->limit($num,$page)->select();
return $row;
}
function pageALL(){
return ceil($this->total() / $this->page);
}
function dpage(){
return isset($_GET['page'])?$_GET['page']:1;
}
function prePage(){
return $this->dpage()-1<=1?1:($this->dpage()-1);
}
function nextPage(){
return $this->dpage()+1>=$this->pageAll()?$this->pageAll():($this->dpage()+1);
}
//错误输出
function getSql(){
return $this->sql;
}
//析构方法
function __destruct(){
if($this->link != null){
mysqli_close($this->link);
}
}
}