YII資料庫DAO操作

2021-06-22 22:21:20 字數 4489 閱讀 7053

'

雖然我們可以使用cactviereord完成大部分對資料庫的操作。他簡化了資料庫操作,但是有時候卻把一些資料庫操作複雜化了。所以yii同時允許我們可以自己連線資料庫,組織查詢語句,執行查詢語句,獲取查詢結果。這樣可以讓我們靈活的選擇使用哪一種方式。

下面講講yii提供的dao操作相關類的使用方法。具體類在framework/db資料夾中

可以看到,資料庫操作類主要是:

├── cdbconnection.php

├── cdbcommand.php

├── cdbdatareader.php

├── cdbexception.php

├── cdbmigration.php

├── cdbtransaction.php

連線,執行,結果集操作,事物,異常,資料遷移。

1.資料庫連線 cdbconnection.php

yii中的dao是封裝的pdo,那麼連線資料庫要提供的必要資訊(連線方式,使用者名稱,密碼)自然也類似。開啟類看看具體實現方式和使用方法。通過類的注釋可以了解連線方法。

$connection

=new

cdbconnection(

$dsn,

$username

,$password

); $connection

->active=true;

yii官方給出的常見的dsn格式如下:

2.資料庫基本操作cdbcommand.php

資料庫連線建立後,便可以通過cdbcommand類提供的方法就可以進行資料庫操作。

你可以通過使用指定的sql語句作為引數呼叫 cdbconnection::createcommand() 建立乙個 cdbcommand 例項。

// 如果沒有,你可能需要顯式建立乙個連線:

// $connection=new cdbconnection($dsn,$username,$password);

$command=$connection->createcommand($sql);

// 如果需要,此 sql 語句可通過如下方式修改:

// $command->text=$newsql;

一條 sql 語句會通過 cdbcommand 以如下兩種方式被執行:

execute(): 執行乙個無查詢 (non-query)sql語句,例如 insert, update 和 delete 。如果成功,它將返回此執行所影響的行數。

query(): 執行一條會返回若干行資料的 sql 語句,例如 select。如果成功,它將返回乙個 cdbdatareader 例項,通過此例項可以遍歷資料的結果行。為簡便起見,(yii)還實現了一系列 query***()(select操作) 方法以直接返回查詢結果。

執行 sql 語句時如果發生錯誤,將會丟擲乙個異常。

$rowcount=$command->execute();   // 執行無查詢sql

$datareader=$command->query();   // 執行乙個sql查詢

$rows=$command->queryall();  

// 查詢並返回結果中的所有行

$row=$command->queryrow();  

// 查詢並返回結果中的第一行

$column=$command->querycolumn(); // 查詢並返回結果中的第一列

$value=$command->queryscalar();  // 查詢並返回結果中第一行的第乙個字段

3.結果集操作類cdbdatareader的使用

query()方法執行如果成功,它將返回乙個

cdbdatareader

例項,通過此例項可以遍歷資料的結果行,

執行的sql語句返回的不是結果集,只是狀態值,例如:insert ,update,delete.則用execute() 例如:$this->command->execute(); 

要使用表字首

,配置 cdbconnection::tableprefix 屬性為所希望的表字首。 然後,在 sql 語句中使用} 代表表的名字,其中的 tablename 是指不帶字首的表名。 例如,如果資料庫含有乙個名為tbl_user 的表,而 tbl_ 被配置為表字首,那我們就可以使用如下**執行使用者相關的查詢:

$sql='select * from }';

$users=$connection->createcommand($sql)->queryall();

繫結引數

要避免 sql 注入攻擊 並提高重複執行的 sql 語句的效率, 你可以 "準備(prepare)"一條含有可選引數佔位符的 sql 語句,在引數繫結時,這些佔位符將被替換為實際的引數。引數佔位符可以是命名的 (表現為乙個唯一的標記) 或未命名的 (表現為乙個問號)。呼叫cdbcommand::bindparam() 或 cdbcommand::bindvalue() 以使用實際引數替換這些佔位符。 這些引數不需要使用引號引起來:底層的資料庫驅動會為你搞定這個。 引數繫結必須在 sql 語句執行之前完成。

//

一條帶有兩個佔位符 ":username" 和 ":email"的 sql

$sql="

insert into tbl_user (username, email) values(:username,:email)";

$command

=$connection

->

createcommand

($sql);

//用實際的使用者名稱替換佔位符 ":username"

$command

->

bindparam("

:username",

$username

,pdo

::param_str);

//用實際的 email 替換佔位符 ":email"

$command

->

bindparam("

:email",

$email

,pdo

::param_str);

$command

->

execute()

;//使用新的引數集插入另一行

$command

->

bindparam("

:username",

$username2

,pdo

::param_str);

$command

->

bindparam("

:email",

$email2

,pdo

::param_str);

$command

->

execute()

;

方法 bindparam() 和 bindvalue() 非常相似。唯一的區別就是前者使用乙個 php 變數繫結引數, 而後者使用乙個值。對於那些記憶體中的大資料塊引數,處於效能的考慮,應優先使用前者

當獲取查詢結果時,你也可以使用 php 變數繫結列。 這樣在每次獲取查詢結果中的一行時就會自動使用最新的值填充

$sql="

select username, email from tbl_user";

$datareader

=$connection

->

createcommand

($sql

)->

query()

;//使用 $username 變數繫結第一列 (username)

$datareader

->

bindcolumn(1

,$username);

//使用 $email 變數繫結第二列 (email)

$datareader

->

bindcolumn(2

,$email);

while

($datareader

->

read()

!==false

)

4.資料庫事務操作cdbtransaction.php

當乙個應用要執行幾條查詢,每條查詢要從資料庫中讀取並/或向資料庫中寫入資訊時,保證資料庫沒有留下幾條查詢而只執行了另外幾條查詢是非常重要的。 事務,在 yii 中表現為 cdbtransaction 例項,可能會在下面的情況中啟動:

* 開始事務.

* 乙個個執行查詢。任何對資料庫的更新對外界不可見。

* 提交事務。如果事務成功,更新變為可見。

* 如果查詢中的乙個失敗,整個事務回滾。

上述工作流可以通過如下**實現:

$transaction=$connection->begintransaction();

trycatch(exception $e) // 如果有一條查詢失敗,則會丟擲異常

'

yii 資料庫操作

connection yii db 假設你已經建立了乙個 db 連線 如果沒有,你可能需要顯式建立乙個連線 connection new cdbconnection dsn,username,password command connection createcommand sql 如果需要,此 s...

yii 資料庫操作彙總

find 返回乙個activerecord物件,需要使用one 或者all 獲取最終資料。findbysql 接收sql,返回乙個activerecord物件,需要使用one 或者all 獲取最終資料。findone 和findall 直接返回物件陣列,不需要再使用one 或者all use pub...

Yii資料庫的操作

php框架yii中資料庫的操作詳解,涉及的內容主要是增刪改查,基礎資訊。以下設計乙個表 book 中五個變數 bookid,bookname,publish,author,about 其中bookid為表關鍵碼,針對此表中做出相應的資料庫操作。獲取前端資料,設計五個變數 request yii re...