
批改狀態(tài):合格
老師批語:
通過單例模式鏈接數(shù)據(jù)庫,保證實(shí)例化只發(fā)生一次,可以減輕服務(wù)器負(fù)載。
<?php //單例模式鏈接數(shù)據(jù) interface iDbBase { //數(shù)據(jù)庫操作 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 { //創(chuàng)建類的唯一實(shí)例 pdo對象 private static $_instance; //阻止此類在外部實(shí)例化 private function __construct() { } // 阻止此類在外部克隆 private function __clone() { } //聲明連接數(shù)據(jù)庫的靜態(tài)方法 static function doConnect($dsn,$username,$password) { //判斷是否已實(shí)例化,未實(shí)例化進(jìn)行實(shí)例化,否則返回實(shí)例 if(is_null(self::$_instance)) { //得到PDO連接對象 儲存在$_instance self::$_instance = new PDO($dsn,$username,$password);//抽象類不能被實(shí)例化 這里可以實(shí)例化系統(tǒng)類PDO } return self::$_instance; } } //工作類 class Db extends aDb { //數(shù)據(jù)庫操作 增加插入 static function insert($db,$data) { //創(chuàng)建兩個空字符串存儲數(shù)據(jù) $str1 = ''; $str2 = ''; //遍歷數(shù)據(jù)數(shù)組,并拼接為sql語句識別的部分內(nèi)容 foreach($data as $k=>$v) { //進(jìn)一步判斷$data是否是數(shù)組,如果是則執(zhí)行拼接 if(is_array($data)) { $str1 .= "`".$k."`,"; $str2 .= "'".$v."',"; } } //去掉最后一位產(chǎn)生的"," $str1 = substr($str1,0,strlen($str1)-1); $str2 = substr($str2,0,strlen($str2)-1); //使用PDO::exec()執(zhí)行sql語句并返回影響行數(shù),并在內(nèi)部對sql語句進(jìn)行正確拼接 return $db->exec("INSERT INTO `id_list` ($str1) VALUES ($str2)"); } //數(shù)據(jù)庫操作 查詢 static function select($db,$where=['id'=>1,'age'=>18]) { //聲明一個空字符串 $str = ''; //遍歷查詢數(shù)組,并拼接為sql語句識別的部分內(nèi)容 foreach($where as $k=>$v) { //進(jìn)一步判斷$where是否是數(shù)組,如果是則執(zhí)行拼接 if(is_array($where)) { //判斷$where是否只有多對數(shù)組,如果有末尾加上"and",否則不加 if(count($where)>1) { $str .= $k . ' = ' . $v . ' and '; }else{ $str .= $k . ' = ' . $v; } } } //判斷$where是否只有多對數(shù)組,如果是則對上面處理的拼接做進(jìn)一步處理,將末尾多出的and去掉 if(count($where)>1) { $str = substr($str,0,strlen($str)-4); } //query方法 fetchALL(PDO::FETCH_ASSOC)取關(guān)聯(lián)數(shù)組 以取結(jié)果集的形式去取 return $db->query("SELECT `id`,`username`,`password` FROM `id_list` WHERE $str")->fetchALL(PDO::FETCH_ASSOC); } //數(shù)據(jù)庫操作 刪除 static function delete($db,$where=['id'=>2]) { //聲明一個空字符串 $str = ''; //遍歷查詢數(shù)組,并拼接為sql語句識別的部分內(nèi)容 foreach($where as $k=>$v) { //進(jìn)一步判斷$where是否是數(shù)組,如果是則執(zhí)行拼接 if(is_array($where)) { //判斷$where是否只有多對數(shù)組,如果有末尾加上"and",否則不加 if(count($where)>1) { $str .= $k . ' = ' . $v . ' and '; }else{ $str .= $k . ' = ' . $v; } } } //判斷$where是否只有多對數(shù)組,如果是則對上面處理的拼接做進(jìn)一步處理,將末尾多出的and去掉 if(count($where)>1) { $str = substr($str,0,strlen($str)-4); } //使用PDO::exec()執(zhí)行sql語句并返回影響行數(shù),并在內(nèi)部對sql語句進(jìn)行正確拼接 return $db->exec("DELETE FROM `id_list` WHERE `id_list`.$str"); } //數(shù)據(jù)庫操作 修改數(shù)據(jù)庫數(shù)據(jù)信息 static function update($db,$data,$where=['id'=>6]) { //創(chuàng)建兩個空字符串存儲數(shù)據(jù) $str = ''; $str1 = ''; //遍歷數(shù)據(jù)數(shù)組,并拼接為sql語句識別的部分內(nèi)容 foreach($data as $k=>$v) { //進(jìn)一步判斷$data是否是數(shù)組,如果是則執(zhí)行拼接 if(is_array($data)) { $str1 .= "`".$k."`='".$v."',"; } } //去掉最后一位產(chǎn)生的"," $str1 = substr($str1,0,strlen($str1)-1); //變量查詢數(shù)組,并拼接為sql語句識別的部分內(nèi)容 foreach($where as $k=>$v) { //進(jìn)一步判斷$where是否是數(shù)組,如果是則執(zhí)行拼接 if(is_array($where)) { //判斷$where是否只有多對數(shù)組,如果有末尾加上"and",否則不加 if(count($where)>1) { $str .= $k . ' = ' . $v . ' and '; }else{ $str .= $k . ' = ' . $v; } } } //判斷$where是否只有多對數(shù)組,如果是則對上面處理的拼接做進(jìn)一步處理,將末尾多出的and去掉 if(count($where)>1) { $str = substr($str,0,strlen($str)-4); } //使用PDO::exec()執(zhí)行sql語句并返回影響行數(shù),并在內(nèi)部對sql語句進(jìn)行正確拼接 return $db->exec("UPDATE `id_list` SET $str1 WHERE `id_list`.$str"); } } //客戶端代碼 $dsn ='mysql:host=localhost;dbname=test';//數(shù)據(jù)庫鏈接信息 $db = Db::doConnect($dsn,'root','');//登錄數(shù)據(jù)庫賬號密碼 // $data = ['id'=>5,'username'=>'admin5','password'=>'admin7890','age'=>16];//新增插入測試數(shù)據(jù) $data = ['id'=>2,'username'=>'admin2','password'=>'admin456','age'=>18];//修改測試數(shù)據(jù) // print_r(Db::select($db));//查詢語句執(zhí)行 // echo (Db::insert($db,$data));//插入語句執(zhí)行 // echo (Db::delete($db));//刪除語句執(zhí)行 echo (Db::update($db,$data));//修改更新語句執(zhí)行
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號