批改状态:合格
老师批语:
通过单例模式链接数据库,保证实例化只发生一次,可以减轻服务器负载。
<?php
//单例模式链接数据
interface iDbBase
{
//数据库操作 curd
static function insert($db,$data);
static function select($db,$where=[]);
static function delete($db,$where=[]);
static function update($db,$data,$where=[]);
static function doConnect($dsn,$username,$password);
}
abstract class aDb implements iDbBase
{
//创建类的唯一实例 pdo对象
private static $_instance;
//阻止此类在外部实例化
private function __construct()
{
}
// 阻止此类在外部克隆
private function __clone()
{
}
//声明连接数据库的静态方法
static function doConnect($dsn,$username,$password)
{
//判断是否已实例化,未实例化进行实例化,否则返回实例
if(is_null(self::$_instance))
{
//得到PDO连接对象 储存在$_instance
self::$_instance = new PDO($dsn,$username,$password);//抽象类不能被实例化 这里可以实例化系统类PDO
}
return self::$_instance;
}
}
//工作类
class Db extends aDb
{
//数据库操作 增加插入
static function insert($db,$data)
{
//创建两个空字符串存储数据
$str1 = '';
$str2 = '';
//遍历数据数组,并拼接为sql语句识别的部分内容
foreach($data as $k=>$v)
{
//进一步判断$data是否是数组,如果是则执行拼接
if(is_array($data))
{
$str1 .= "`".$k."`,";
$str2 .= "'".$v."',";
}
}
//去掉最后一位产生的","
$str1 = substr($str1,0,strlen($str1)-1);
$str2 = substr($str2,0,strlen($str2)-1);
//使用PDO::exec()执行sql语句并返回影响行数,并在内部对sql语句进行正确拼接
return $db->exec("INSERT INTO `id_list` ($str1) VALUES ($str2)");
}
//数据库操作 查询
static function select($db,$where=['id'=>1,'age'=>18])
{
//声明一个空字符串
$str = '';
//遍历查询数组,并拼接为sql语句识别的部分内容
foreach($where as $k=>$v)
{
//进一步判断$where是否是数组,如果是则执行拼接
if(is_array($where))
{
//判断$where是否只有多对数组,如果有末尾加上"and",否则不加
if(count($where)>1)
{
$str .= $k . ' = ' . $v . ' and ';
}else{
$str .= $k . ' = ' . $v;
}
}
}
//判断$where是否只有多对数组,如果是则对上面处理的拼接做进一步处理,将末尾多出的and去掉
if(count($where)>1)
{
$str = substr($str,0,strlen($str)-4);
}
//query方法 fetchALL(PDO::FETCH_ASSOC)取关联数组 以取结果集的形式去取
return $db->query("SELECT `id`,`username`,`password` FROM `id_list` WHERE $str")->fetchALL(PDO::FETCH_ASSOC);
}
//数据库操作 删除
static function delete($db,$where=['id'=>2])
{
//声明一个空字符串
$str = '';
//遍历查询数组,并拼接为sql语句识别的部分内容
foreach($where as $k=>$v)
{
//进一步判断$where是否是数组,如果是则执行拼接
if(is_array($where))
{
//判断$where是否只有多对数组,如果有末尾加上"and",否则不加
if(count($where)>1)
{
$str .= $k . ' = ' . $v . ' and ';
}else{
$str .= $k . ' = ' . $v;
}
}
}
//判断$where是否只有多对数组,如果是则对上面处理的拼接做进一步处理,将末尾多出的and去掉
if(count($where)>1)
{
$str = substr($str,0,strlen($str)-4);
}
//使用PDO::exec()执行sql语句并返回影响行数,并在内部对sql语句进行正确拼接
return $db->exec("DELETE FROM `id_list` WHERE `id_list`.$str");
}
//数据库操作 修改数据库数据信息
static function update($db,$data,$where=['id'=>6])
{
//创建两个空字符串存储数据
$str = '';
$str1 = '';
//遍历数据数组,并拼接为sql语句识别的部分内容
foreach($data as $k=>$v)
{
//进一步判断$data是否是数组,如果是则执行拼接
if(is_array($data))
{
$str1 .= "`".$k."`='".$v."',";
}
}
//去掉最后一位产生的","
$str1 = substr($str1,0,strlen($str1)-1);
//变量查询数组,并拼接为sql语句识别的部分内容
foreach($where as $k=>$v)
{
//进一步判断$where是否是数组,如果是则执行拼接
if(is_array($where))
{
//判断$where是否只有多对数组,如果有末尾加上"and",否则不加
if(count($where)>1)
{
$str .= $k . ' = ' . $v . ' and ';
}else{
$str .= $k . ' = ' . $v;
}
}
}
//判断$where是否只有多对数组,如果是则对上面处理的拼接做进一步处理,将末尾多出的and去掉
if(count($where)>1)
{
$str = substr($str,0,strlen($str)-4);
}
//使用PDO::exec()执行sql语句并返回影响行数,并在内部对sql语句进行正确拼接
return $db->exec("UPDATE `id_list` SET $str1 WHERE `id_list`.$str");
}
}
//客户端代码
$dsn ='mysql:host=localhost;dbname=test';//数据库链接信息
$db = Db::doConnect($dsn,'root','');//登录数据库账号密码
// $data = ['id'=>5,'username'=>'admin5','password'=>'admin7890','age'=>16];//新增插入测试数据
$data = ['id'=>2,'username'=>'admin2','password'=>'admin456','age'=>18];//修改测试数据
// print_r(Db::select($db));//查询语句执行
// echo (Db::insert($db,$data));//插入语句执行
// echo (Db::delete($db));//删除语句执行
echo (Db::update($db,$data));//修改更新语句执行点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号