php封裝數據庫函數

從Thinkphp裏面抽離出來的數據庫模塊,感受挺好用php

common.phphtml

<?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.phpmysql

<?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/目錄下ajax

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

}

 

例子:sql

#include "common.php"

function
test(){ $model = M(); $sql = "select * from test"; $list = $model->query($sql); _dump($list); }
相關文章
相關標籤/搜索