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


Posted in PHP onNovember 08, 2016

本文实例讲述了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 相关文章推荐
PHP 截取字符串函数整理(支持gb2312和utf-8)
Feb 16 PHP
PHP 引用是个坏习惯
Mar 12 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
php无限极分类实现的两种解决方法
Apr 28 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
zf框架的校验器InArray使用示例
Mar 13 PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 PHP
php基于curl重写file_get_contents函数实例
Nov 08 #PHP
php发送http请求的常用方法分析
Nov 08 #PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 #PHP
php执行多个存储过程的方法【基于thinkPHP】
Nov 08 #PHP
php实现的http请求封装示例
Nov 08 #PHP
PHP实现原生态图片上传封装类方法
Nov 08 #PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
Nov 07 #PHP
You might like
php过滤危险html代码
2008/08/18 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
javascript高级学习笔记整理
2011/08/14 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
简单的js表格操作
2016/09/24 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
JavaScript常见继承模式实例小结
2019/01/11 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
利用Python进行图像的加法,图像混合(附代码)
2019/07/14 Python
python画微信表情符的实例代码
2019/10/09 Python
基于Django实现日志记录报错信息
2019/12/17 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
纽约现代艺术博物馆商店:MoMA STORE(室内家具和杂货商品)
2016/08/02 全球购物
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
转正申请报告格式
2015/05/15 职场文书
复活读书笔记
2015/06/29 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
vue修饰符.capture和.self的区别
2022/04/22 Vue.js