如何寫一個屬于自己的數據庫封裝(1)
發表時間:2023-09-10 來源:明輝站整理相關軟件相關文章人氣:
[摘要]寫在前頭依然在前進的菜鳥一只,錯誤什么的請輕噴指出對于數據庫連接由于較淺的工作經驗所以無法完全覆蓋,較復雜的query可能會有意想不到的bug所以本系列只提供思路,成熟穩定的數據庫封裝有請自行搜索編寫該系列的初衷就是為了拋磚引玉, 在每一節的后端,我都會提出一些個人疑問(或無),希望能引出大神為我...
寫在前頭
依然在前進的菜鳥一只,錯誤什么的請輕噴指出
對于數據庫連接由于較淺的工作經驗所以無法完全覆蓋,較復雜的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)
返回的數據依然可操作(update/delete)
$a->update(...);
$a->delete();
常見的數據庫連接寫法
對php有一定了解的人都知道,相比已被淘汰的mysql或取而代之的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 - 負責與數據庫的通信, 請求與返回數據庫數據
Model.php - 入口文件,負責表的設置, 并接受請求, 返回回應
Grammar.php - 將Builder存儲的請求轉化為SQL語句
Builder.php - 核心文件, 存儲Model的請求,調用Grammar以返回SQL語句, 與參數變量一并送往Connector以獲取數據庫數據,再返還給Model
架構可能解釋得不太好,但沒關系, 接下來會慢慢一個個的深入解釋
大致如此, 如果可以的話點個贊,或在下方評論區討論, 只有反饋才能推動一個懶癌晚期病患繼續前行。
以上就是如何寫一個屬于自己的數據庫封裝(1)的詳細內容,更多請關注php中文網其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。