# PDO 操作数据库

***

Yaf 框架(3.0.5版本)目前并没有提供数据库 ORM 类,据鸟哥的博客来说,以后或许会提供。使用了 ORM 类为团队带来的便捷和规范,但是带来了性能的下降。直接使用 PDO 保证性能,又存在规范不足让程序维护成本上升或安全上的风险。这就要各位读者自行取舍。

> ORM 即 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。[来自维基百科]

> 笔者注:简单来说 ThinkPHP5 的 Db 方法或者模型,ThinkPHP3 的 M方法和 D方法,Laravel 的 Eloquent 都属于 ORM 类范畴

接下来我们使用单例模式创建 PDO 类

### 1. 创建配置文件选项

打开`conf/application.ini`文件增加数据库配置

~~~

; 数据库配置

resources.database.master.host = "127.0.0.1"

resources.database.master.port = 3306

resources.database.master.dbname = "eye"

resources.database.master.username = "root"

resources.database.master.password = ""

~~~

### 2. 创建 Database 类(单例)

本类并没有添加查询,添加,修改,删除等方法,而是将所有操作重载给 PDO 类实例,导致有些 PDO 的方法在编辑器中没有代码提醒,所以需要使用 `phpDocumentor` 注释语法来开启代码提醒。下方代码前两行注释就是我为 Database 类编写的`query()`操作和`fetchAll()`操作的代码提醒

~~~php

/**

* 方法重载函数,用于编辑器代码提醒

* @method Database query($statement, $mode = PDO::ATTR_DEFAULT_FETCH_MODE, $arg3 = null, array $ctorargs = array())

* @method Database fetchAll($fetch_style = null, $fetch_argument = null, array $ctor_args = array())

*/

class Database

{

// 类实例

private static $instance = null;

// 连接实例

private static $link = null;

// 配置文件

private static $config = [];

/**

* 构造函数

*/

private function __construct()

{

self::$config = Yaf_Registry::get('config')->resources->database->master;

self::$link = new PDO("mysql:host=" . self::$config['host'] . ";dbname=" . self::$config['dbname'], self::$config['username'], self::$config['password'], [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'']);

}

/**

* 获取实例

* @return Database

*/

public static function getInstance()

{

return self::$instance ?: (self::$instance = new self());

}

/**

* 魔术方法,方法重载

* @param $name

* @param $arguments

* @return mixed

*/

function __call($name, $arguments)

{

return self::$link->$name($arguments[0]);

}

/**

* 禁止克隆

*/

private function __clone()

{

}

/**

* 反序列化魔术方法

*/

public function __wakeup()

{

self::$instance = $this;

}

/**

* 析构函数

* @description 销毁实例

*/

public function __destruct()

{

list(self::$instance, self::$config) = [null, []];

}

}

~~~

### 3. 自动加载 Database 类

打开`application/Bootstrap.php`文件,在`_initAutoload()`方法下加入导入类代码,实现自动导入`Database`类

~~~php

public function _initAutoload()

{

// 注册 Composer

Yaf_Loader::import(APPLICATION_PATH . "/vendor/autoload.php");

// 注册数据库

Yaf_Loader::import(APPLICATION_PATH . "/application/library/Database.php");

}

~~~

除了可以使用 Yaf 自带的 `Yaf_Loader` 类来引入 php 库文件以外,也可以使用 `include()`,`require()`等方式引入

### 4. 开始使用

现在就可以在项目中,使用`Database::getInstance()`来 PDO 操作了

~~~php

$rows = Database::getInstance()->query('SELECT `id`,`user_name`,`password` FROM users ORDER BY `id` DESC ;');

ldd($rows->fetchAll(PDO::FETCH_ASSOC));

~~~

yaf mysql pdo 封装_PDO 操作数据库相关推荐

  1. php django mysql配置文件_Mysql学习Django+mysql配置与简单操作数据库实例代码

    <Mysql学习Django+mysql配置与简单操作数据库实例代码>要点: 本文介绍了Mysql学习Django+mysql配置与简单操作数据库实例代码,希望对您有用.如果有疑问,可以联 ...

  2. 数据库应用——MySQL基础知识和操作数据库

    这里写目录标题 初识MySQL 什么是数据库 数据库分类 MySQL简介 安装MYSQL win10安装 安装SQLyog 连接数据库 linux安装 使用Navicat Premium连接数据库 操 ...

  3. pdo mysql 建库_pdo 创建数据库

    通过PDO 连接SQL Server 在开发PHP程序时我们可以借助多种连接方式访问各类的数据库获取所需的数据.自PHP5以来PDO作为新生事物将所有数据库接口收入囊中,为开发人员提供了方便快捷的数据 ...

  4. C++利用MySQL API连接和操作数据库

    1.C++连接和操作MySQL的方式 在Windows平台,我们可以使用ADO.ODBC或者MySQL API进行连接和操作.ADO (ActiveX Data Objects,ActiveX数据对象 ...

  5. MySql学习【一】mysql的安装,操作数据库/表/查询表中数据/mysql日期计算

    1.安装和连接数据库的注意事项 1.在mac电脑上安装mysql,官网下载即可. 2.mysql返回的执行行数和时间,时间并不精确.其中时间是指挂钟时间 [返回进程启动到调用函数时所经过的CPU时钟计 ...

  6. MySQL学习第二天—操作数据库\数据表命令

    文章目录 一.登录数据库 二.基本数据库操作命令 1. 操作数据库 1.1 创建数据库 1.2 删除数据库 1.3 查看数据库 1.4 使用数据库 1.5 其他操作 2.操作数据表 2.1 创建数据表 ...

  7. pbp 读取 mysql数据_SqlAlchemy 中操作数据库时session和scoped_session的区别(源码分析)...

    原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalch ...

  8. php获取mysql数据菜鸟_PHP操作数据库

    function con(){ // MYSQL连接参数 $dsn='mysql:host=127.0.0.1;dbname=hello;charset=utf8;port=3306;'; $dbna ...

  9. java连接mysql通用方法_jdbc操作数据库通用方法

    1 /** 2 * 增删改查操作公共类(以oracle数据库为例)3 * 2017-8-29 wuyafei4 *5 */ 6 public classCrudUtil {7 /** 8 * 1.获取 ...

最新文章

  1. Linux 磁盘挂载
  2. 《众妙之门——自由网站设计师成功之道》一1.4 自由网站设计师犯的严重错误...
  3. java dom获取属性值_java – 获取dom节点的属性
  4. 计算机组成原理中wr是什么,计算机组成原理复习例题.doc
  5. php 跨域web访问权限,php:跨域 Web程序 - 贪吃蛇学院-专业IT技术平台
  6. android--在命令行中生成Android的数字证书keystore文件
  7. rl滤波器原理_滤波器基本原理.ppt
  8. Win11系统如何隐藏快速搜索
  9. C#如何直接调用非托管代码
  10. 物联网时代,隐私还有救吗?
  11. 09年关门歇业的15大网站 雅虎旗下4网站上榜
  12. c#类的多态和文件流复习
  13. 3.2 GUN as汇编(本文内容大部分引用原文,非原创)
  14. Win10设置定时关机命令简单介绍
  15. sql语句练习题(mysql版)
  16. python中cv的差值_python+opencv实现移动侦测(帧差法)
  17. fiddler 证书错误
  18. ERP软件高效排产计划:如何解决企业排产难题
  19. Good Bye 2020 E
  20. 满减活动基础算法-java-类似淘宝满200减30

热门文章

  1. python3 单例模式_当python,单例模式,多例模式,一次初始化遇到一起
  2. python资料-(转)python资料汇总(建议收藏)零基础必看
  3. 用python画八卦图-用Python中的画图工具turtle绘制八卦图
  4. 用python画图代码-Python实战小程序利用matplotlib模块画图代码分享
  5. python能做什么工作-学完python能从事什么工作?
  6. python小白从哪来开始-老男孩python课程亮点在哪里?python小白
  7. 方法区jdk1.7,1.8版本的构造变化
  8. ES6 async函数(超级详细、易懂)
  9. vue.config.js代理配置失效 如何解决
  10. react周期函数介绍