Model类的create方法总是返回0

#1 978868928

public function create($row){
                $values = array();
                foreach($row as $k=>$v){
                        $keys[] = "`{$k}`"; $values[":".$k] = $v; $marks[] = ":".$k;
                }
                $this->execute("INSERT INTO ".$this->table_name." (".implode(', ', $keys).") VALUES (".implode(', ', $marks).")", $values);
                return $this->dbInstance($GLOBALS['mysql'], 'master')->lastInsertId();
}

http://php.net/manual/zh/pdo.lastinsertid.php

数据库内的字段id已经设定为主键,且使用自增约束。
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),

但是在执行的时候,create总是返回0,即使插入成功了!

2016-07-10 01:26:46

#2 cigery

是不是使用了事务

2016-07-11 01:23:44

#3 jake

http://php.net/manual/zh/pdo.lastinsertid.php

在不同的 PDO 驱动之间,此方法可能不会返回一个有意义或一致的结果,因为底层数据库可能不支持自增字段或序列的概念。

原生的lastinsertid也会没有返回的情况下,估计是底层驱动不支持或者其他什么情况,可以试试封装create覆盖后再查一次返回

2016-07-11 08:35:07

#4 978868928

jake 发表于 2016-7-11 08:35
http://php.net/manual/zh/pdo.lastinsertid.php

在不同的 PDO 驱动之间,此方法可能不会返回一个有意义或 ...
临时使用execute 返回的“rowCount”进行检验。

官方框架是否就这个问题改一下create方法?

2016-07-11 23:10:03

#5 jake

978868928 发表于 2016-7-11 23:10
临时使用execute 返回的“rowCount”进行检验。

官方框架是否就这个问题改一下create方法?
3.1版的框架有对此进行补充的代码,不过考虑到这个情况十分稀有,很简单就可以解决,并且php本身也没做太多的补充,所以新版已经去掉这个。

2016-07-12 09:06:26

#6 978868928

jake 发表于 2016-7-12 09:06
3.1版的框架有对此进行补充的代码,不过考虑到这个情况十分稀有,很简单就可以解决,并且php本身也没做太 ...
谢谢,我直接加一层封装。

2016-07-12 15:52:36