上一篇只是实现了xml和json格式数据的类的封装,不过它是没有数据的来源的;因此,本篇文章是封装一个调用数据库数据的方法,视频里面用的是mysql_connect()等函数,不过现在用这些函数会出现notice,因为这些函数已经过时了,将来可能不会再用到;其实完全可以不写这个类,因为PHP自带的调用数据库数据的类很齐全了。可以用PDO,也可以用mysqli;PDO在我的理解里,他就是一个纯类,面向对象调用数据库;而mysqli就不清楚了,既可以用mysqli_的函数,亦可以new 一个mysqli对象调用数据库,它是mysql的增强版。下面是各种API连接MySQL服务器的过程,当然只是简单的流程:术语API和扩展描述的不是同一类事物,因为扩展可能并不需要暴露一个API接口给程序员。
不过这里是实现一个单例模式的类!这个需要注意!什么叫单例模式?一个类只能拥有一个实例,它需要:
1、构造函数非public;
2、拥有一个保存类的静态变量;
3、拥有一个实例化类的公共静态方法;
这里我用mysqli_函数来实现这个单例模式,下面是连接数据库主要代码,这段代码也比较简单,但是需要考虑各种异常的情况,因为前端工程师不知道你写的什么,你需要将异常情况能够通俗易懂的形式显示出来。
一、数据库连接函数的实现:
public function connect(){
if(!self::$_connectSource){
self::$_connectSource = mysqli_connect(
$this->_dbConfig['host'],
$this->_dbConfig['user'],
$this->_dbConfig['password']);
//抛出数据库连接资源错误信息
if((!self::$_connectSource)){
throw new Exception('mysql connect error:'.mysqli_connect_error());
//die('mysql connect error:'.mysqli_connect_error);
}
mysqli_select_db(self::$_connectSource,$this->_dbConfig['database']);
mysqli_query(self::$_connectSource,"set names utf8");
}
return self::$_connectSource;
}
第一点:数据库资源连接。将其赋值给一个静态变量,self::$_connectSource,如果是我,可能就直接写$conn = mysqli_connect()了;
第二点:抛出数据连接资源错误信息。使用throw new Exception('mysql connect error:'.mysqli_connect_error());Exception是PHP5之后的异常类,可以直接调用;参考这篇文章https://www.jb51.net/article/30561.htm;这里写这段代码的原因是后面可以try catch指出错误,方便前端理解。另外,对几个mysqli的异常函数做个比较:
mysqli_connect_error():返回一个用字符串描述的最近一次的数据库连接错误;
mysqli_connect_errno():返回最近一次数据库连接的错误代码;
mysqli_error():返回一个用字符串描述的最近一次的函数使用错误;
mysqli_errno():返回最近一次的函数使用错误;
因此,在代码优化方面是不是可以考虑在mysqli_query()函数使用错误时抛出一个异常?比如:
if(!mysqli_query(self::$_connectSource,"set names utf8")){
throw new Exception('mysqli function error:'.mysqli_error());
};
第三点:为了不造成数据库连接资源的浪费,首先就需要判断一下是否已连接数据库,这一点对于我来说,的确很难去想到。
二、接下来重点,实现单例模式,其实就是instanceof使用;其次,这个函数返回的是一个实例!最后就是实现单例模式的三个条件:
1、构造函数非public;
2、拥有一个保存类的静态变量;
3、拥有一个实例化类的公共静态方法;
其中构造函数非public并没有怎么体现!
/*
*实现单例化自身的方法
*@param NULL
*return string
*/
static public function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self();
}
return self::$_instance;
}
三、从数据库中取出数据了,需要对其进行缓存,减少数据库服务器的负担,下一篇实现文件缓存类;
四、Db类实现,也可以在类中用mysqli类、PDO来实现。这里就不贴出来了。
'localhost',
'user'=>'root',
'password'=>'shapolang',
'database'=>'test',
);
private function __construct(){
}
/*
*实现单例化自身的方法
*@param NULL
*return string
*/
static public function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self();
}
return self::$_instance;
}
/*
*mysqli函数封装连接数据库方法
*@param NULL
*return source
*/
public function connect(){
if(!self::$_connectSource){
self::$_connectSource = mysqli_connect(
$this->_dbConfig['host'],
$this->_dbConfig['user'],
$this->_dbConfig['password']);
//抛出数据库连接资源错误信息
if((!self::$_connectSource)){
throw new Exception('mysql connect error:'.mysqli_connect_error());
//die('mysql connect error:'.mysqli_connect_error);
}
mysqli_select_db(self::$_connectSource,$this->_dbConfig['database']);
mysqli_query(self::$_connectSource,"set names utf8");
}
return self::$_connectSource;
}
}