2014-02-26 58 views
1

我剛剛在控制器中執行了一些代碼,並試圖找到最後插入的id。Yii中的最後插入id返回錯誤

但它顯示■錯誤:

這是我的代碼:

$sql = 'INSERT into "Tbl_Community" ("User_id","Community_name") VALUES (10,'new community')'; 
$connection = Yii::app() -> db; 
$command = $connection -> createCommand($sql); 
$command -> execute(); 
echo $connection->getLastInsertID(); 

錯誤:

[message:protected] => SQLSTATE[42602]: Invalid name: 7 ERROR: invalid name syntax 
    [string:Exception:private] => 
    [code:protected] => 42602 
    [file:protected] => D:\wamp\www\Tiein\framework\db\CDbConnection.php 
    [line:protected] => 548 
    [trace:Exception:private] => Array 
     (
      [0] => Array 
       (
        [file] => D:\wamp\www\Tiein\framework\db\CDbConnection.php 
        [line] => 548 
        [function] => lastInsertId 
        [class] => PDO 
        [type] => -> 
        [args] => Array 
         (
          [0] => 
         ) 

       ) 

回答

0

再說什麼user714965指出,我通常把這些參數在執行剛剛以確保PDO正確使用它們。如果您在您的示例中編寫SQL命令,並且您從表單讀取參數,則會出現問題。

Yii::app()->db->createCommand('INSERT into "Tbl_Community" ("User_id","Community_name") VALUES (:User_id,:Community_name)')->execute(array(":User_id"=>10, ":Community_name"=>"new community")); 
$id = Yii::app()->db->getLastInsertID(); 
+0

我試過你的解決方案,但它現在再次顯示相同的錯誤... – Kichu

+0

插入到表已完成,但最後插入的ID不可訪問 – Kichu

0

我終於得到了解決:

$sql = 'INSERT into "Tbl_Community" ("User_id","Community_name") VALUES (10,\'new community\')'; 
    $connection = Yii::app() -> db; 
    $command = $connection -> createCommand($sql); 
    $command -> execute(); 
    $id = $connection->getCommandBuilder()->getLastInsertID('{{Tbl_Community}}'); 
echo $id; 

PDO :: lastInsertID()需要name參數與PDO_PGSQL使用時,因此需要通過Yii::app()->db->getCommandBuilder()->getLastInsertID('{{tablename}}') ;

替換此代碼Yiii::app()->db->getLastInsertID();請參閱本link

5

with postgresql你不能通過這種方式得到最後

$lastId= Yii::app()->db->getLastInsertID(); 

試試這個(tbl_user_group_id是你的表id列和_seq是一個針對PostgreSQL)

$lastId=Yii::app()->db->getLastInsertID('tbl_user_group_id_seq'); 
+0

謝謝,這正是我正在尋找:) –

+1

好吧,祝你好運@YoussefEssayesy,順便說一句,你可以接受答案。 –

0

可能來不及回覆此線程。但是,情況就是如此。

  • 根據用戶'永遠晴朗'你可以通過硬編碼發送'序列名',但這不是一個好的編碼習慣。
  • 根據用戶'Kitchu'使用'getCommandBuilder'是很好的,因爲,如果提供了'TableName',它將查詢Schema並找出'Sequence Name'。這將inturn通過傳遞「序列名稱」

一件事查詢CDBCommand的「getLastInsertId」,以確保它,如果你還沒有在表中定義的「主鍵」,那麼你將最終得到的值爲'NULL'