六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

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

[摘要]寫在前頭依然在前進的菜鳥一只,錯誤什么的請輕噴指出對于數據庫連接由于較淺的工作經驗所以無法完全覆蓋,較復雜的query可能會有意想不到的bug所以本系列只提供思路,成熟穩定的數據庫封裝有請自行搜索編寫該系列的初衷就是為了拋磚引玉, 在每一節的后端,我都會提出一些個人疑問(或無),希望能引出大神為我...

寫在前頭

  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)

返回的數據依然可操作(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知識。




主站蜘蛛池模板: 亚洲不卡 | 日韩精品在线免费观看 | 深爱五月网 | 天天射天天操天天色 | 四虎精品成人免费观看 | 日本免费高清一区 | 亚洲第一页国产 | 日本午夜在线视频 | 五月婷婷激情综合 | 亚洲国产99 | 羞羞色院91网站 | 日韩激情影院 | 中文在线天堂网 | 日本中文在线视频 | 青娱娱乐盛宴免费一二区 | 中国日韩欧美中文日韩欧美色 | 亚洲综合激情网 | 欧美一级片手机在线观看 | 天堂最新版资源www在线 | 青青草成人免费在线视频 | 日韩免费一级毛片 | 三级黄色在线免费观看 | 日韩精品毛片 | 亚洲男人的天堂网 | 亚洲第一综合网站 | 午夜影视在线免费观看 | 日本中文字幕在线看 | 日本高清网 | 日本乱中文字幕系列在线观看 | 日韩欧美片 | 中文字幕亚洲国产 | 青青爽国产手机在线观看免费 | 亚洲全网成人资源在线观看 | 欧美中文字幕视频 | 亚洲免费在线播放 | 欧美一区二区三区东南亚 | 日韩欧美一区二区久久黑人 | 主播国产| 亚洲永久精品网站 | 亚州综合 | 伊人久久中文字幕久久cm |