Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
通过单例模式链接数据库,保证实例化只发生一次,可以减轻服务器负载。
<?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));//修改更新语句执行
点击 "运行实例" 按钮查看在线实例