背景
TP小白新接手的一个项目,公司之前有同事使用过3.1.3版本TP ,故在同事的带领下,开始TP之旅
测试环境
ThinkPHP 3.1.3 (PS:知道它老古董,小白入门,勿喷)
WAMPServer
Memcached
Postgresql 10
废话不多说,直接贴代码
经过打印,发现$id 死活不对,直接走读源码
ThinkPHP\Lib\Core\Model.class.php
/**
* 新增数据
* @access public
* @param mixed $data 数据
* @param array $options 表达式
* @param boolean $replace 是否replace
* @return mixed
*/
public function add($data='',$options=array(),$replace=false) {
//.....省略部分
$result = $this->db->insert($data,$options,$replace);
if(false !== $result ) {
$insertId = $this->getLastInsID();
if($insertId) {
// 自增主键返回插入ID
$data[$this->getPk()] = $insertId;
$this->_after_insert($data,$options);
return $insertId;
}
$this->_after_insert($data,$options);
}
return $result;
}
发现 $this->getLastInsID();,继续走读Db.class.php,Pgsql.class.php等相关类
最后在Pgsql.class.php发现对应的获取函数
public function last_insert_id() {
$query = "SELECT LASTVAL() AS insert_id";
$result = pg_query($this->_linkID,$query);
list($last_insert_id) = pg_fetch_array($result,null,PGSQL_ASSOC);
pg_free_result($result);
return $last_insert_id;
}
经过代码测试,错误代码定位在
list($last_insert_id) = pg_fetch_array($result,null,PGSQL_ASSOC);
list() 用于在一次操作中给一组变量赋值。
注释:list()只用于数字索引的数组,且假定数字索引从 0 开始。
也就是list()接收如下形式的数组,是可以正常复制的
$my_array = array(0=>'Dog',1=>'Cat',2=>'Horse');
list($a, $b, $c) = $my_array;
echo 'I have several animals, a '.$a.', a '.$b.' and a '.$c;
但是pg_fetch_array 返回的数据是这样的
array(
‘insert_id’ => 10
)
故而导致变量last_insert_id没有赋值成功。
最终代码修改如下
/**
* 用于获取最后插入的ID
* @access public
* @return integer
*/
public function last_insert_id() {
//........省略
$row = pg_fetch_array($result,null,PGSQL_ASSOC);
$last_insert_id = $row['insert_id'];
pg_free_result($result);
return $last_insert_id;
}