thinkphp中连接oracle时封装方法无法用的解决办法
2023-06-13 09:15:01 时间
最近收集了一些关于THinkPHP连接Oracle数据库的问题,有很多朋友按照连接mysql的方法来操作,导致有一些方法在Oreale中无法正常使用。比如说:findAll,Select方法无法使用,获取不到需要的数据。Create和add方法无法创建和写入数据到数据库中。
其实根据以前问题我做了几天调试,找到了问题所在,并成功在我自己一个小项目练习中使用正常,那么现在就将我的经验分享给大家。
1,数据库的连接及配置文件的内容我就不说了,上面已经做了解释。我这里只根据一个数据表的例子来说明我的操作。
2,表结构如下:
3,这个表中有3个字段,ID主键,用户名username和密码password,因为oracle数据库把表名和字段都是转成大写的,同时不支持ID主键自增,我只有使用另外的方法来实现这个功能,比如:ID自动序列+触发器实现ID自增。复制代码代码如下:
其实根据以前问题我做了几天调试,找到了问题所在,并成功在我自己一个小项目练习中使用正常,那么现在就将我的经验分享给大家。
1,数据库的连接及配置文件的内容我就不说了,上面已经做了解释。我这里只根据一个数据表的例子来说明我的操作。
2,表结构如下:
3,这个表中有3个字段,ID主键,用户名username和密码password,因为oracle数据库把表名和字段都是转成大写的,同时不支持ID主键自增,我只有使用另外的方法来实现这个功能,比如:ID自动序列+触发器实现ID自增。
4,ThinkPHP中,Action是控制器,Model是模型,视图是以模板方式体现的。
其次,说模型,这里才是成功的主要原因。为什么?ThinkPHP是有字段映射的,这个在对MYSQL的支持非常完美,基本不用写MODEL,但是对ORALCE就不行了,当使用M->add()来添加数据时,字段会被$this->_facade()方法过滤掉。这样生成的SQL语句就是没法执行的,肯定是错误的,导致数据添加不到数据库中,那么使用select()方法也是一样被过滤。
再次,当我单步调试时,断点被过滤的时候,过滤方法使用到了new出来的MODEL,这个MODEL会有一个字段映射的数组在里面,这个过滤方法就是和这个字段数组进行对比,如果不一致就过滤掉,结果我调试发现,new出来的MODEL根本没有把字段映射加进去,数组直接为空,当然就没法和添加的数据字段一一对应了。这就是错误的关键。
下面就来说解决方法,其实很简单,按照基本的MVC结构,不管是PHP还是JAVA还是.NET都有这样的结构,那么按照严格的标准,MODEL层的代码是必须写的,就是要和数据库的字段做映射。但是很多用mysql的,就直接没有去写MODEL里面的代码。这种习惯被用到了oracle中,就出了问题。
5,下面针对我上面的数据表写出我的代码:
我的Action是这样的:UserAction.class.php。控制器我只对添加和查找做例子,因此代码如下:
publicfunctionindex(){
header("Content-Type:text/html;charset=utf-8");
$M_User=newUserModel();
$User_List=$M_User->select();
$this->assign("Title","用户管理");
$this->assign("UserList",$User_List);
$this->display();
}
//添加用户提交处理
publicfunctionCreate_Post(){
$M_User=newUserModel();
$data["username"]=$this->_post("username");
$data["password"]=md5($this->_post("pwd"));
if($M_User->create()){
$Query_Result=$M_User->add($data);
if(false!==$Query_Result){
$this->success("用户添加成功");
}else{
$this->error("用户添加错误");
}
}else{
header("Content-Type:text/html;charset=utf-8");
exit($M_User->getError()."[<ahref="javascript:history.back()">返回</a>]");
}
}
Action解释:
$M_User=newUserModel();
这个方法最好这么写,因为做.NET的原因,一直都这么写的。针对具体的模型进行实例化,严格规定我就要对User表进行操作了。
获取POST数据的代码就不多解释了。
$M_User->create();
这是ThinkPHP的一个方法,很好,可以帮你过滤掉非法的东西,建议使用。
$Query_Result=$M_User->add($data);
这一段就是数据的添加,我习惯指定要添加的数据,也是因为这一段需要根据$M_User实例化,并过滤字段。当然了,我们只要做好MODEL的代码,就不会有问题。下面的代码就不解释。官方文档都有。
我的Model是这样的:UserModel.class.php
?protected$fields=array(
"id","username","password"
);
6,经过了以上的操作,针对Oracle的数据库操作就完成了,我现在也可以任意使用ThinkPHP提供的方法来操作数据了,包括分页(limit),find(),findAll等等。
连接mysql或许没有问题,但是在oracle中,封装的方法无法调用时,一定要在model层中加入字段的定义。
相关文章
- ORA-29711: error occurred during registration of Oracle process with CSS ORACLE 报错 故障修复 远程处理
- 深入探索Oracle数据交换技术(oracle数据交换)
- Oracle数据库中忽略大小写查询的方法(oracle忽略大小写)
- Oracle 更改列名的步骤与方法(oracle更改列名)
- Oracle数据库中触发器类型及应用(oracle触发器类型)
- 深入探索Oracle优化之路(oracle优化思路)
- Oracle数据库操作:更新行数的方法(oracle更新行数)
- 生成Oracle随机字符串的实现方法(oracle随机字符串)
- Oracle函数out方法详解(oracle函数 out)
- 学习Oracle数据库:实用的教学指南(oracle数据库 教材)
- 深入探索Oracle中查看归档日志的方法(oracle查看归档日志)
- 如何正确实施Oracle数据库连接(怎么连接oracle数据库)
- Oracle数据库解决方案内置强大方法(oracle内置方法)
- 梦想成真Oracle给了我个Offer(oracle出offer)
- 临时表利用Oracle全局临时表提高查询效率(oracle 全局)
- 以燕麦面对Oracle(oats oracle)
- AIX下备份Oracle数据库的步骤(aix下备份oracle)
- 深入浅出Oracle DDD技术实践(ddd oracle)
- Oracle介质位置失效排查原因及解决方法(oracle介质位置无效)
- Oracle中行级锁的设计与实现(oracle中的行级锁)
- Oracle中导出表结构的方法简介(oracle中导出表结构)
- 内容从Oracle数据库中查看表中数据的方法(oracle从哪里看表)
- Oracle中关闭事务的正确方法(oracle 中关闭事务)
- Oracle中中断循环的实现方式(oracle中中断循环)
- Oracle 无法修复技术挑战与改进思路(oracle不能修改)