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); }

 

 

posted @ 2014-02-28 10:14  ifeixiang  阅读(11929)  评论(0编辑  收藏  举报