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; 这句:

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

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

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

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

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

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

  1. /**
  2.  * 取得Oracle最近插入的ID
  3.  * @access public
  4.  */
  5. public function lastInsertId($sequence = ) {
  6.     try {
  7.         $lastInsID = $this->_linkID->lastInsertId();
  8.     } catch(\PDOException $e) {
  9.         //对于驱动不支持PDO::lastInsertId()的情况
  10.         try {
  11.             $lastInsID = 0;
  12.             $seqPrefix = C(“DB_SEQUENCE_PREFIX”) ? C(“DB_SEQUENCE_PREFIX”) : ‘seq_’;
  13.             $sequence = $sequence ? $sequence : $seqPrefix.$this->table;
  14.             $q = $this->query(“SELECT {$sequence}.CURRVAL as t FROM DUAL”);
  15.             if($q) {
  16.                 $lastInsID = $q[0][‘t’];
  17.             }
  18.         } catch(\Exception $e) {
  19.             //print “Error!: ” . $e->getMessage() . “</br>”;
  20.             //exit;
  21.         }
  22.     }
  23.     return $lastInsID;
  24. }

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

  1.  ‘DB_PREFIX’=>‘tb_’,//表名前缀
  2.  ‘DB_SEQUENCE_PREFIX’ => ‘seq_’,//序列名前缀,每个表对应的序列应为: 序列名前缀+表名
  3.  ‘DB_TRIGGER_PREFIX’ => ‘tig_’,//触发器名前缀

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

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

  1. —-创建序列
  2. create sequence seq_user
  3. increment by 1 
  4. start with 1
  5. nomaxvalue
  6. nominvalue
  7. nocache;
  8. —-创建触发器
  9. create or replace trigger “tig_user”
  10. before insert on tb_user
  11. for each row when(new.id is null)
  12. begin
  13. select seq_user.nextval into :new.id from dual;
  14. end;
4.最后一步,在UserAction中写插入数据代码如下:
  1. $data = array(
  2.     ‘phone’=>$phone,
  3.     ‘password’=>md5($password)
  4. );
  5.  $r = M(‘user’)->field(true)->add($data); //执行插入并返回上次插入Id
  6. if($r){
  7.     //$r = M(‘user’)->getLastInsID(); //获取上次插入Id
  8.     echo ‘上次插入记录:’.$r;
  9. }else{
  10.     $this->error(‘操作失败’);
  11. }

 

评论已经关闭。