封装自己的DB类(PHP)
封装一个DB类,用来专门操作数据库,以后凡是对数据库的操作,都由DB类的对象来实现。这样有了自己的DB类,写项目时简单的sql语句就不用每次写了,直接调用就行,很方便!
1.封装一个DB类。一个类文件应该只有一个类,其他的内容全部都没有。类文件的命名规则:类名.class.php
下面是创建DB类的代码:
<?php //封装一个DB类,用来专门操作数据库,以后凡是对数据库的操作,都由DB类的对象来实现
class DB{
//属性
private $host;
private $port;
private $user;
private $pass;
private $dbname;
private $charset;
private $prefix; //表前缀
private $link; //连接资源(连接数据库,一般会返回一个资源,所以需要定义一个link属性) //构造方法(作用:为了初始化对象的属性),会被自动调用
/*
* @param1 array $arr,默认为空,里面是一个关联数组,里面有7个元素
* array('host' => 'localhost','port' => '3306');
*/
public function __construct($arr = array()){
//初始化
$this->host = isset($arr['host']) ? $arr['host'] : 'localhost';//先判断是否有自己的host,如果有就用自己的host,否则就使用默认的localhost
$this->port = isset($arr['port']) ? $arr['port'] : '3306';
$this->user = isset($arr['user']) ? $arr['user'] : 'root';
$this->pass = isset($arr['pass']) ? $arr['pass'] : 'root';
$this->dbname = isset($arr['dbname']) ? $arr['dbname'] : 'mydatabase';
$this->charset = isset($arr['charset']) ? $arr['charset'] : 'utf8';
$this->prefix = isset($arr['prefix']) ? $arr['prefix'] : ''; //连接数据库(类是要操作数据库,因此要连接数据库)
$this->connect(); //设置字符集
$this->setCharset(); //选择数据库
$this->setDbname();
} /*
* 连接数据库
*/
private function connect(){
//mysql扩展连接
$this->link = mysql_connect($this->host . ':' . $this->port,$this->user,$this->pass); //判断结果
if(!$this->link){
//结果出错了
//暴力处理,如果是真实线上项目(生产环境)必须写入到日志文件
echo '数据库连接错误:<br/>';
echo '错误编号' . mysql_errno() . '<br/>';
echo '错误内容' . mysql_error() . '<br/>';
exit;
}
} /*
* 设置字符集
*/
private function setCharset(){
//设置
$this->db_query("set names {$this->charset}");
} /*
* 选择数据库
*/
private function setDbname(){
$this->db_query("use {$this->dbname}");
} /*
* 增加数据
* @param1 string $sql,要执行的插入语句
* @return boolean,成功返回是自动增长的ID,失败返回FALSE
*/
public function db_insert($sql){
//发送数据
$this->db_query($sql); //成功返回自增ID
return mysql_affected_rows() ? mysql_insert_id() : FALSE;
} /*
* 删除数据
* @param1 string $sql,要执行的删除语句
* @return Boolean,成功返回受影响的行数,失败返回FALSE
*/
public function db_delete($sql){
//发送SQL
$this->db_query($sql); //判断结果
return mysql_affected_rows() ? mysql_affected_rows() : FALSE;
} /*
* 更新数据
* @param1 string $sql,要执行的更新语句
* @return Boolean,成功返回受影响的行数,失败返回FALSE
*/
public function db_update($sql){
//发送SQL
$this->db_query($sql); //判断结果
return mysql_affected_rows() ? mysql_affected_rows() : FALSE;
} /*
* 查询:查询一条记录
* @param1 string $sql,要查询的SQL语句
* @return mixed,成功返回一个数组,失败返回FALSE
*/
public function db_getRow($sql){
//发送SQL
$res = $this->db_query($sql); //判断返回
return mysql_num_rows($res) ? mysql_fetch_assoc($res) : FALSE;
} /*
* 查询:查询多条记录
* @param1 string $sql,要查询的SQL语句
* @return mixed,成功返回一个二维数组,失败返回FALSE
*/
public function db_getAll($sql){
//发送SQL
$res = $this->db_query($sql); //判断返回
if(mysql_num_rows($res)){
//循环遍历
$list = array(); //遍历
while($row = mysql_fetch_assoc($res)){
$list[] = $row;
} //返回
return $list;
} //返回FALSE
return FALSE;
} /*
* mysql_query错误处理
* @param1 string $sql,需要执行的SQL语句
* @return mixed,只要语句不出错,全部返回
*/
private function db_query($sql){
//发送SQL
$res = mysql_query($sql); //判断结果
if(!$res){
//结果出错了
//暴力处理,如果是真实线上项目(生产环境)必须写入到日志文件
echo '语句出现错误:<br/>';
echo '错误编号' . mysql_errno() . '<br/>';
echo '错误内容' . mysql_error() . '<br/>';
exit;
}
//没有错误
return $res;
}
//__sleep方法
public function __sleep(){
//返回需要保存的属性的数组
return array('host','port','user','pass','dbname','charset','prefix');
} //__wakeup方法
public function __wakeup(){
//连接资源
$this->connect();
//设置字符集和选中数据库
$this->setCharset();
$this->setDbname();
} /*
* 获取完整的表名
*/
protected function getTableName(){
//完整表名:前缀+表名
return $this->prefix . $this->table;
}
}
//这个DB类,一般不写析构(不释放资源)
2.使用DB类,但是如果要使用某一个类来创建对象,必须要保证该类已经被加载到代码区里。可以使用一个魔术函数来实现对类的自动加载
自动加载:当一个脚本文件在执行某些语句的时候(实例化)需要去代码区里寻找对应的类,如果找不到会通过自动加载函数来将对应的类文件进行加载。
魔术函数:__autoload()
比如我们在index.php页面中需要使用DB类,那么我们就直接调用即可,具体代码如下:
<?php
//使用DB类的对象来访问数据库
//先加载类文件
//include_once 'DB.class.php';
//如果想使用其他类,又需要加载(所以使用魔术函数__autoload来实现类的自动加载)
//显示的写出魔术函数__autoload
//参数:需要加载的类的名字
function __autoload($a){
//将对应的类文件加载进来
if(is_file("$a.class.php")){
include_once "$a.class.php";
}
}
//实例化
$db = new DB(array('dbname' => 'mydatabase'));
封装自己的DB类(PHP)的更多相关文章
- nodejs操作mongodb数据库封装DB类
这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评. 上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关 ...
- 封装DB类
封装DB类 一般一个类单独书写在一个Php文件中,为了见名知意,会对文件名有一个规范:类名.class.php 第1步: 创建DB类 第2 步: 属性设计 第3步: 初 ...
- nodejs mongodb 数据库封装DB类 -转
使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关于mongoose的安装就是 npm install -g mongoose 这个DB类的数据库配置是 ...
- Discuz!数据库操作DB类和C::t类介绍
类定义文件 DB类: 文件\source\class\class_core.php class DB extends discuz_database {} discuz_database类定义 文件\ ...
- Laravel5.2中Eloquent与DB类的区别是什么?
要了解这些先看看关于数据库组件的那些事儿(就是 Eloquent ORM) 数据库组件大概分了三层: 数据库连接层 查询构造层 应用层 来看一下每一层有哪些东西,分别对应文档的哪一部分: 数据库连接层 ...
- Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类
Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...
- Redis操作Hash工具类封装,Redis工具类封装
Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...
- Redis操作字符串工具类封装,Redis工具类封装
Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...
- Jfinal中Db类的的使用
Jfinal提供了两种操作数据库的组件,分别是Model类和DB类,可以极大地减少代码量,提高开发效率. Db类提供了在Model类之外更丰富的的数据库操作能力,使用Db类以及嵌套的Record类时, ...
随机推荐
- iOS 系统数字键盘左下角加确定按钮
首先在 viewWillAppear 方法中注册监听相应的键盘通知,并且要在 viewWillDisappear 方法中注销通知- (void)viewWillAppear:(BOOL)animate ...
- js与jq对数组的操作
一.数组处理 1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长 ...
- XML带多属性解析为一个实体类(利用反射)
最近在对接一个银行的项目,大概就是类似一个钱包的功能,在请求返回的数据时,发现返回的数据标准的XML格式的支付串,格式如下 <kColl id="inputOrig" app ...
- 关于 Java(TM) Platform SE binary 已停止工作 的解决方法
一.问题描述 昨天晚上Myeclipse还用着好好的,今天早上打开工程,只要运行就卡住,大半天弹出个消息窗口:Java(TM) Platform SE binary 已停止工作. 如图 关闭Myecl ...
- Python初探-购物车程序
要求: 1,用户进入后,有欢迎语并提示用户输入本金 2.用户输入正确的内容后有购物菜单显示给用户 3.当用户的本金不足以购买商品的时候有提示余额不足并告知差额 4.成功购物后提示已购买内容和购买后的余 ...
- 修改cmd的字体为Consolas字体
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe] ...
- Win10商店东方财富网 UWP版更新,支持平板,PC,手机
东方财富股份有限公司 近日向Win10商店提交了东方财富网V4.1版,这次为广大Win10平台用户带来了期待已久的桌面版本,可谓是良心厂商,值得鼓励和支持.4.1主要更新: 1. 支持桌面Window ...
- AOP详解
什么是AOP AOP Aspect Oriented Programing 面向切面编程 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.事务管理.安全检查.缓存) Spring ...
- C# 文件读写
1.文本文件读写 //读 FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read); StreamReader ...
- Java随机生成18位身份证号
package com.ihome.data; import java.text.SimpleDateFormat; import java.util.Calendar; import java.ut ...