ThinkPHP 3.2.3+ORACLE插入数据BUG修复及支持获取自增Id的上次记录
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的上次记录的更多相关文章
- mybatis 插入数据 在没有commit时 获取主键id
<insert id="insert" parameterType="Mail" useGeneratedKeys="true" ...
- Oracle 插入数据效率对比
oracle插入数据有多种方式: 将从多个表中查出来的数据插入到临时表中 数据行数 5189597 1.传统方式:直接将数据插入到表中 insert into LLB_BASIC_USER_D_TEM ...
- 获取刚刚插入表格的这条信息的自增ID
获取刚刚插入表格的这条信息的自增ID var conn=getConnection(); var msql="INSERT INTO " + table +" (&quo ...
- ThinkPHP增加数据库字段后插入数据为空的解决办法
今天用ThinkPHP做了一个简单的商品发布系统,数据库本来只有四个字段id,name,url,image.id是主键,name是商品名称,url是商品链接,image是商品图片,做的差不多了,发现还 ...
- thinkPHP 无法create,无法插入数据,提示非法数据对象
4.thinkPHP 无法create,提示非法数据对象解决方法:不要create+add,而用 data[]= '';+add$m_r_fa_account = D('R_fa_account'); ...
- JDBC向oracle插入数据
public static void main(String[] args) throws SQLException { 2 3 4 String driver="oracle.jdbc.d ...
- oracle插入数据的时候报错:ORA-00928: 缺失 SELECT 关键字
比如:插入数据的时候是这样的insert into a value('哈哈'); 报的是这样的错误:ORA-00928: 缺失 SELECT 关键字 其实就是value少了一个s,在oracle中,插 ...
- java批量向oracle插入数据
由于项目需要,需要将一个6M的txt中的数据插入到oracle数据表中.txt中的数据是每行一个词.经过统计,词总数是505040.为了看起来方便,我将我的所有方法写在类入口中,数据库的信息我会用te ...
- oracle插入数据
插入数据 insert into comm_error_code_def (ID, ERR_MESSAGE, ERR_CODE, ERR_DESC, NAME, MISC_DESC, STATUS, ...
随机推荐
- python学习笔记---文件的操作
数据的保存: 1.内存:常用的变量2.文件:文本内容,二进制的文件内容3.数据库: 读文件:1.要读取的文件路径一定要存在.2.打开存在的文件:open函数 参数1:文件的路径,相对的或者是绝对 ...
- POI 使用颜色字符串生成XSSFColor对象
public static int[] hexToRgb(String hex) { String colorStr = hex; if (hex.startsWith("#")) ...
- python视频学习笔记3(循环)
一.程序的三大流程 二.while 初始条件设置 —— 通常是重复执行的 计数器 while 条件(判断 计数器 是否达到 目标次数): 条件满足时,做的事情1 条件满足时,做的事情2 条件满足时,做 ...
- Docker Got permission denied while trying to connect to the Docker daemon socket at unix://
这是没有权限的原因,先将自己加入docker组,然后在重新启动就可以了, 下面参考来源:https://blog.csdn.net/weixin_40896352/article/details/80 ...
- cf1047C-Enlarge GCD-(欧拉筛+map+gcd+唯一分解定理)
https://vjudge.net/problem/CodeForces-1047C 题意:有n个数,他们有个最大公约数设为maxxgcd,要删去一些数,使得剩下的数的gcd大于maxxgcd. 解 ...
- express 内存溢出问题分析定位
一.现象 1. 如下报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 1: n ...
- gcc8.2安装
contrib/download_prerequisites 1.base_url='ftp://gcc.gnu.org/pub/gcc/infrastructure/' 改为base_url='ht ...
- kettle使用笔记1--基本安装和使用
参考来源 https://blog.csdn.net/qq_36698956/article/details/80751655,在这个文章基础上实际使用增加的. 一,安装,采用的是下载官方网站的win ...
- Windows内核驱动中操作文件
本页主题:如何在windows内核驱动中对文件操作,实现对文件的拷贝.粘贴.删除.查询信息等,这是很常用也是很简单的方法. 部分内容参考:http://www.cppblog.com/aurain/a ...
- 获取select下拉框选中的的值
有一id=test的下拉框,怎么获取选中的那个值呢? 分别使用javascript方法和jquery方法 <select id="test" name="&quo ...