为了账号安全,请及时绑定邮箱和手机立即绑定

使用mysqli连接数据库应该怎么修改框架呢

请问老师,要使用mysqli来操作mysql数据库应该怎么修改DB类和mysql类啊,不理解DB类和mysql类之间的关联,求解释

正在回答

4 回答

请问一下连接数据库那部分中的public function connect($config = ''),为什么要$config=''

0 回复 有任何疑惑可以回复我~
#1

xdfcc

给个默认值为了让代码更严谨一点!自己写的时候知道要传哪些参数,如果别人用你写的公共函数可能不知道要传什么参数,如果忘记传参或者传数量不对都会出现未知错误,显然程序中没有考虑这些,其实$config = ''也不够严谨,可以有更多处理
2017-11-10 回复 有任何疑惑可以回复我~

如果mysqli采用面向对象的思想该怎么解决呢?

0 回复 有任何疑惑可以回复我~

我用的就是mysqli类,可以分享一下。已经过初步测试,能用。深度测试还没做。

<?php
class mysqliDB{
    public static $mysqli = null;
    /*
    * 报错函数
    * @param string $err
    */
    function error($err){
        die("对不起,您的操作有误,错误原因为:" . $err);
    }
    /*
    * 连接数据库
    *连接mysqli : mysqli是mysql的增强版本,用pdo连接数据库效率要比mysql直*接连接要慢,综合考虑,本人尝试用mysqli以面象对象的方式操作数据库
    * @param string $config
    *   @param string $dbhost 主机名
    *   @param string $dbuser 用户名
    *   @param string $dbpwd 密码
    *   @param string $dbname 数据库名
    *   @param string $dbcharset 字符集/编码
    * @return boolean
    */
//    public function __construct($config = ''){
    public function connect($config = ''){
        if(!class_exists('mysqli')){
            $this->error('不支持mysqli,请先开启');
        }
        if(is_array($config) && !empty($config)){
            extract($config);
       
            if(empty($dbhost)){
                $this->error('没有定义数据库配置');
            }
        }
        if(!isset(self::$mysqli)){
            try{
                self::$mysqli = new mysqli($dbhost,$dbuser,$dbpwd,$dbname);
            }catch(mysqli_sql_exception $e){
                $this->error($e->getMessage);
            }

            if(self::$mysqli->errno){
                error('('. self::$mysqli->errno . ')' . self::$mysqli->error);
                return false;
            }
            if(!self::$mysqli->set_charset("utf8")){
                error('('. self::$mysqli->errno . ')' . self::$mysqli->error);
            }
            return self::$mysqli;
        }
        
    }
    
    /*
    * 执行sql语句
    * @param string $sql
    * @return  bool 返回成功、资源、失败
    */
    function query($sql){
       
        if((($query = mysqli_query(self::$mysqli,$sql))) === false){
            $this->error($sql . '<br/>' . mysqli_error(self::$mysqli));
        }else{
          
            return $query;
        }
    }
    
    /*
    * 列表
    * @param source $query  sql语句通过mysqli_query执行出来的资源
    * @return array 列表数组
    */
    function findAll($query){
        return mysqli_fetch_all($query,MYSQLI_ASSOC);
    }
    
    /*
    * 单条
    * @param source $query  sql语句通过mysqli_query执行出来的资源
    * @return array 单条信息数组
    */
    function findOne($query){
        return mysqli_fetch_array($query,MYSQLI_ASSOC);
    }
    /* 
    * 指定行的指定字段的值
    * @param source $query sql语句通过mysqli_query执行出来的资源
    * @return array 返回指定行的指定字段值
    */
    function findResult($query,$row=0,$field=0){
        mysqli_data_seek($query,$row);
        return mysqli_fetch_row($query)[$field];
    }
    
    /*
    * 添加行
    * @param string $table
    * @param array $arr 添加数组 (二维数组)
    *   [['name'=>'cat1','age'=>1],['name'=>'cat2','age'=>2],...]
    * @return 返回插入的id
    */
    function insert($table,$arr){
        
        $keys = array_keys($arr[0]);
        array_walk($keys,array('mysqliDB','addSpecialChar'));
        $fields = join(',',$keys);
        $binds = '('. str_replace(' ',',', trim(str_repeat("? ",count($arr[0])))) . ')';
        $types = $this->getTypes($arr[0]);
        $this->addSpecialChar($table);
        $sql = "INSERT INTO {$table}({$fields}) VALUES {$binds} ";

        $stmt = self::$mysqli->prepare($sql);
        if(!$stmt){
            $this->error("sql stament 为空");
        }
        foreach($arr as $k => $v){
            extract($v);
            foreach($v as $k1 => $v1){
                eval('$vals[\''. $k . '\'] [\''. $k1 . '\'] = &$' . $k1 . ';');
            }
            unset($k1,$v1);
            
        }
        unset($k,$v);
   
        $store = array();
        foreach($vals as $v){
            call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), $v));
            mysqli_stmt_execute($stmt);
            $store[] = $stmt->insert_id;
        }
        unset($v);
        return $store;  
    }
    
    /*
    * 注防sql注放按照insert的方法
    * 修改函数 
    * @param string $table
    * @param array $arr 修改数组(一维数组)
    * @param string $where 条件 array('and' => array('name'=> 'cat1', id=> 7), 'or' => array('sex' => 1));
    * @return 
    */
    function update($table,$arr,$where){
        
        $kArr = array();
        foreach($arr as $k => $v){
            $v = mysqli_real_escape_string(self::$mysqli,$v);
            $kArr[] = $this->addSpecialChar($k) . "='" .$v . "'";
        }
        $kArr = implode(",", $kArr);
        $this->addSpecialChar($table);
        $sql = "update " .$table . " set " . $kArr . " where " . $where;
//        return $sql;
        $this->query($sql);
    }
    
    /*
    * 删除函数
    * @param string $table 表名
    * @param string $where 条件
    */
    function del($table,$where){
        $this->addSpecialChar($table);
        $sql = "delete from {$table} where {$where}";
//        return $sql;
        $this->query($sql);
    }
    
    
    /*
    *获取参数类型首字母
    * @param array $arr 
    */
    
    function getTypes($arr=array()){
        $strType = '';
        if(!empty($arr)){
            foreach($arr as $var){
                $chrType = substr((string)gettype($var),0,1);
                $strType .= (!in_array($chrType,array("i","d","s"))) ? "b" : $chrType;
            }
        }
        
        return $strType;
    }
    
    /*
    * 通过反引号引用字段
    * @param unknown $value
    * @return string
    */
    function addSpecialChar(&$value){
        if($value==='*'||strpos($value,'.')!==false||strpos($value,'`')!==false){
            //不用做处理
        }elseif(strpos($value,'`')===false){
            $value='`'.trim($value).'`';
        }
        return $value;
    }
    
}


1 回复 有任何疑惑可以回复我~
#1

慕粉3511118

请问一下连接数据库那部分中的public function connect($config = ''),为什么要$config=''
2016-12-21 回复 有任何疑惑可以回复我~

我们可以根据DB类来使用其他的数据库而不仅仅是mysql;mysql类只是封装了mysql数据库的操作方法。DB类是一个大工厂,mysql类是这个工厂里的一个生产车间,当然也有另外的生产车间,个人是这么理解的。

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

使用mysqli连接数据库应该怎么修改框架呢

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信