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('操作失败');
}

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

  1. mybatis 插入数据 在没有commit时 获取主键id

      <insert id="insert" parameterType="Mail" useGeneratedKeys="true" ...

  2. Oracle 插入数据效率对比

    oracle插入数据有多种方式: 将从多个表中查出来的数据插入到临时表中 数据行数 5189597 1.传统方式:直接将数据插入到表中 insert into LLB_BASIC_USER_D_TEM ...

  3. 获取刚刚插入表格的这条信息的自增ID

    获取刚刚插入表格的这条信息的自增ID var conn=getConnection(); var msql="INSERT INTO " + table +" (&quo ...

  4. ThinkPHP增加数据库字段后插入数据为空的解决办法

    今天用ThinkPHP做了一个简单的商品发布系统,数据库本来只有四个字段id,name,url,image.id是主键,name是商品名称,url是商品链接,image是商品图片,做的差不多了,发现还 ...

  5. thinkPHP 无法create,无法插入数据,提示非法数据对象

    4.thinkPHP 无法create,提示非法数据对象解决方法:不要create+add,而用 data[]= '';+add$m_r_fa_account = D('R_fa_account'); ...

  6. JDBC向oracle插入数据

    public static void main(String[] args) throws SQLException { 2 3 4 String driver="oracle.jdbc.d ...

  7. oracle插入数据的时候报错:ORA-00928: 缺失 SELECT 关键字

    比如:插入数据的时候是这样的insert into a value('哈哈'); 报的是这样的错误:ORA-00928: 缺失 SELECT 关键字 其实就是value少了一个s,在oracle中,插 ...

  8. java批量向oracle插入数据

    由于项目需要,需要将一个6M的txt中的数据插入到oracle数据表中.txt中的数据是每行一个词.经过统计,词总数是505040.为了看起来方便,我将我的所有方法写在类入口中,数据库的信息我会用te ...

  9. oracle插入数据

    插入数据 insert into comm_error_code_def (ID, ERR_MESSAGE, ERR_CODE, ERR_DESC, NAME, MISC_DESC, STATUS, ...

随机推荐

  1. wcf_first

    WCF包括3部分:client(需要连接到哪里,需要调用什么),service(宿主,及其消息的公开,地址的公开),wcf服务库(提供契约名称,及其怎么干) 步骤: 1.新建wcf库,其中提供一个契约 ...

  2. Spring-boot中@ConfigurationProperties,@Value,@PropertySource

    1.利用@ConfigurationProperties获取配置的值,@ConfigurationProperties是springboot提供的基于安全类型的配置放置. application.pr ...

  3. c# System.Console

    System.Console类公开了和操作控制台相关的有用的静态字段和静态方法.下面是System.Console中一些较为重要的方法. public static void Beep()该方法播放蜂 ...

  4. zookeeper第一篇

    它是一个为分布式应用提供一致性服务的软件, 提供的功能包括:配置维护.域名服务.分布式同步.组服务等.

  5. java调用webservice方法

    由于项目的历史原因,webservice服务端是乙方公司开发的,我们自己开发的系统需要去调用乙方公司的webservice接口.前面用了网上提供的一种方法(非生成代理类),怎么也调用不成功(也许是因为 ...

  6. 小乌龟 coding 克隆、提交一直提示无权限

    因为之前设置过账号,但是网上各种命令行清除都没有用,进入小乌龟设置删除全局配置,系统配置,保存就可以克隆等操作了

  7. OGRE中Any 类型的实现

    [OGRE中Any类型的实现] OGRE中实现了一个class Any,使用Any 可以在上下文中传递任意类型的数据.其本质实现原理就是通过指针. Any 只包含一个成员变量,类型为 placehol ...

  8. oslo_db使用

    oslo_db是openstak中封装数据库访问sqlachmy的模块,网上搜索的资源并不多,除了openstack官方文档,在实际使用中的例子凤毛麟角. 有感于资源太少,在学习heat源码的过程中, ...

  9. SwipeBackLayout 右滑退出Activity

    不推荐通过添加依赖的方式来导入类库,因为本人导入后出现没法解决的问题. 这里推荐自己导入第三方库类,地址如下: https://github.com/yangzhilong00/MEvolution/ ...

  10. Java几种常用JSON库性能比较

    本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...