background image

PHP

框架 thinkphp 中连接 oracle 时封装方法无法用的解决

办法

本文旨在为大家分享 thinkphp 中连接 oracle 时封装方法无法用的解决方法,供大家参考

最近收集了一些关于 THinkPHP 连接 Oracle 数据库的问题,有很多朋友按照连接 mysql 的
方法来操作,导致有一些方法在 Oreale 中无法正常使用。比如说:findAll,Select 方法无
法使用,获取不到需要的数据。Create 和 add 方法无法创建和写入数据到数据库中。
 
其实根据以前问题我做了几天调试,找到了问题所在,并成功在我自己一个小项目练习
中使用正常,那么现在就将我的经验分享给大家。
 
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 中,就出了问题。