首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Yii DAO 深度解析:數據庫訪問對象的核心類與實戰操作

     編輯:PHP 相關知識

概述

Yii DAO (Data Access Object) 建立在 PHP PDO 之上,提供統一的 API 訪問 MySQL、PostgreSQL、SQL Server、Oracle 等多種數據庫。應用層代碼無需修改即可切換底層 DBMS。使用前需確保安裝 PDO 擴展及對應驅動(如 pdo_mysql)。

四大核心類

類名職責
CDbConnection代表數據庫連接,管理連接生命週期
CDbCommand封裝 SQL 語句,提供執行、查詢、參數綁定方法
CDbDataReader只進游標,用於逐行讀取大結果集,節省內存
CDbTransaction事務控制,保證多條 SQL 的原子性

常用操作詳解

1. 建立連接

// 獨立使用
$conn = new CDbConnection($dsn, $user, $pass);
$conn->active = true;
// ... 操作
$conn->active = false;

// 作為應用組件配置 (main.php)
'db' => array(
    'class' => 'CDbConnection',
    'connectionString' => 'mysql:host=localhost;dbname=testdb',
    'username' => 'root',
    'password' => 'password',
    'emulatePrepare' => true,
),
// 之後全局通過 Yii::app()->db 訪問,自動激活

常用 DSN 格式:

  • MySQL: mysql:host=localhost;dbname=testdb
  • SQLite: sqlite:/path/to/dbfile
  • PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb

2. 執行 SQL

$cmd = Yii::app()->db->createCommand($sql);
// 非查詢:INSERT/UPDATE/DELETE,返回影響行數
$rowCount = $cmd->execute();
// 查詢:返回 CDbDataReader
$reader = $cmd->query();
// 便捷方法
$rows = $cmd->queryAll();   // 所有行
$row  = $cmd->queryRow();   // 第一行
$col  = $cmd->queryColumn(); // 第一列
$val  = $cmd->queryScalar(); // 單一值

3. 讀取結果集

$reader = $cmd->query();
// 方式一:while 循環
while (($row = $reader->read()) !== false) { /* ... */ }
// 方式二:foreach 遍歷
foreach ($reader as $row) { /* ... */ }
// 方式三:一次性取出所有
$rows = $reader->readAll();

4. 事務處理

$tx = $conn->beginTransaction();
try {
    $conn->createCommand($sql1)->execute();
    $conn->createCommand($sql2)->execute();
    $tx->commit();
} catch (Exception $e) {
    $tx->rollBack();
}

5. 參數綁定(防注入、提升性能)

$sql = "INSERT INTO tbl_user (username, email) VALUES (:username, :email)";
$cmd = $conn->createCommand($sql);
$cmd->bindParam(":username", $username, PDO::PARAM_STR);
$cmd->bindParam(":email", $email, PDO::PARAM_STR);
$cmd->execute();
// 重複執行只需重新綁定新值
$cmd->bindParam(":username", $username2);
$cmd->bindParam(":email", $email2);
$cmd->execute();

bindParam 綁定變量引用,適合大數據;bindValue 綁定具體值。

6. 列綁定

$reader = $conn->createCommand("SELECT username, email FROM tbl_user")->query();
$reader->bindColumn(1, $username);
$reader->bindColumn(2, $email);
while ($reader->read() !== false) {
    // $username, $email 自動更新為當前行數據
}

7. 表前綴

配置 CDbConnection::tablePrefix = 'tbl_',SQL 中使用 {{TableName}}(如 {{user}} 代表 tbl_user),便於多應用共享數據庫。

最佳實踐建議

  • 優先使用應用組件方式管理連接,實現連接複用。
  • 所有動態查詢務必使用參數綁定,杜絕 SQL 注入。
  • 大數據量查詢使用 CDbDataReader 流式讀取,避免內存溢出。
  • 涉及多表寫入操作務必包裹在事務中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved