寫在前頭
-
依然在前進的菜鳥一只,錯誤什么的請輕噴指出
-
對于數據庫連接由于較淺的工作經驗所以無法完全覆蓋,較復雜的query可能會有意想不到的bug
-
所以本系列只提供思路,成熟穩定的數據庫封裝有請自行搜索
-
編寫該系列的初衷就是為了拋磚引玉, 在每一節的后端,我都會提出一些個人疑問(或無),希望能引出大神為我解答迷惑
-
使用的php版本為7.0+,該系列并不向下兼容,還在5.6版本的童鞋們快過來玩呀
-
數據庫封裝參考了laravel的源代碼, 如有雷同, 不是巧合
最終效果
假設我們有一個表,名’Actor’, 經過簡單設置, 可以直接如下調用
$a = Actor::select('first_name', 'last_name') ->where('first_name', 'NICK') ->where('last_name', 'WAHLBERG') ->first() var_dump($a);
返回格式
object(Actor)[11] public 'first_name' => string 'NICK' (length=4) public 'last_name' => string 'WAHLBERG' (length=8)
$a->update(...); $a->delete();
常見的數據庫連接寫法
對php有一定了解的人都知道,相比已被淘汰的搜索或取而代之的mysqli, pdo 可以避免SQL注入式攻擊, 更搜索, 而且搜索, 所以以下以pdo作為例子
<?php $driver='mysql'; //數據庫類型 $host='localhost'; //數據庫主機名 $db = 'sakila'; //數據庫名稱 $username='root'; //數據庫連接用戶名 $password=''; //數據庫密碼 $dsn="$driver:host=$host;dbname=$db"; try { $pdo= new PDO($dsn, $username, $password); //初始化一個PDO對象 $sql = "select * from actor"; $res = $pdo->query($sql); // 從actor中獲取所有數據 foreach($res as $row) echo $row['first_name']."<br>"; } catch (PDOException $e) { die($e->getMessage()); }
以上例子非常簡潔, 當一個項目逐漸成長,日漸復繁的時候,那么我們需要一個封裝類來減少代碼的重復性, 就像平時自行寫的一些輔助搜索, 不過封裝類略微進階而已。
基本思路
那么,應該怎么寫呢?
首先, 平時我們要簡略一些代碼, 都會自行編寫一些輔助函數,比如我個人有個不好的習慣,不喜歡用搜索的搜索功能(畫外音:我用的是sublime text 3),那么debug的時候一開始都是這么寫的
$a = "is bug"; die(var_dump($a)); // 輸出變量并且停止運行之后的代碼 /***從xdebug得知bug出現在這一行,所以查看上一行的邏輯與數據 ***/
die(var_dump())的出場率略高, 因此我將它們寫成了一個輔助函數
function dd($var) { die(var_dump($var)); }
同樣道理,在數據庫讀取的時候,select的出場率極高, 所以簡單的包裹一下
function select($pdo, $table, $require, $where = []) { $w = []; // 將搜索條件轉化為數據庫命令能接受的格式 foreach ($where as $key => &$val) $w[] = "$key = '$val'"; // 有時候并不需要條件,僅僅將所有數據取出,因此$where默認為空 if(!empty($w)) $w = "where ".implode(', ', $w); else $w = ""; // 生成sql query $sql = "select $require from $table $w"; // 將已生成的query帶入pdo實例 $res = $pdo->query($sql); // 返回結果 return $res->fetchAll(); }
例子
select($pdo, 'actor', '*', ['first_name'=>'PENELOPE']) /** * 生成sql query => select * from actor where first_name = 'PENELOPE' **/
總結一下, 數據庫封裝淺顯的形容就是將參數帶入輔助函數,讓其自動生成SQL命令。
數據庫封裝的搜索
主要分成四個文件
-
Connector.php – 負責與數據庫的通信, 請求與返回數據庫數據
-
Grammar.php – 將Builder存儲的請求轉化為SQL語句
-
Builder.php – 核心文件, 存儲Model的請求,調用Grammar以返回SQL語句, 與參數變量一并送往Connector以獲取數據庫數據,再返還給Model
架構可能解釋得不太好,但沒關系, 接下來會慢慢一個個的深入解釋
大致如此, 如果可以的話點個贊,或在下方評論區討論, 只有反饋才能推動一個懶癌晚期病患繼續前行。