# 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 配置項