封装自己的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类时, ...
随机推荐
- Object-c 内存管理
内存管理 主要内容 1.内存管理的概念 2.引用计数 3.如何持有对象所有权 4.自动释放池 5.@property的使用 什么是内存管理 内存管理是关于如何管理对象生 ...
- WinForm任务栏最小化
在C#编写的WinForm里,在FormBorderStyle设为None的时候,任务栏点击程序图标,不会自动最小化.在主窗口WinForm.cs里加入如下代码后,即可恢复该功能. protected ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- android include进来的组件 调用其子元素
include标签包裹着一个可复用的布局: <include layout="@layout/footer_detail" android:id="@+id/foo ...
- [Spring] AOP, Aspect实例解析
最近要用到切面来统一处理日志记录,写了个小实例练了练手: 具体实现类: public interface PersonServer { public void save(String name); p ...
- maven权威指南学习笔记(二)——安装、运行、获取帮助
这部分在网上很容易找到详细教程,这里就略写了. 基础:系统有配置好的jdk,通过 命令行 java -version,有类似下面的提示,表示java环境以配好 下载maven:官网 http://ma ...
- HDFS操作
HDFS操作 1.shell 1.1 创建目录 hadoop fs -mkdir 目录名(其中/为根目录) 1.2 遍历目录 hadoop fs -ls 目录名 1.3 删除目录 hadoop fs ...
- c:out标签和el表达式与跨域攻击XSS
很多时候,在JSP中我们喜欢用EL表达式输出信息,但是最近发现这个确实存在个问题:XSS即跨域攻击. 下面看个例子: <c:out value="${student.name}&quo ...
- java微信公众号开发----搭建ngrok环境
下载ngrok,一个能够在公网安全访问内网Web主机的工具 下载地址:http://download.csdn.net/download/u014252425/9389847,亲测可用 下载完成后,进 ...
- 图片采用base64压缩,可以以字符串的形式传送base64给服务端转存为图片
(function () { var coverImage = document.querySelector('<div id="coverImage">file< ...