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下批量挂马和批量清马代码
Feb 27 PHP
ThinkPHP写第一个模块应用
Feb 20 PHP
探讨php define()函数及defined()函数使用详解
Jun 09 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
destoon实现调用自增数字从1开始的方法
Aug 21 PHP
javascript+php实现根据用户时区显示当地时间的方法
Mar 11 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
PHP实现 APP端微信支付功能
Jun 22 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
Dec 04 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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
附件名前加网站名
2008/03/23 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
详解Python进程间通信之命名管道
2017/08/28 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
印尼最大的在线购物网站:MatahariMall.com
2016/08/26 全球购物
元旦晚会策划方案
2014/02/18 职场文书
授权收款委托书范本
2014/10/10 职场文书
旷工辞退通知书
2015/04/17 职场文书
创业计划书之宠物店
2019/09/19 职场文书
app场景下uniapp的扫码记录
2022/07/23 Java/Android