关闭

ThinkPHP 3.2.3+ORACLE插入数据BUG修复及支持获取自增Id的上次记录

标签: thinkphporacle
1418人阅读 评论(0) 收藏 举报
分类:

ThinkPHP 3.2.3+ORACLE插入数据BUG修复及支持获取自增Id的上次记录

thinkphp 3.2.3对Oracle的插入数据存在bug,直接导致我今天debug了一晚上。还好找到了在官方社区找到了solution。 以下转自 tp官方社区,感谢lajox的solution。

TP+ORACLE插入数据BUG修复以及获取自增Id支持getLastInsID方法
这些天在做Api接口时候,发现用TP操作Oracle数据库,发现查询修改删除都能执行,
但一旦执行插入操作老是报错。类似问题比如: http://www.thinkphp.cn/bug/3286.html
花了点时间仔细研究一下,发现是BUG.
下面是我的解决办法:
针对版本:ThinkPHP3.2.3
BUG修复
修改文件:Db\Driver\Oracle.class.php

找到 execute方法,
找到:this>initConnect(true);bind = $this->bind; 这句:

public function execute($str,$fetchSql=false) {
    $bind = $this->bind; //新增这句
    $this->initConnect(true);

找到:foreach ($this->bind as $key => $val) { 这句
前面加上 $this->bind = $this->bind ? $this->bind : $bind; 这句:

$this->bind = $this->bind ? $this->bind : $bind; //新增这句
foreach ($this->bind as $key => $val) {

找到 $this->lastInsID = $this->_linkID->lastInsertId(); 这句
将其修改为:

 //修改:
 //$this->lastInsID = $this->_linkID->lastInsertId();
 $this->lastInsID = $this->lastInsertId($this->table);

Oracle.class.php文件中新增以下代码:

/**
 * 取得Oracle最近插入的ID
 * @access public
 */
public function lastInsertId($sequence = '') {
    try {
        $lastInsID = $this->_linkID->lastInsertId();
    } catch(\PDOException $e) {
        //对于驱动不支持PDO::lastInsertId()的情况
        try {
            $lastInsID = 0;
            $seqPrefix = C("DB_SEQUENCE_PREFIX") ? C("DB_SEQUENCE_PREFIX") : 'seq_';
            $sequence = $sequence ? $sequence : $seqPrefix.$this->table;
            $q = $this->query("SELECT {$sequence}.CURRVAL as t FROM DUAL");
            if($q) {
                $lastInsID = $q[0]['t'];
            }
        } catch(\Exception $e) {
            //print "Error!: " . $e->getMessage() . "</br>";
            //exit;
        }
    }
    return $lastInsID;
}

调用方法:
1.数据库配置:

 'DB_PREFIX'=>'tb_',//表名前缀
 'DB_SEQUENCE_PREFIX' => 'seq_',//序列名前缀,每个表对应的序列应为: 序列名前缀+表名
 'DB_TRIGGER_PREFIX' => 'tig_',//触发器名前缀

2.先创建user数据表
表字段:id, username, password

3.然后创建[序列+触发器]

----创建序列
create sequence seq_user
increment by 1 
start with 1
nomaxvalue
nominvalue
nocache;
----创建触发器
create or replace trigger "tig_user"
before insert on tb_user
for each row when(new.id is null)
begin
select seq_user.nextval into :new.id from dual;
end;

4.最后一步,在UserAction中写插入数据代码如下:

$data = array(
    'phone'=>$phone,
    'password'=>md5($password)
);
 $r = M('user')->field(true)->add($data); //执行插入并返回上次插入Id
if($r){
    //$r = M('user')->getLastInsID(); //获取上次插入Id
    echo '上次插入记录:'.$r;
}else{
    $this->error('操作失败');
}
1
0
查看评论

TP3.2.3 无限极分类&&获取所有子分类包括自身

/* 无限级分类树 */ public function tree($data,$pid=0,$level=1) { static $treeArr = array(); foreach ($data as $v) { if ($v['pid'...
  • cooldrw2012
  • cooldrw2012
  • 2016-07-12 22:57
  • 2796

php与oracle数据库实现由序列获取当前表可insert的id值

select SEQUENCE_NAME from user_sequences; 假如SEQUENCE_NAME的值是这种形式: SEQ_ORDER_MASTER_ID (ORDER_MASTER为表名) select last_number from user_sequence wher...
  • u012581409
  • u012581409
  • 2014-08-18 09:55
  • 923

PHP取得刚插入数据的ID 并将这个ID插入到别的表

$id = mysql_insert_id(); mysql_insert_id() 函数返回上一步 INSERT 操作产生的 ID。 如果上一查询没有产生 AUTO_INCREMENT 的 ID,则 mysql_insert_id() 返回 0。
  • haibo0668
  • haibo0668
  • 2017-03-09 16:20
  • 1385

ThinkPHP 3.2.3+ORACLE插入数据BUG修复及支持获取自增Id的上次记录

ThinkPHP 3.2.3+ORACLE插入数据BUG修复及支持获取自增Id的上次记录 thinkphp 3.2.3对Oracle的插入数据存在bug,直接导致我今天debug了一晚上。还好找到了在官方社区找到了solution。 以下转自 tp官方社区,感谢lajox的solution。 T...
  • ACMore_Xiong
  • ACMore_Xiong
  • 2016-12-09 00:56
  • 1418

PHP TP5 连接postgres数据库,获取新增数据主键值

TP5 文档中::说明:新增数据,如果要获取新增数据的自增ID  1.     使用Model,可以使用下面的方式: $user = new User; $user->name = 'thinkphp'; $user-...
  • sinat_35767703
  • sinat_35767703
  • 2017-07-28 23:51
  • 812

springMVC中jdbcTemplate接口类插入记录后得到自动增长的id

<br />package user.jdbctemplate;<br />import java.sql.Connection;<br />import java.sql.PreparedStatement;<br />import java.sql...
  • shangtongwei
  • shangtongwei
  • 2010-08-20 08:52
  • 3389

如何插入一条记录获取插入后的自动增长ID列的方法.

主要介绍了如何在设定了自动增长ID列后添加一条数据后获取添加的自动增长的ID值方法.这篇文章我写了一个使用企业库3.0的方法来获取自动增长ID列的方法,代码如下:using System;using System.Data;using System.Configuration;using Syste...
  • winnerzone
  • winnerzone
  • 2007-06-13 13:31
  • 2365

获取下一个自增长id值的方法

注意:是获取下一个自动增长的id值,而不是现有表中最大的。 方法一,使用show table status ,然后获取auto_increment的值,也可以获取每张表的表名。 方法二,使用select max(id) + 1...
  • u011341352
  • u011341352
  • 2015-09-22 16:04
  • 399

添加一条数据后,如何获得新增加数据自增id的值

public int insertDemo(int uid){ int flag=0; String sql="insert into capsule (userid) values("+uid+")"; try{ con=util.openC...
  • u011930471
  • u011930471
  • 2014-02-11 10:30
  • 940

Spring JdbcTemplate返回插入记录的自增Id

Java代码   public int insertTable(LabelForm f) throws SQLException,ParseException   {   ...
  • sqzhao
  • sqzhao
  • 2015-01-03 23:00
  • 2013
    个人资料
    • 访问:309459次
    • 积分:5888
    • 等级:
    • 排名:第5186名
    • 原创:273篇
    • 转载:8篇
    • 译文:0篇
    • 评论:45条
    友情链接
    最新评论