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


Posted in PHP onJune 17, 2013

最近收集了一些关于THinkPHP连接Oracle数据库的问题,有很多朋友按照连接mysql的方法来操作,导致有一些方法在Oreale中无法正常使用。比如说:findAll,Select方法无法使用,获取不到需要的数据。Create和add方法无法创建和写入数据到数据库中。

其实根据以前问题我做了几天调试,找到了问题所在,并成功在我自己一个小项目练习中使用正常,那么现在就将我的经验分享给大家。

1,数据库的连接及配置文件的内容我就不说了, 上面已经做了解释。我这里只根据一个数据表的例子来说明我的操作。
2,表结构如下:
thinkphp中连接oracle时封装方法无法用的解决办法
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。控制器我只对添加和查找做例子,因此代码如下:

public function index() { 
        header("Content-Type:text/html; charset=utf-8");         $M_User = new UserModel(); 
        $User_List = $M_User->select(); 
        $this->assign('Title', '用户管理'); 
        $this->assign('UserList', $User_List); 
        $this->display(); 
} 
    //添加用户提交处理 
public function Create_Post() { 
        $M_User = new UserModel(); 
        $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() . ' [ <a href="javascript:history.back()">返 回</a> ]'); 
        } 
}

Action解释:
$M_User=new UserModel();

这个方法最好这么写,因为做.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'
        );

Model解释:这才是重点,这有这样,new出来的$M_User的映射字段数组才不会为空,这样才能和POST的数据进行对应,才会让过滤方法正常识别,不被过滤。
 
6,经过了以上的操作,针对Oracle的数据库操作就完成了,我现在也可以任意使用ThinkPHP提供的方法来操作数据了,包括分页(limit),find(),findAll等等。

连接mysql或许没有问题,但是在oracle中,封装的方法无法调用时,一定要在model层中加入字段的定义。

PHP 相关文章推荐
PHP+MYSQL开发工具及资源收藏
Jan 02 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
Destoon实现多表查询示例
Aug 21 PHP
php计算一个文件大小的方法
Mar 30 PHP
PHP+Apache环境中如何隐藏Apache版本
Nov 24 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
PDO::inTransaction讲解
Jan 28 PHP
PHP精确到毫秒秒杀倒计时实例详解
Mar 14 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 #PHP
thinkphp 多表 事务详解
Jun 17 #PHP
基于empty函数的输出详解
Jun 17 #PHP
基于empty函数的判断详解
Jun 17 #PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
Jun 17 #PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
Jun 17 #PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 #PHP
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
PHP 定界符 使用技巧
2009/06/14 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
php实现的双色球算法示例
2017/06/20 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
2016/12/02 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
vue和小程序项目中使用iconfont的方法
2020/05/19 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
python 自动重连wifi windows的方法
2018/12/18 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
物流管理专业大学生自荐信
2013/10/04 职场文书
促销活动方案模板
2014/02/24 职场文书
商业房地产广告语
2014/03/13 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
公务员个人总结
2015/02/12 职场文书
工厂员工辞职信范文
2015/05/12 职场文书
2016教师节感恩话语
2015/12/09 职场文书