Yii 1 數據庫操作 筆記


$result = array(
    'id'=>null,
    'val'=>0
);
$row1 = Yii::app()->db->createCommand()->insert('test1', $result);
$id   = Yii::app()->db->getLastInsertID();
$row2 = Yii::app()->db->createCommand()->update('test1', array('val'=>$id) , 'id=:id',array(':id'=>$id));
echo $id;
exit;

 

<?php
#1. 建立數據庫連接 可以使用  try...catch 捕獲可能拋出的異常
#$connection=new CDbConnection($dsn,$username,$password);
#   DSN格式
#   SQLite: sqlite:/path/to/dbfile
#   MySQL: mysql:host=localhost;dbname=testdb
#   PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb
#   SQL Server: mssql:host=localhost;dbname=testdb
#   Oracle: oci:dbname=//localhost:1521/testdb
#在配置文件里面修改別名
#array(
#    'components'=>array(
#        'db'=>array(
#            'class'=>'CDbConnection',
#            'connectionString'=>'mysql:host=localhost;dbname=testdb',
#            'username'=>'root',
#            'password'=>'password',
#            'emulatePrepare'=>true,  // needed by some MySQL installations
#        ),
#    ),
#)
#然后使用這種方式來建立連接

#然后我們就可以通過 
$connection = Yii::app()->db 
#訪問數據庫連接了。它已經被自動激活了,除非我們特意配置了 
#CDbConnection::autoConnect 為 false。
# 通過這種方式,這個單獨的DB連接就可以在我們代碼中的很多地方共享。
# 如果沒有,你可能需要顯式建立一個連接:
# $connection=new CDbConnection($dsn,$username,$password);
#$connection->active=true;  # 建立鏈接之后active為true;
$connection->active=false;  # 關閉連接
#運行SQL
$command=$connection->createCommand($sql);
#SQL修改
$command->text = $newSQL;
#########################################################
#execute()方法用來執行 INSERT, UPDATE 和 DELETE 。如果成功,它將返回此執行所影響的行數。
#query() 方法執行一條會返回若干行數據的 SQL 語句,例如 SELECT。
#如果成功,它將返回一個CDbDataReader 實例,通過此實例可以遍歷數據的結果行。
#為簡便起見, (Yii)還實現了一系列 queryXXX() 方法以直接返回查詢結果
#如果SQL發生錯誤,將會拋出一個異常。.
$rowCount   =    $command->execute();                # 執行無查詢 SQL
$dataReader =    $command->query();                  # 執行一個 SQL 查詢
$rows       =    $command->queryAll();               # 查詢並返回結果中的所有行
$row        =    $command->queryRow();               # 查詢並返回結果中的第一行
$column     =    $command->queryColumn();            # 查詢並返回結果中的第一列
$value      =    $command->queryScalar();            # 查詢並返回結果中第一行的第一個字段
#########################################################
#獲取查詢結果
#在生成 CDbDataReader后
#重復調用 CDbDataReader::read()
#也可以在 foreach 語言結構中使用 CDbDataReader

####例如####
$dataReader = $command->query();

#方法1 重復調用 read() 直到它返回 false
while( ($row = $dataReader->read()) !== false) { ... }
#方法2 使用 foreach 遍歷數據中的每一行
foreach($dataReader as $row) { ... }
#方法3 一次性提取所有行到一個數組
$rows = $dataReader->readAll();

#注意: 
#所有的 queryXXX() 方法會直接返回數據
#query()卻不會,返回的是一個CDbDataReader 的實例

#使用事務
$transaction= $connection->beginTransaction();
try
{
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    #其他
    $transaction->commit();
}
catch(Exception $e) # 如果有一條查詢失敗,則會拋出異常
{
    $transaction->rollBack(); #回滾
}


#########################################################

#預處理(參數綁定)  避免注入 提高重復執行的效率
#占位符可以是命名的 (表現為一個唯一的標記) 或未命名的 (表現為一個問號)。占位符將被替換為實際的參數。
#調用 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 變量綁定參數, 
#而后者使用一個值。對於那些內存中的大數據塊參數,處於性能的考慮,應優先使用前者。
#########################################################
#綁定列
$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)
{
    #$username 和 $email 含有當前行中的 username 和 email 
    #這里就不用每次都給兩個變量賦值了
}
#########################################################
#使用表前綴
#配置 CDbConnection::tablePrefix 屬性為所希望的表前綴。 
#array(
#    'components'=>array(
#        'db'=>array(
#            'class'=>'CDbConnection',
#            'connectionString'=>'mysql:host=localhost;dbname=testdb',
#            'username'=>'root',
#            'password'=>'password',
#            'emulatePrepare'=>true,  // needed by some MySQL installations
#            'tablePrefix'=>"表前綴_"
#        ),
#    ),
#)
$sql='SELECT * FROM {{user}}';
$users=$connection->createCommand($sql)->queryAll();


######################

$user = Yii::app()->db->createCommand()
        ->select('username, password')
        ->from('tbl_user')
        ->where('id=:id', array(':id'=>1))
        ->queryRow();



where() 方法 (可用自 v1.1.6public CDbCommand where(mixed $conditions, array $params=array ( ))

$conditions    mixed    放在WHERE部分的條件。
$params    array    綁定到此查詢的參數 (name=>value)
{return}    CDbCommand    返回此命令對象本身

設置查詢的WHERE。 

這個方法要求一個 $conditions 參數和一個 $params 參數, 指定值綁定到查詢。 

$conditions 參數可以是一個字符串(例如 'id=1')或一個數組。 如果是后者,它必須是這種格式 array(operator, operand1, operand2, ...), 操作符可以是下面當中的一個,可能的操作數依賴於相應的操作符 :

and: 操作數應該使用AND連接起來。例如, array('and', 'id=1', 'id=2') 將生成 'id=1 AND id=2'。如果一個操作數是一個數組, 它將被使用這里描述的相同規則轉換成一個字符串。例如, array('and', 'type=1', array('or', 'id=1', 'id=2')) 將生成 'type=1 AND (id=1 OR id=2)'。 該方法將不做任何引用或轉義。
or: 和 and 操作符相似,除了操作數是使用OR連接起來。
in: 操作數1應該是一列或DB表達式,操作數2應該是一個數組, 表示相應的列的值或DB表達式應該在的范圍。例如, array('in', 'id', array(1,2,3)) 將生成 'id IN (1,2,3)'. 這個方法將正確的引用列名和范圍中的轉義值。
not in: 和 in 相似,除了在生成條件時把IN替換成NOT IN.
like: 操作數1應該是一列或一個DB表達式,操作數2是一個字符串或一個數組 表示列或DB表達式應該like的值。 例如, array('like', 'name', '%tester%') 將生成 "name LIKE '%tester%'". 當值范圍被給定為一個數組,多個LIKE謂語將被生成並使用AND連接起來。 例如, array('like', 'name', array('%test%', '%sample%')) 將生成 "name LIKE '%test%' AND name LIKE '%sample%'". 這個方法將正確的引用列名和范圍中的轉義值。
not like: 和 like相似,除了在生成條件時使用NOT LIKE替換LIKE。
or like: 和 like相似,除了OR被用作把LIKE謂語連接起來。
or not like: 和 not like相似,除了OR被用作把NOT LIKE謂語連接起來。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM