如何寫一個屬于自己的數據庫封裝(1)

寫在前頭

  1. 依然在前進的菜鳥一只,錯誤什么的請輕噴指出

  2. 對于數據庫連接由于較淺的工作經驗所以無法完全覆蓋,較復雜的query可能會有意想不到的bug

  3. 所以本系列只提供思路,成熟穩定的數據庫封裝有請自行搜索

  4. 編寫該系列的初衷就是為了拋磚引玉, 在每一節的后端,我都會提出一些個人疑問(或無),希望能引出大神為我解答迷惑

  5. 使用的php版本為7.0+,該系列并不向下兼容,還在5.6版本的童鞋們快過來玩呀

  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)

返回的數據依然可操作(up搜索/搜索)

$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 – 負責與數據庫的通信, 請求與返回數據庫數據

  • 搜索.php – 搜索,負責表的設置, 并接受請求, 返回回應

  • Grammar.php – 將Builder存儲的請求轉化為SQL語句

  • Builder.php – 核心文件, 存儲Model的請求,調用Grammar以返回SQL語句, 與參數變量一并送往Connector以獲取數據庫數據,再返還給Model

架構可能解釋得不太好,但沒關系, 接下來會慢慢一個個的深入解釋

大致如此, 如果可以的話點個贊,或在下方評論區討論, 只有反饋才能推動一個懶癌晚期病患繼續前行。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享