zoukankan      html  css  js  c++  java
  • 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'=>''
    ];

    ?>

  • 相关阅读:
    document.form.action一个页面多个action,表单分向提交
    jdk多个版本切换
    (已解决)No result defined for action and result input
    struts2中action中的void方法
    时间格式yy-MM-dd HH:mm:ss
    Spring在Action中不用注入实体类
    css背景色的线性渐变
    ElasticSearch入门
    Git命令进阶
    websocket入门代码
  • 原文地址:https://www.cnblogs.com/summerGraden/p/11571929.html
Copyright © 2011-2022 走看看