文章目录
- mysqli 数据库工具类
-
- 单例设计模式
- 代码实现
-
- 数据库初始化工作
- SQL执行方法 exec()
- SQL查询方法 query()
- SQL查询结果 fetchOne()
- SQL查询结果 fetchALL()
- SQL获取记录数 rowCount()
- 完整代码
mysqli 数据库工具类
单例设计模式
- 描述:一个类只能创建一个实例对象
- 设置要求(三私一公):
- 私有的静态保存对象属性
- 私有的构造方法,防止类外部new对象
- 私有的克隆方法,防止类外部clone对象
- 公共的静态创建对象的方法
代码实现
数据库初始化工作
<php?
class Db{
//私有的静态保存对象属性private static $db = null;//私有数据库配置信息private $db_host;//主机名private $db_user;//用户名private $db_pass;//密码private $db_name;//数据库名private $charset;//字符集private $link;//数据库连接对象//构造方法private function __construct($config = array()){
$this->db_host = $config['db_host'];$this->db_user= $config['db_user'];$this->db_pass= $config['db_pass'];$this->db_name= $config['db_name'];$this->charset = $config['charset'];$this->connectDB();//连接数据库$this->selectDb();//选择数据库$this->setCharset();//设置字符集}//连接数据库private function connectDb(){
if(!$this->link = @mysqli_connect($this->db_host,$this->db_user,$this->db_pass)){
die("连接MySQL数据库服务器失败!");}}//选择数据库private function selectDb(){
if(!mysqli_select_db($this->link,$this->db_name)){
die("选择数据库失败");}}//设置字符集private function setCharset(){
mysqli_set_charset($this->link,$this->charset);}//私有的克隆方法private function __clone(){
}//公共的静态创建对象方法public static function getInstance($config=array()){
//判断当前对象是否存在if(!self::$db instanceof self){
//如果对象不存在则创建对象self::$db = new self($config);}//存在则返回对象return self::$db;}//防止直接输出对象public function __toString(){
return "对象不能直接输出";}//防止对象当函数调用public function __invoke(){
echo "对象不能当函数使用";}//关闭数据库连接public function __destruct(){
mysqli_close($this->link);}
}$arr = array('db_host'=>'127.0.0.1','db_user'=>'root','db_pass'=>'root','db_name'=>'shitu','charset'=>'utf8',
); ?>
SQL执行方法 exec()
-
作用:公共的执行SQL语句的方法,insert、update、delete、set、drop等
-
返回值:布尔值,成功返回true,失败返回flase
-
方法代码
<?php //公共执行sql语句方法 public function exec($sql){ //对sql语句进行大小写转换$sql = strtolower($sql);//判断是否为SELECT语句if(substr($sql,0,6)=='select'){ die("该方法不能执行SELECT语句,请选择query()方法执行");}//返回执行结果值return mysqli_query($this->link,$sql); } ?>
方法调用
$db = Db::getInstance($arr); $sql = "INSERT INTO st_search_log(img_src,create_time,api_rel,show_rel) VALUES('/upload/images/test.jpg','".time()."','ok','ok')"; $rel= $db->exec($sql);
返回结果
bool(true)
SQL查询方法 query()
-
该方法定义为私有方法,由于其返回结果是一个结果集,需要类内处理再返回给用户
<?php private function query($sql){ //对sql语句进行大小写转换$sql = strtolower($sql);//判断是否为SELECT语句if(substr($sql,0,6)!='select'){ die("该方法只能执行SELECT语句");}//返回执行结果值return mysqli_query($this->link,$sql); } ?>
SQL查询结果 fetchOne()
-
查询单条数据,传递两个参数 SQL语句和返回结果类型
-
需要调用内部方法 query()执行SQL语句,再根据结果值和返回类型处理查询结果
<?php //查询单条数据/*** @param $sql* @param int $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH*/public function fetchOne($sql,$type=1){ //获取查询结果值$result = $this->query($sql);//判断查询结果类型switch ($type){ case 1:$type = MYSQLI_NUM;break;case 2:$type = MYSQLI_ASSOC;break;default:$type = MYSQLI_BOTH;}return mysqli_fetch_array($result,$type); } ?>
方法使用
<?php $db = Db::getInstance($arr); $sql = "SELECT * FROM st_search_log"; $rel = $db->fetchOne($sql,1); echo "<pre>"; var_dump($rel); ?>
返回结果
array(5) {[0]=>string(1) "1"[1]=>string(23) "/upload/images/test.jpg"[2]=>string(8) "12525555"[3]=>string(2) "ok"[4]=>string(2) "ok" }
SQL查询结果 fetchALL()
-
查询多行数据,传递两个参数 SQL语句和返回结果类型
-
需要调用内部方法 query()执行SQL语句,再根据结果值和返回类型处理查询结果
<?php//查询多行数据/*** @param $sql* @param int $type $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH* @return array|null*/public function fetchAll($sql,$type=1){ //获取查询结果值$result = $this->query($sql);//判断查询结果类型switch ($type){ case 1:$type = MYSQLI_NUM;break;case 2:$type = MYSQLI_ASSOC;break;default:$type = MYSQLI_BOTH;}return mysqli_fetch_all($result,$type);} ?>
方法使用
<?php $db = Db::getInstance($arr); $sql = "SELECT * FROM st_search_log"; $rel = $db->fetchAll($sql,1); echo "<pre>"; var_dump($rel);?>
输出结果
array(5) {[0]=>array(5) {[0]=>string(1) "1"[1]=>string(23) "/upload/images/test.jpg"[2]=>string(8) "12525555"[3]=>string(2) "ok"[4]=>string(2) "ok"}[1]=>array(5) {[0]=>string(1) "2"[1]=>string(23) "/upload/images/test.jpg"[2]=>string(1) "0"[3]=>string(2) "ok"[4]=>string(2) "ok"}....}
SQL获取记录数 rowCount()
-
获取数据库记录数
-
传递查询查询结果记录数
<?php //查询结果记录数 public function rowCount($sql){ //执行sql获取结果集$result = $this->query($sql);//返回结果记录数return mysqli_num_rows($result); } ?>
完整代码
<?php
/*** Created by 。* user: rufeike* email: rufeike@163.com* Date:2019/11/4* Time: 16:06*/class Db{
//私有的静态保存对象属性private static $db = null;//私有数据库配置信息private $db_host;//主机名private $db_user;//用户名private $db_pass;//密码private $db_name;//数据库名private $charset;//字符集private $link;//数据库连接对象//构造方法private function __construct($config = array()){
$this->db_host = $config['db_host'];$this->db_user= $config['db_user'];$this->db_pass= $config['db_pass'];$this->db_name= $config['db_name'];$this->charset = $config['charset'];$this->connectDB();//连接数据库$this->selectDb();//选择数据库$this->setCharset();//设置字符集}//连接数据库private function connectDb(){
if(!$this->link = @mysqli_connect($this->db_host,$this->db_user,$this->db_pass)){
die("连接MySQL数据库服务器失败!");}}//选择数据库private function selectDb(){
if(!mysqli_select_db($this->link,$this->db_name)){
die("选择数据库失败");}}//设置字符集private function setCharset(){
mysqli_set_charset($this->link,$this->charset);}//私有的克隆方法private function __clone(){
}//公共的静态创建对象方法public static function getInstance($config=array()){
//判断当前对象是否存在if(!self::$db instanceof self){
//如果对象不存在则创建对象self::$db = new self($config);}//存在则返回对象return self::$db;}//公共执行sql语句方法public function exec($sql){
//对sql语句进行大小写转换$sql = strtolower($sql);//判断是否为SELECT语句if(substr($sql,0,6)=='select'){
die("该方法不能执行SELECT语句,请选择query()方法执行");}//返回执行结果值return mysqli_query($this->link,$sql);}//私有查询语句private function query($sql){
//对sql语句进行大小写转换$sql = strtolower($sql);//判断是否为SELECT语句if(substr($sql,0,6)!='select'){
die("该方法只能执行SELECT语句");}//返回执行结果值return mysqli_query($this->link,$sql);}//查询单条数据/*** @param $sql* @param int $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH*/public function fetchOne($sql,$type=1){
//获取查询结果值$result = $this->query($sql);//判断查询结果类型switch ($type){
case 1:$type = MYSQLI_NUM;break;case 2:$type = MYSQLI_ASSOC;break;default:$type = MYSQLI_BOTH;}return mysqli_fetch_array($result,$type);}//查询多行数据/*** @param $sql* @param int $type $type 1=>MYSQLI_ASSOC,2=>MYSQLI_NUM,3=>MYSQLI_BOTH* @return array|null*/public function fetchAll($sql,$type=1){
//获取查询结果值$result = $this->query($sql);//判断查询结果类型switch ($type){
case 1:$type = MYSQLI_NUM;break;case 2:$type = MYSQLI_ASSOC;break;default:$type = MYSQLI_BOTH;}return mysqli_fetch_all($result,$type);}//查询结果记录数public function rowCount($sql){
//执行sql获取结果集$result = $this->query($sql);//返回结果记录数return mysqli_num_rows($result);}//防止直接输出对象public function __toString(){
return "对象不能直接输出";}//防止对象当函数调用public function __invoke(){
echo "对象不能当函数使用";}//关闭数据库连接public function __destruct(){
mysqli_close($this->link);}
}$arr = array('db_host'=>'127.0.0.1','db_user'=>'root','db_pass'=>'root','db_name'=>'shitu','charset'=>'utf8',
);
$db = Db::getInstance($arr);
//$sql = "INSERT INTO st_search_log(img_src,create_time,api_rel,show_rel) VALUES('/upload/images/test.jpg','".time()."','ok','ok')";
//$rel= $db->exec($sql);
$sql = "SELECT * FROM st_search_log";
$rel = $db->rowCount($sql);echo "<pre>";
var_dump($rel);?>