# 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
<?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
- 框架配置
- 使用 Bootstrap
- 集成 Composer
- 配置 IDE 支持 Yaf 代码提醒
- 多模块配置
- 命名空间支持
- 错误调试
- 请求与响应
- 输入变量
- 输出 JSON
- Ajax 请求
- 数据库操作
- PDO 操作数据库
- 使用 Laravel-Eloquent ORM 操作数据库
- 视图模板
- 使用 Yaf 自带模板引擎
- 使用 Twig 模板引擎
- 接口开发
- RESTful
- 网页开发
- SESSION
- Cookie
- 命令行开发
- 爬虫开发
- 写代码之前
- 建立爬行目标抽象类
- 实现具体爬行目标类
- 实现爬虫工厂类
- 编写异步操作方法
- 用 Redis 保存爬行结果
- WebSocket 实时获取结果
- 定时器更新爬行结果
- 优化程序
- 框架实践
- 引入类库
- 多模块继承与引入
- Let's Encrypt 免费 https 证书申请
- 附录A:常见 Bootstrap 操作
- 附录B:Yaf 配置项