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 数组遍历的差异(array_diff 的实现)
Mar 23 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
php实现查看邮件是否已被阅读的方法
Dec 03 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
Nov 17 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
PHP ajax 异步执行不等待执行结果的处理方法
May 27 PHP
用PHP代码给图片加水印
Jul 01 PHP
PHP中的session安全吗?
Jan 22 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
Oct 18 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
Sony CFR 320 修复改造
2020/03/14 无线电
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
JSON 必知必会 观后记
2016/10/27 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
深入理解react-router 路由的实现原理
2018/09/26 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
python使用cookie库操保存cookie详解
2014/03/03 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
matplotlib subplots 调整子图间矩的实例
2018/05/25 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python使用pandas处理大数据节省内存技巧(推荐)
2019/05/05 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
苹果音乐订阅:Apple Music
2018/08/02 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
乡镇网格化管理实施方案
2014/03/23 职场文书
小学二年级评语
2014/04/21 职场文书
外出培训学习心得体会
2016/01/18 职场文书