$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.6) public 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謂語連接起來。