从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封装数据库函数的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  2. [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数

    前言:本文以学习记录的形式发表出来,前段时间苦于照模型聚合中group by 找了很久,官方文章中没有很明确的说出group by,但在文档中有提到!!! 正文(最后编辑于2016-11-12): 聚 ...

  3. JSP-07-使用JavaBean封装数据

    7.1 常命包名 Dao 包中的接口(NewsDao)以及类(NewsDaoImpl)注意负责和数据操作相关的事情. Service 包中的接口和类对dao的方法进行封装和调用,注意负责和业务逻辑相关 ...

  4. PHP学习之[第09讲]PHP 的 Mysql 数据库函数 (微型博客系统)

    一.数据库函数: mysql_connect(数据库地址,用户名,密码) mysql_select_db(数据库名) mysql_set_chartset(‘编码’) //PHP5.2.3以后的函数 ...

  5. php Mysql 和Mysqli数据库函数整合

    PHP Mysql和Mysqli数据库函数整合 服务器如果支持mysqli函数将优先mysqli函数进行数据库操作 否则将调用mysql函数进行数据库操作 用法SQL::connect(host,us ...

  6. json和xml封装数据、数据缓存到文件中

    一.APP的通信格式之xml xml:扩展标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己标记语言进行定义的源语言.XML格式统一,扩平台语言,非常适合数据传输和通信,业界公认的标准. ...

  7. 预先封装数据的思路.md

    预先封装数据的思路.md python3 最近有两位同学开发开发了用程序在线竞猜数字的小游戏,可以通过以下两个网址去玩: bbaa的游戏 http://bbaass.tk/math/ codetige ...

  8. xml方式封装数据方法

    1.xml方式封装数据方法 2.demo <?php xml方式封装数据方法 /** * [xmlEncode description] * @param [type] $code [descr ...

  9. 关于双重for循环封装数据问题

    1.问题描述 在使用双重for循环进行封装数据时出现一个问题,就是有的数据封装上了,有的数据未封装上,找了很久原因: for (A a:ListA) { for (B b: ListB) { if(a ...

随机推荐

  1. CSS3提交意见输入框样式

    做了个输入框样式,如图: CSS代码例如以下: #button { cursor:pointer; width:30%; margin:5px; padding:8px; border-radius: ...

  2. (算法)AA制

    题目: A.B.C.D四个人去吃大餐,吃饭去说好,付钱时AA制,但最后结账时,因为4个人带的钱不一样多,最后A付了112元,B付了86元,C付了10元,D没带钱,所以没有付: 但AA制需要平摊餐费,所 ...

  3. 人生规划和GTD——"知"、"得"与"合"

    作为<小强升职记>的读书感悟,给我自己.作为分享,也送给或许需要的给你. 我不知道你是否真的需要.但我受Amy师姐等一众人的影响,已经爱上了分享.呵呵,话也可以倒过来说,其实分享也就是爱. ...

  4. C++缓冲区溢出

    测试代码: #include <stdlib.h> #include <string.h> #include <stdio.h> int main() { ] =& ...

  5. 使用docker api

    前提: 系统centos 7 docker version 1.10.3 使用systemd启动docker 访问方式: 修改/usr/lib/systemd/system/docker.servic ...

  6. MySql 比Replace Into更适合的用法,外加SqlServer的方式。

    Mysql: INSERT INTO `his_examine_result` (Mid,His_Examine_Mid, His_File_Mid, ResultType, His_Employee ...

  7. #define barrier() __asm__ __volatile__("": : :"memory") 中的memory是gcc的东西

    gcc内嵌汇编简介 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作 ...

  8. HttpLuaModule——翻译(二)

    access_by_lua access阶段.事例: location / { deny 192.168.1.1; allow ; allow ; deny all; access_by_lua ' ...

  9. 关于 qtchooser

    关于这个工具,我有一万个 mmp 要讲.之前为了图省事,直接手动把 qmake 的链给改掉了,总觉得这样不大科学. 恩,系统既然提供了 qtchooser 那就用用吧.但是,尝试之后觉得做得跟屎一样. ...

  10. MobX快速入门教程(重要概念讲解)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7372119.html 一:Mobx工作流程图 二:MobX涉及到的概念 1:状态state 组件中的数据. 2 ...