封装一个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)的更多相关文章

  1. nodejs操作mongodb数据库封装DB类

    这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评. 上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关 ...

  2. 封装DB类

    封装DB类     一般一个类单独书写在一个Php文件中,为了见名知意,会对文件名有一个规范:类名.class.php 第1步:     创建DB类 第2 步:     属性设计 第3步:     初 ...

  3. nodejs mongodb 数据库封装DB类 -转

    使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关于mongoose的安装就是 npm install -g mongoose 这个DB类的数据库配置是 ...

  4. Discuz!数据库操作DB类和C::t类介绍

    类定义文件 DB类: 文件\source\class\class_core.php class DB extends discuz_database {} discuz_database类定义 文件\ ...

  5. Laravel5.2中Eloquent与DB类的区别是什么?

    要了解这些先看看关于数据库组件的那些事儿(就是 Eloquent ORM) 数据库组件大概分了三层: 数据库连接层 查询构造层 应用层 来看一下每一层有哪些东西,分别对应文档的哪一部分: 数据库连接层 ...

  6. Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类

     Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...

  7. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  8. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

  9. Jfinal中Db类的的使用

    Jfinal提供了两种操作数据库的组件,分别是Model类和DB类,可以极大地减少代码量,提高开发效率. Db类提供了在Model类之外更丰富的的数据库操作能力,使用Db类以及嵌套的Record类时, ...

随机推荐

  1. python之模块

    模块即一推代码的集合来实现某个功能,使用时直接调用,甚是方便. 模块又分为三种 自定义模块 内置模块 第三方模块 下面就来介绍介绍什么是内置模块及如何去使用它和内置模块的好处. 使用模块模块前首先导入 ...

  2. startUML破解方式

    StarUML官方下载地址:http://staruml.io/download StarUML是一个非常好用的画UML图的工具,但是它是收费软件​,以下是破解方法: ​1.使用Editplus或者N ...

  3. Linux下设置Mysql数据库编码

    重装系统后,要装个mysql服务器,发现添加数据时,一直错误,查其原因,原来时编码问题.Google了一下,可都不太一样,可能时数据库版本问题吧. 查看数据库版本: select version(); ...

  4. Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程)

    Windows7 64位系统搭建Cocos2d-x-2.2.1最新版以及Android交叉编译环境(详细教程) 声明:本教程在参考了以下博文,并经过自己的摸索后实际操作得出,本教程系本人原创,由于升级 ...

  5. 【iOS】Jenkins Gitlab持续集成打包平台搭建

    Jenkins Gitlab持续集成打包平台搭建 SkySeraph July. 18th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点: ...

  6. HDU 5945 / BestCoder Round #89 1002 Fxx and game 单调队列优化DP

    Fxx and game 问题描述   青年理论计算机科学家Fxx给的学生设计了一款数字游戏. 一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面 ...

  7. win10控制台程序printf死锁问题

    昨天遇到一个奇葩的问题,服务器正常运行但经常出现客户端无法连接的问题.我很好奇,在accept返回的地方断点,发现无法accept了.这就怪了,以前从没出现过这种情况.服务器网络用的asio,无法ac ...

  8. C#解析json文件的方法

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...

  9. Jaunt登陆索尼PSVR,为其提供大量VR视频

    索尼PS VR自从推出就广受用户青睐,当然不仅仅是其低于高端VR头显的价格,还在于PS VR提供的丰富游戏内容.近日,国外视频网站Jaunt还专门为PSVR推出了专版APP,为其提供超过 150 个沉 ...

  10. Windows中使用TortoiseGit提交项目到GitLab配置

    下文来给各位介绍Windows中使用TortoiseGit提交项目到GitLab配置过程,下在全部图片希望对各位带来方便面. Gitlab默认的配置推荐使用shell命令行与server端进行交互,作 ...