文章目录
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);
?>