zoukankan      html  css  js  c++  java
  • PHP 对MySQLI预处理的包装

    mysql 类

    <?php
    
    class Mysql {
    
        private static $instance;
        private $link;
        private $query;
        private $stmt;
        private $param;
    
        // 初始化
        private function __construct() {
            $this->link = @new mysqli('localhost', 'root', 'chenshuo90909', 'temp');
            if(mysqli_connect_errno()) {
                echo "MySQL connect error!"; exit();
            }
            return $this->link;
        }
    
        // 单例模式
        public static function instance() {
            if(isset(self::$instance)){
                return self::$instance;
            } else {
                self::$instance = new self();
                return self::$instance;
            }
        }
    
        // 预处理SQL
        private function prepare($query) {
            $this->query = $query;
            $this->stmt = $this->link->prepare($this->query);
            if($this->stmt) {
                return $this->stmt;
            } else {
                echo "Stmt error!"; exit;
            }
        }
    
        // 值绑定
        private function bind_value($array) {
            $data = array();
            foreach ($array as $key => $value) {
                $data[$key] = &$array[$key];
            }
            return $data;
        }
    
        // 执行
        public function execute($query, $param) {
            $this->query = $query;
            $this->stmt = $this->link->prepare($this->query);
            $this->param = $param;
            call_user_func_array(array($this->stmt, 'bind_param'), $this->bind_value($this->param));    //绑定参数
            $result = $this->stmt->execute();
            var_dump($result);
        }
    
        // 返回单挑数据
        public function find($query, $param) {
            $this->query = $query;
            $this->param = $param;
            $this->stmt = $this->link->prepare($this->query);
            //绑定参数
            call_user_func_array(array($this->stmt, 'bind_param'), $this->bind_value($this->param));    
            $this->stmt->execute();
            
            $meta = $this->stmt->result_metadata();
            // 将结果绑定数组元素设置为引用状态
            while ($field = $meta->fetch_field()) {
                $parameters[] = &$row[$field->name];
            }
            //绑定结果
            call_user_func_array(array($this->stmt, 'bind_result'), $this->bind_value($parameters));
            
            while ($this->stmt->fetch()) {
                $result = $row;
            }
            
            return $result;
        }
    
        // 返回多条数据
        public function fetch($query, $param) {
            $this->query = $query;
            $this->param = $param;
            $this->stmt = $this->link->prepare($this->query);
    
            //绑定参数
            call_user_func_array(array($this->stmt, 'bind_param'), $this->bind_value($this->param));    
            $this->stmt->execute();
            
            $meta = $this->stmt->result_metadata();
    
            // 将结果绑定数组元素设置为引用状态
            while ($field = $meta->fetch_field()) {
                $parameters[] = &$row[$field->name];
            }
    
            //绑定结果
            call_user_func_array(array($this->stmt, 'bind_result'), $this->bind_value($parameters));
    
            // 有多行记录时将多行记录存入$results数组中.
            while ($this->stmt->fetch()) {
                $data = array();
                foreach ($row as $key => $value) {
                    $data[$key] = $value;
                }
                $result[] = $data;
            }
            
            return $result;
        }
    
        // SQL语句调试
        public function debug() {
            return $this->query;
        }
    
        // 释放资源
        public function __destruct() {
            $this->stmt->close();
            $this->link->close();
        }
    
    
    }
    
    ?>

    应用:

    <?php
    include 'mysql.php';
    class Data {
    
        const INSERT = "INSERT INTO user (username, password)VALUES(?, ?)";
        const UPDATE = "UPDATE user SET username = ? WHERE uid = ?";
        const SELECT = "SELECT username, password FROM user WHERE username = ? AND password = ?";
        const DELETE = "DELETE FROM user WHERE uid = ?";
    
        private $db;
    
        public function __construct() {
            $this->db = Mysql::instance();
        }
    
        public function insert($username, $password) {
            $query = self::INSERT;
            $param = array('ss',$username, $password);
            $result = $this->db->execute($query, $param);
            return $result;
        }
    
        public function delete($uid) {
            $query = self::DELETE;
            $param = array('i',$uid);
            $result = $this->db->execute($query, $param);
            return $result;
        }
    
        public function update($username, $uid) {
            $query = self::UPDATE;
            $param = array('si',$username, $uid);
            $result = $this->db->execute($query, $param);
            return $result;
        }
    
        public function select($username, $password) {
            $query = self::SELECT;
            $param = array('ss',$username, $password);
            $result = $this->db->find($query, $param);
            return $result;
        }
    
        public function find($username, $password) {
            $query = self::SELECT;
            $param = array('ss',$username, $password);
            $result = $this->db->find($query, $param);
            return $result;
        }
    
    }
    
    $data = new Data();
    
    //$data->insert('chenshuox', 'chenshuo123');
    //$data->delete(2);
    //$data->update('tinys123', 1);
    
    $result = $data->find('chenshuox', 'chenshuo123');
    echo $result['username'];
    echo $result['password'];
    
    ?>
  • 相关阅读:
    科技抗疫,少年可期,为这群有AI的天使开发者疯狂打call
    Multi-Architecture镜像制作指南已到,请查收!
    垃圾回收你懂,Java垃圾回收你懂吗?
    “体检医生”黑科技|让AI开发更精准,ModelArts更新模型诊断功能
    Rust太难?那是你没看到这套Rust语言学习万字指南!
    资深码农:拿下软件测试,只需掌握好这两种方法!
    自定义TBE算子入门,不妨从单算子开发开始
    华为全栈AI技术干货深度解析,解锁企业AI开发“秘籍”
    2020 年终总结 & 2021 年度计划
    评分组件 Rate 的别样解法
  • 原文地址:https://www.cnblogs.com/chenshuo/p/4737310.html
Copyright © 2011-2022 走看看