摘要:另外使用預(yù)處理語句,能有效預(yù)防注入。調(diào)用方法如下單個多個每種數(shù)據(jù)庫支持的操作和連接方式不一樣,使用抽象類實現(xiàn)通用功能。例如在抽象類,定義屬性,和,用來標記,每個支持的和,例如支持,不支持或者說實現(xiàn)的方式不一致。
來自博客:神的尾巴,原文鏈接
已經(jīng)提交到github,DB組件代碼,代碼質(zhì)量一般,大家將就著看 :)
使用PDO基于PDO,PDO提供了一個數(shù)據(jù)訪問抽象層,能夠支持多種數(shù)據(jù)庫。另外使用預(yù)處理語句,能有效預(yù)防SQL注入。
支持多個數(shù)據(jù)庫預(yù)處理語句是分兩次發(fā)送到數(shù)據(jù)庫的,第一次發(fā)送語義,例如: selecet * from user where username = ? and password = ? limit 1,如果不使用預(yù)處理語句,就可能導(dǎo)致sql注入。例如,用戶名:godtail,密碼:123456 or 1 = 1。但是如果是預(yù)處理語句的話,會把語義和數(shù)據(jù)分兩次發(fā)送到數(shù)據(jù)庫。這樣就防止數(shù)據(jù)影響SQL語義,導(dǎo)致SQL注入(需要設(shè)置PDO::ATTR_EMULATE_PREPARES為true,否則會在PHP模擬處理,進行數(shù)據(jù)轉(zhuǎn)義)。
定義靜態(tài)變量用來接收配置文件,用來配置單個或者多個數(shù)據(jù)庫。
#單個數(shù)據(jù)庫 return [ "dbType" => "Mysql", "host" => "127.0.0.1", "database" => "blog", "port" => "3306", "user" => "root", "password" => "root", "charset" => "utf8" ] #多個數(shù)據(jù)庫 return [ "main" => [ "dbType" => "Mysql", "host" => "127.0.0.1", "database" => "blog", "port" => "3306", "user" => "root", "password" => "root", "charset" => "utf8" ] "log" => [ "dbType" => "Mysql", "host" => "127.0.0.1", "database" => "blog_log", "port" => "3306", "user" => "root", "password" => "root", "charset" => "utf8" ] ]
使用單例,防止多次初始化同一個DB,保證一個DB只有一個連接。
調(diào)用方法如下:
#單個 $db = Db::instance(); #多個 $dbLog = DB::instance("log");
每種數(shù)據(jù)庫支持的操作和連接方式不一樣,使用抽象類Driver實現(xiàn)通用功能。然后,每種數(shù)據(jù)庫驅(qū)動繼承Driver,負責(zé)實現(xiàn)例如連接方式等,不同數(shù)據(jù)庫的特有功能。在實例化的時候,會根據(jù)配置的dbType,返回每個db對于的驅(qū)動。
支持類似TP or Laravel的連貫操作我把連貫操作分為兩類:
設(shè)置數(shù)據(jù)的dataOpt。例如:where, field, limit...
執(zhí)行最后查詢或修改操作的endOpt。例如: find, select...
在抽象類Driver,定義protected屬性,$dataOpt和$endOpt,用來標記,每個db支持的dataOpt和endOpt,例如Mysql支持limit,SQL Server不支持(或者說實現(xiàn)的方式不一致)。
dataOpt實現(xiàn)接口DataOpt,提供方法parse,返回數(shù)據(jù)包含,sqlPart用來拼裝sql,params是sql ?對應(yīng)的參數(shù)。
interface DataOpt { /** * @return array * [ * "sqlPart" => " where name = ?", * "params" => ["godtail"] * ] */ public static function parse($arguments); }
在調(diào)用的時候,使用Driver的魔法方法__call,如果是dataOpt,設(shè)置數(shù)據(jù)到$data變量,如果是endOpt,根據(jù)endOpt設(shè)置的執(zhí)行順序,執(zhí)行對于數(shù)據(jù)的解析。
判斷是否有endOptAfter方法或endOptBefore,依次調(diào)用(后面打算使用Hook實現(xiàn))。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/22009.html
摘要:另外這個框架作為后端純框架。當(dāng)前博客就是用這個組件寫的,代碼也在上。還需完善的一些地方近幾天抽空解決下自定義路由添加正則匹配。的格式換行數(shù)據(jù)內(nèi)容換行數(shù)據(jù)內(nèi)容最后一個目前是通過正則來解析處理的,如果設(shè)置了。使用生成臨時文件。 來自博客:神的尾巴,原文鏈接 已提交到github,路由組件代碼,代碼質(zhì)量一般,大家將就著看 : ) 組件思路 現(xiàn)在都是單入口,通過index.php配置組件,然后...
摘要:是什么是一款頂級全棧開發(fā)框架。漸進式開發(fā)由于模塊的高度內(nèi)聚,可以將業(yè)務(wù)以模塊的形式沉淀,在多個項目中重復(fù)使用,既可貢獻到開源社區(qū),也可部署到公司內(nèi)部私有倉庫。模塊發(fā)布當(dāng)項目中的模塊代碼穩(wěn)定后,可以將模塊公開發(fā)布,貢獻到開源社區(qū)。 EggBorn.js是什么 EggBorn.js是一款頂級Javascript全棧開發(fā)框架。 EggBorn.js是采用Javascript進行全棧開發(fā)的最佳...
摘要:解決思路服務(wù)器端渲染服務(wù)器端和前端公用同一個應(yīng)用,然后通過構(gòu)建工具及配置,確定哪些組件需要再服務(wù)器端渲染,那些組件需要再客戶端渲染。服務(wù)器端渲染,由框架與構(gòu)建工具配合,并依據(jù)一定的項目結(jié)構(gòu)和編碼方式,共同運行。 分離 為什么需要 前后端分離、web服務(wù)器與static服務(wù)器分離: 前端與后端耦合 (需求) 自動化、工程化的構(gòu)建前端的代碼 (基礎(chǔ)條件) 模塊化、組件化,項目共享代碼 (...
摘要:個人認為單頁面應(yīng)用的優(yōu)勢相當(dāng)明顯前后端職責(zé)分離,架構(gòu)清晰前端進行交互邏輯,后端負責(zé)數(shù)據(jù)處理。上面的這種單頁面應(yīng)用也有其相應(yīng)的一種開發(fā)工作流,當(dāng)然這種工作流也適合非單頁面應(yīng)用進行產(chǎn)品功能原型設(shè)計。 未經(jīng)允許,請勿轉(zhuǎn)載。本文同時也發(fā)布在我的博客。 (如果對SPA概念不清楚的同學(xué)可以先自行了解相關(guān)概念) 平時喜歡做點小頁面來玩玩,并且一直采用單頁面應(yīng)用(Single Page Appl...
摘要:前端一種新一代高性能全棧開發(fā)實踐背景本項目將使用配合最簡單的邏輯來展示一個基于的全新一代高性能全棧開發(fā)實踐的為什么是對于為何不是等著名框架,或許可能很多人會產(chǎn)生疑惑,本身和非常的相似,而它的出現(xiàn),不僅是大大改進過去時代性能低下通病,外加配 SanicCRUD-vue Sanic + 前端MVVM 一種新一代Python高性能全棧開發(fā)實踐showImg(https://segmentfa...
閱讀 1273·2021-09-23 11:51
閱讀 1391·2021-09-04 16:45
閱讀 633·2019-08-30 15:54
閱讀 2087·2019-08-30 15:52
閱讀 1605·2019-08-30 11:17
閱讀 3107·2019-08-29 13:59
閱讀 2023·2019-08-28 18:09
閱讀 389·2019-08-26 12:15