Yii中的最后一个插入ID返回错误

时间:2014-02-26 13:23:13

标签: postgresql 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] => 
                        )

                )

4 个答案:

答案 0 :(得分:4)

使用postgresql,你不能通过这种方式获得最后一次

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

试试这个(tbl_user_group_id是你的表id列,_seq是postgresql)

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

$lastId= Yii::app()->db->getCommandBuilder()->getLastInsertID('{{tablename}}') ;

答案 1 :(得分: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();

答案 2 :(得分: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()在与PDO_PGSQL一起使用时需要name参数,因此需要用Yiii::app()->db->getLastInsertID();替换此代码Yii::app()->db->getCommandBuilder()->getLastInsertID('{{tablename}}') ;

请参阅此link

答案 3 :(得分:0)

回复这个帖子可能为时已晚。但情况就是这样。

  • 按照用户“永远阳光”#39;您可以发送'序列名称'通过硬编码,但这不是一个好的编码实践。
  • 根据用户' Kitchu'使用' getCommandBuilder'很好,因为,如果提供了“表名称”,它将查询架构并找出“序列名称”。它会查询CDBCommand的getLastInsertId'通过'序列名称'

如果您没有定义主键,那么要确保它是一件事。在桌面上,您最终会得到值为' NULL'