php封装的数据库函数与用法示例【参考thinkPHP】

5年以前  |  阅读数:1094 次  |  编程语言:PHP 

本文实例讲述了php封装的数据库函数与用法。分享给大家供大家参考,具体如下:

从Thinkphp里面抽离出来的数据库模块,感觉挺好用

common.php:


    <?PHP
    /**
     * 通用函数
     */
    //包含配置文件
    if (is_file("config.php")) {
     C(include 'config.php');
    }
    if (!function_exists("__autoload")) {
     function __autoload($class_name) {
      require_once('classes/' . $class_name . '.class.php');
     }
    }
    /**
     * 数据库操作函数
     * @return \mysqli
     */
    function M() {
     $db = new Model();
     if (mysqli_connect_errno())
      throw_exception(mysqli_connect_error());
     return $db;
    }
    // 获取配置值
    function C($name = null, $value = null) {
     //静态全局变量,后面的使用取值都是在 $)config数组取
     static $_config = array();
     // 无参数时获取所有
     if (empty($name))
      return $_config;
     // 优先执行设置获取或赋值
     if (is_string($name)) {
      if (!strpos($name, '.')) {
       $name = strtolower($name);
       if (is_null($value))
        return isset($_config[$name]) ? $_config[$name] : null;
       $_config[$name] = $value;
       return;
      }
      // 二维数组设置和获取支持
      $name = explode('.', $name);
      $name[0] = strtolower($name[0]);
      if (is_null($value))
       return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
      $_config[$name[0]][$name[1]] = $value;
      return;
     }
     // 批量设置
     if (is_array($name)) {
      return $_config = array_merge($_config, array_change_key_case($name));
     }
     return null; // 避免非法参数
    }
    function ajaxReturn($data = null, $message = "", $status) {
     $ret = array();
     $ret["data"] = $data;
     $ret["message"] = $message;
     $ret["status"] = $status;
     echo json_encode($ret);
     die();
    }
    //调试数组
    function _dump($var) {
     if (C("debug"))
      dump($var);
    }
    // 浏览器友好的变量输出
    function dump($var, $echo = true, $label = null, $strict = true) {
     $label = ($label === null) ? '' : rtrim($label) . ' ';
     if (!$strict) {
      if (ini_get('html_errors')) {
       $output = print_r($var, true);
       $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
      } else {
       $output = $label . print_r($var, true);
      }
     } else {
      ob_start();
      var_dump($var);
      $output = ob_get_clean();
      if (!extension_loaded('xdebug')) {
       $output = preg_replace("/\]\=\>\n(\s+)/m", '] => ', $output);
       $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
      }
     }
     if ($echo) {
      echo($output);
      return null;
     }
     else
      return $output;
    }
    /**
     * 调试输出
     * @param type $msg
     */
    function _debug($msg) {
     if (C("debug"))
      echo "$msg<br />";
    }
    function _log($filename, $msg) {
     $time = date("Y-m-d H:i:s");
     $msg = "[$time]\n$msg\r\n";
     if (C("log")) {
      $fd = fopen($filename, "a+");
      fwrite($fd, $msg);
      fclose($fd);
     }
    }
    /**
     * 日志记录
     * @param type $str
     */
    function L($msg) {
     $time = date("Y-m-d H:i:s");
     $clientIP = $_SERVER['REMOTE_ADDR'];
     $msg = "[$time $clientIP] $msg\r\n";
     $log_file = C("LOGFILE");
     _log($log_file, $msg);
    }
    ?>

config.php:


    <?php
    /**
     * 数据库配置文件
     */
    $db = array(
     'DB_TYPE' => 'mysql',
     'DB_HOST' => '127.0.0.1',
     'DB_NAME' => 'DB',
     'DB_USER' => 'USER',
     'DB_PWD' => 'PWD',
     'DB_PORT' => '3306',
    );
    return $db;
    ?>

数据库模型类Model.class.php,放到classes/目录下:


    <?php
    /**
     * 数据库模型类
     */
    class Model {
     // 数据库连接ID 支持多个连接
     protected $linkID = array();
     // 当前数据库操作对象
     protected $db = null;
     // 当前查询ID
     protected $queryID = null;
     // 当前SQL指令
     protected $queryStr = '';
     // 是否已经连接数据库
     protected $connected = false;
     // 返回或者影响记录数
     protected $numRows = 0;
     // 返回字段数
     protected $numCols = 0;
     // 最近错误信息
     protected $error = '';
     public function __construct() {
      $this->db = $this->connect();
     }
     /**
      * 连接数据库方法
      */
     public function connect($config = '', $linkNum = 0) {
      if (!isset($this->linkID[$linkNum])) {
       if (empty($config))
        $config = array(
         'username' => C('DB_USER'),
         'password' => C('DB_PWD'),
         'hostname' => C('DB_HOST'),
         'hostport' => C('DB_PORT'),
         'database' => C('DB_NAME')
        );
       $this->linkID[$linkNum] = new mysqli($config['hostname'], $config['username'], $config['password'], $config['database'], $config['hostport'] ? intval($config['hostport']) : 3306);
       if (mysqli_connect_errno())
        throw_exception(mysqli_connect_error());
       $this->connected = true;
      }
      return $this->linkID[$linkNum];
     }
     /**
      * 初始化数据库连接
      */
     protected function initConnect() {
      if (!$this->connected) {
       $this->db = $this->connect();
      }
     }
     /**
      * 获得所有的查询数据
      * @access private
      * @param string $sql sql语句
      * @return array
      */
     public function select($sql) {
      $this->initConnect();
      if (!$this->db)
       return false;
      $query = $this->db->query($sql);
      $list = array();
      if (!$query)
       return $list;
      while ($rows = $query->fetch_assoc()) {
       $list[] = $rows;
      }
      return $list;
     }
     /**
      * 只查询一条数据
      */
     public function find($sql) {
      $resultSet = $this->select($sql);
      if (false === $resultSet) {
       return false;
      }
      if (empty($resultSet)) {// 查询结果为空
       return null;
      }
      $data = $resultSet[0];
      return $data;
     }
     /**
      * 获取一条记录的某个字段值 , sql 由自己组织
      * 例子: $model->getField("select id from user limit 1")
      */
     public function getField($sql) {
      $resultSet = $this->select($sql);
      if (!empty($resultSet)) {
       return reset($resultSet[0]);
      }
     }
     /**
      * 执行查询 返回数据集
      */
     public function query($str) {
      $this->initConnect();
      if (!$this->db) {
       if (C("debug"))
        echo "connect to database error";
       return false;
      }
      $this->queryStr = $str;
      //释放前次的查询结果
      if ($this->queryID)
       $this->free();
      $this->queryID = $this->db->query($str);
      // 对存储过程改进
      if ($this->db->more_results()) {
       while (($res = $this->db->next_result()) != NULL) {
        $res->free_result();
       }
      }
      //$this->debug();
      if (false === $this->queryID) {
       echo $this->error();
       return false;
      } else {
       $this->numRows = $this->queryID->num_rows;
       $this->numCols = $this->queryID->field_count;
       return $this->getAll();
      }
     }
     /**
      * 执行语句 , 例如插入,更新操作
      * @access public
      * @param string $str sql指令
      * @return integer
      */
     public function execute($str) {
      $this->initConnect();
      if (!$this->db)
       return false;
      $this->queryStr = $str;
      //释放前次的查询结果
      if ($this->queryID)
       $this->free();
      $result = $this->db->query($str);
      if (false === $result) {
       $this->error();
       return false;
      } else {
       $this->numRows = $this->db->affected_rows;
       $this->lastInsID = $this->db->insert_id;
       return $this->numRows;
      }
     }
     /**
      * 获得所有的查询数据
      * @access private
      * @param string $sql sql语句
      * @return array
      */
     private function getAll() {
      //返回数据集
      $result = array();
      if ($this->numRows > 0) {
       //返回数据集
       for ($i = 0; $i < $this->numRows; $i++) {
        $result[$i] = $this->queryID->fetch_assoc();
       }
       $this->queryID->data_seek(0);
      }
      return $result;
     }
     /**
      * 返回最后插入的ID
      */
     public function getLastInsID() {
      return $this->db->insert_id;
     }
     // 返回最后执行的sql语句
     public function _sql() {
      return $this->queryStr;
     }
     /**
      * 数据库错误信息
      */
     public function error() {
      $this->error = $this->db->errno . ':' . $this->db->error;
      if ('' != $this->queryStr) {
       $this->error .= "\n [ SQL语句 ] : " . $this->queryStr;
      }
      //trace($this->error, '', 'ERR');
      return $this->error;
     }
     /**
      * 释放查询结果
      */
     public function free() {
      $this->queryID->free_result();
      $this->queryID = null;
     }
     /**
      * 关闭数据库
      */
     public function close() {
      if ($this->db) {
       $this->db->close();
      }
      $this->db = null;
     }
     /**
      * 析构方法
      */
     public function __destruct() {
      if ($this->queryID) {
       $this->free();
      }
      // 关闭连接
      $this->close();
     }
    }

例子:


    #include "common.php"
    function test(){
     $model = M();
     $sql = "select * from test";
     $list = $model->query($sql);
     _dump($list);
    }

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例