MySQLDB类工具的封装

  面向对象编程的过程中,经常要用到动态数据来填充静态网页,而动态数据往往来自于数据库,为了不用每此创建一个脚本都要重新打一遍连接数据库以及其它的获取资源结果集的代码,因此封装一个数据库的工具类文件就显得尤为重要了。

  数据库工具类的封装,要实现的基本功能要有初始化数据库连接的信息,例如端口、主机号、字符集和数据库名等,然后就是一些常用的功能,例如查询表后获取一个多行多列,单行多列和单行单列的结果集,还有就是一个能用于查询的方法,能够完成查询并返回结果集的功能,并且人为地提示错误信息等,因为数据库采用静默模式,因此默认情况下并不会报错。

  1 <?php
  2
  3 header("content-type:text/html;charset=utf-8");
  4 //MySQLDB类
  5 class MySQLDB{
  6     private $host;    //主机地址
  7     private $port;    //端口号
  8     private $user;    //用户名
  9     private $pass;    //密码
 10     private $charset;//字符集
 11     private $dbname;    //数据库名
 12     private $link;    //连接资源
 13     private static $instance; //保存对象
 14
 15     private function __construct($arr){
 16         $this->host=isset($arr[‘host‘]) ? $arr[‘host‘] : "localhost";
 17         $this->port=isset($arr[‘port‘]) ? $arr[‘port‘] : "3306";
 18         $this->user=isset($arr[‘user‘]) ? $arr[‘user‘] : "root";
 19         $this->pass=isset($arr[‘pass‘]) ? $arr[‘pass‘] : "";
 20         $this->charset=isset($arr[‘charset‘]) ? $arr[‘charset‘] : "utf8";
 21         $this->dbname=isset($arr[‘dbname‘]) ? $arr[‘dbname‘] : "";
 22
 23         $this->my_connect();
 24
 25         $this->my_charset();
 26
 27         $this->my_dbname();
 28     }
 29
 30     public static function getInstance($arr){
 31         if(!self::$instance instanceof self){
 32             self::$instance = new self($arr);
 33         }
 34         return self::$instance;
 35     }
 36
 37     //连接数据的方法
 38     private function my_connect(){
 39         if($link = @ mysql_connect("$this->host:$this->port",$this->user,$this->pass)){
 40             //连接成功
 41             $this->link = $link;
 42         }else{
 43             //连接失败
 44             echo "连接数据库失败<br/>";
 45             echo "错误代码 ",mysql_errno(), "<br/>";
 46             echo "错误信息 ",mysql_error(), "<br/>";
 47             die;
 48         }
 49     }
 50
 51     //sql语句执行方法
 52     public function my_query($sql){
 53         $result=mysql_query($sql);
 54         if(!$result){
 55             //执行失败
 56             echo "执行SQL语句失败<br/>";
 57             echo "错误代码 ",mysql_errno(), "<br/>";
 58             echo "错误信息 ",mysql_error(), "<br/>";
 59             echo "错误语句 ",$sql, "<br/>";
 60             die;
 61         }else{
 62             //执行成功
 63             return $result;
 64         }
 65     }
 66
 67     public function fetchAll($sql){
 68         if($result = $this->my_query($sql)){
 69             //执行成功,遍历结果集
 70             $rows = array();
 71             while($row = mysql_fetch_assoc($result)){
 72                 $rows[] = $row;
 73             }
 74             //结果资源集用完之后最好手动释放
 75             mysql_free_result($result);
 76             //提取成功后返回一个二维数组或空数组
 77             return $rows;
 78         }else{
 79             return false;
 80         }
 81     }
 82
 83     public function fetchRow($sql){
 84         if($result = $this->my_query($sql)){
 85             //执行成功就返回一个一维数组
 86             $row = mysql_fetch_assoc($result);
 87             //提取结果集后手动释放
 88             mysql_free_result($result);
 89             //返回所有数据或空数组
 90             return $row;
 91         }else{
 92             return flase;
 93         }
 94     }
 95
 96     public function fetchColumn($sql){
 97         if($result = $this->my_query($sql)){
 98             //执行语句成功,提取结果集
 99             $row = mysql_fetch_row($result);
100             //提取完后主动释放结果集
101             mysql_free_result($result);
102             //返回结果
103             return isset($row[0]) ? $row[0] : flase;
104         }else{
105             return flase;
106         }
107     }
108
109     //选择默认字符集
110     private function my_charset(){
111         $sql = "set names $this->charset";
112         $this->my_query($sql);
113     }
114
115     //选择默认数据库
116     private function my_dbname(){
117         $sql = "use $this->dbname";
118         $this->my_query($sql);
119     }
120
121     public function __destruct(){
122         @ mysql_close($this->link);
123     }
124
125     public function __sleep(){
126         //序列化数据之前,系统自动调用的方法,可以确定哪些数据需要序列化
127         return array(‘host‘,‘port‘,‘user‘,‘pass‘,‘charset‘,‘dbname‘);
128     }
129
130     public function __wakeup(){
131         //反序列化的时候,系统自动调用的方法
132         //连接数据库三部曲
133         //连接数据库
134         $this->my_connect();
135         //选择默认字符集
136         $this->my_charset();
137         //选择默认数据库
138         $this->my_dbname();
139     }
140
141     public function __set($name,$value){
142         $allow_set = array(‘host‘,‘port‘,‘user‘,‘pass‘,‘charset‘,‘dbname‘);
143         if(in_array($name, $allow_set)){
144             $this->$name = $value;
145         }
146     }
147
148     public function __get($name){
149         $allow_get = array(‘host‘,‘port‘,‘charset‘,‘dbname‘);
150         if(in_array($name, $allow_get)){
151             return $this->$name;
152         }else{
153             return flase;
154         }
155     }
156
157     public function __isset($name){
158         $allow_isset = array(‘host‘,‘port‘,‘user‘,‘pass‘,‘charset‘,‘dbname‘);
159         if(in_array($name, $allow_isset)){
160             return true;
161         }else{
162             return flase;
163         }
164     }
165
166     public function __unset($name){
167         //unset什么功能都不用实现
168     }
169
170     private function __clone(){
171
172     }
173 }
时间: 2024-11-10 07:26:34

MySQLDB类工具的封装的相关文章

在线数据库表(sql语句)生成java实体类工具 - 参考手册

SQL建表语句 说明 格式良好的SQL建表语句,可以是直接从PowerDesigner.Navicat等工具中导出SQL建表语句.所谓格式良好,是指建表指令与表名必须在一行,字段名称.类型.注释必须在一行,因为这个工具是用正则实现的,并不是语法解析器,当然,以后有时间的话,会改进成解析器. 举例 -- ---------------------------- -- Table structure for t_activity -- ---------------------------- DRO

[028] 微信公众帐号开发教程第4篇-消息及消息处理工具的封装

工欲善其事必先利其器!本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用.这里需要明确的是消息其实是由用户发给你的公众帐号的,消息先被微信平台接收到,然后微信平台会将该消息转给你在开发模式接口配置中指定的URL地址. 微信公众平台消息接口 要接收微信平台发送的消息,我们需要先熟悉微信公众平台API中消息接口部分,点此进入,点击后将进入到消息接口指南部分,如下图所示: 在上图左侧可以看到微信公众平台目前开放的接口有三种:消息接口.通用接口和自定义菜单接口.通用

开发类工具

10年工作经验老程序员推荐的7个开发类工具 做.NET软件工作已经10年了,从程序员做到高级程序员,再到技术主管,技术总监.见证了Visual Studio .NET 2003,Visul Studio 2005, Visual Studio Team System 2008, Visual Studio 2010 Ultimate,Visual Studio 2013一系列近5个版本的变化与亲自使用.每一个版本都有深刻有意义的变革.Visual Studio .NET 2003 极力推广的We

在线数据库表(sql语句)生成java实体类工具

相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设计的一定是数据库表结构,而不是实体类.实体类仅仅是对底层数据结构的有损压缩,它仅仅是数据载体,不具备数据归档能力. 因此,很多时候,我们需要将原始的SQL建表语句转换成java实体类,这项工作看似简单,但若人工完成,工作量也是相当可观的,而且难免会出现差错. 到目前为止,笔者还没有发现比较靠谱的此类

中关村-DIY之主流笔记类工具比较

主流笔记工具比较 目前主流的笔记类工具Evernote.有道云笔记.OneNote.workflow.幕布.dynalist等,前三个侧重知识管理,后三个倾向于任务清单. 1.Evernote 国外最流行的二个工具之一,拥有大量的用户,知识管理功能主要依赖于客户端,网页版比较简单. 1   网页抓取需要安装浏览器插件,但网页版无法配合插件保存到笔记. 2   笔记可以导出专用格式,还有HTML格式 3   网页版仅有任务清单类功能,支持表格.代码.链接.附件等,没有图片和导出 2.OneNote

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能 参考网上的资料,简单封装了一下ffmpeg,这里记录一下,其它传感器编码及项目中用到的已经抽离,这里只包含解码和录像部分.这只是个玩具级别的测试.完整测试代码下载:代码下载 ffmpegDeCode.h #pragma once #include "stdafx.h" #include<iostream> using namespace std; extern char *VideoPath; exte

并查集类的c++封装,比较union_find algorithm四种实现方法之间的性能差别

问题描述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构: Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集: Union:将两个子集合并成同一个集合: 实现并查集的关键是实现union-find algorithm, 本文根据常用的四种算法,实现了这个类,具体算法实现请参看维基百科: 制造测试数据集,

Class类工具 - ClassUtils.java

Class类工具,提供操作class类的方法.<br/>比如:获知类.方法上是否有注解,获取类注解,获取某package下所有class等. 源码如下:(点击下载 - ClassUtils.java ) import java.io.File; import java.io.FileFilter; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Field;

一个依靠STL vector的接口进行申请和回收管理的内存池类( c++ 封装)

其他出现两次,只有一个出现一次的那道题我就不更了,直接抑或,最后的结果就是那个数.为什么可以这样做呢?因为一个32位int,如果所有数都出现了两次,那么为1的那些位统计的个数一定是2的倍数,抑或之后全变成0.一个数出现了一次,它为1的那些位上,1的个数必定是奇数,抑或之后一定还是1. 我之前知道出现两次这个题的解法,但是理解的不够深,以为抑或是关键,其实不是,出现了偶数次才是关键.理解了这点,推广到出现3次上,如果所有的出现了三次,那么为1的那些位1的个数一定是三的倍数,那如果有一个数出现了一次