TP 3.1.3 pgsql数据库模型getLastInsId()无法获取上次插入的id情况,BUG?

背景

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;
    }

参考链接

1.PHP中的list()说明
2.pgsql模型getLastInsId()获取上次插入的id的bug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值