资讯专栏INFORMATION COLUMN

API后端框架Godtail3-DB组件

moven_j / 2076人阅读

摘要:另外使用预处理语句,能有效预防注入。调用方法如下单个多个每种数据库支持的操作和连接方式不一样,使用抽象类实现通用功能。例如在抽象类,定义属性,和,用来标记,每个支持的和,例如支持,不支持或者说实现的方式不一致。

来自博客:神的尾巴,原文链接

已经提交到github,DB组件代码,代码质量一般,大家将就着看 :)

使用PDO

基于PDO,PDO提供了一个数据访问抽象层,能够支持多种数据库。另外使用预处理语句,能有效预防SQL注入

预处理语句是分两次发送到数据库的,第一次发送语义,例如: selecet * from user where username = ? and password = ? limit 1,如果不使用预处理语句,就可能导致sql注入。例如,用户名:godtail,密码:123456 or 1 = 1。但是如果是预处理语句的话,会把语义和数据分两次发送到数据库。这样就防止数据影响SQL语义,导致SQL注入(需要设置PDO::ATTR_EMULATE_PREPAREStrue,否则会在PHP模拟处理,进行数据转义)。

支持多个数据库

定义静态变量用来接收配置文件,用来配置单个或者多个数据库。

#单个数据库
return [
    "dbType" => "Mysql",
    "host" => "127.0.0.1",
    "database" => "blog",
    "port" => "3306",
    "user" => "root",
    "password" => "root",
    "charset" => "utf8"
]

#多个数据库
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只有一个连接。

调用方法如下:

#单个
$db = Db::instance();

#多个
$dbLog = DB::instance("log");

每种数据库支持的操作和连接方式不一样,使用抽象类Driver实现通用功能。然后,每种数据库驱动继承Driver,负责实现例如连接方式等,不同数据库的特有功能。在实例化的时候,会根据配置的dbType,返回每个db对于的驱动。

支持类似TP or Laravel的连贯操作

我把连贯操作分为两类:

设置数据的dataOpt。例如:where, field, limit...

执行最后查询或修改操作的endOpt。例如: find, select...

在抽象类Driver,定义protected属性,$dataOpt$endOpt,用来标记,每个db支持的dataOptendOpt,例如Mysql支持limitSQL Server不支持(或者说实现的方式不一致)。

dataOpt实现接口DataOpt,提供方法parse,返回数据包含,sqlPart用来拼装sql,paramssql ?对应的参数。

interface DataOpt
{
    /**
     * @return array
     *  [
     *      "sqlPart" => " where name = ?",
     *      "params" => ["godtail"]
     *  ]
     */
    public static function parse($arguments);
}

在调用的时候,使用Driver的魔法方法__call,如果是dataOpt,设置数据到$data变量,如果是endOpt,根据endOpt设置的执行顺序,执行对于数据的解析。

判断是否有endOptAfter方法或endOptBefore,依次调用(后面打算使用Hook实现)。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22009.html

相关文章

  • API后端框架Godtail2-路由组件

    摘要:另外这个框架作为后端纯框架。当前博客就是用这个组件写的,代码也在上。还需完善的一些地方近几天抽空解决下自定义路由添加正则匹配。的格式换行数据内容换行数据内容最后一个目前是通过正则来解析处理的,如果设置了。使用生成临时文件。 来自博客:神的尾巴,原文链接 已提交到github,路由组件代码,代码质量一般,大家将就着看 : ) 组件思路 现在都是单入口,通过index.php配置组件,然后...

    summerpxy 评论0 收藏0
  • EggBorn.js:一款顶级Javascript全栈开发框架

    摘要:是什么是一款顶级全栈开发框架。渐进式开发由于模块的高度内聚,可以将业务以模块的形式沉淀,在多个项目中重复使用,既可贡献到开源社区,也可部署到公司内部私有仓库。模块发布当项目中的模块代码稳定后,可以将模块公开发布,贡献到开源社区。 EggBorn.js是什么 EggBorn.js是一款顶级Javascript全栈开发框架。 EggBorn.js是采用Javascript进行全栈开发的最佳...

    dayday_up 评论0 收藏0
  • 构建前端项目

    摘要:解决思路服务器端渲染服务器端和前端公用同一个应用,然后通过构建工具及配置,确定哪些组件需要再服务器端渲染,那些组件需要再客户端渲染。服务器端渲染,由框架与构建工具配合,并依据一定的项目结构和编码方式,共同运行。 分离 为什么需要 前后端分离、web服务器与static服务器分离: 前端与后端耦合 (需求) 自动化、工程化的构建前端的代码 (基础条件) 模块化、组件化,项目共享代码 (...

    mindwind 评论0 收藏0
  • 一种SPA(单页面应用)架构

    摘要:个人认为单页面应用的优势相当明显前后端职责分离,架构清晰前端进行交互逻辑,后端负责数据处理。上面的这种单页面应用也有其相应的一种开发工作流,当然这种工作流也适合非单页面应用进行产品功能原型设计。 未经允许,请勿转载。本文同时也发布在我的博客。 (如果对SPA概念不清楚的同学可以先自行了解相关概念) 平时喜欢做点小页面来玩玩,并且一直采用单页面应用(Single Page Appl...

    Codeing_ls 评论0 收藏0
  • Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践

    摘要:前端一种新一代高性能全栈开发实践背景本项目将使用配合最简单的逻辑来展示一个基于的全新一代高性能全栈开发实践的为什么是对于为何不是等著名框架,或许可能很多人会产生疑惑,本身和非常的相似,而它的出现,不仅是大大改进过去时代性能低下通病,外加配 SanicCRUD-vue Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践showImg(https://segmentfa...

    Profeel 评论0 收藏0

发表评论

0条评论

moven_j

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<