ThinkPHP连接Oracle数据库


Posted in PHP onApril 22, 2016

一、操作环境搭建

系统:Windows7 旗舰版 64位

PHP环境:wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24 32位版
下载地址:https://3water.com/softs/161568.html

ThinkPHP:3.2.3正式版
下载地址:http://thinkphp.cn/down.html

Oracle:Orcale_11gR2 32位版
下载地址:http://www.oracle.com/technetwork/cn/indexes/downloads/index.html

数据库操作工具:PLSQL Developer 32位
下载地址:https://3water.com/softs/63962.html

开发工具:NetBeans IDE 7.1.2
下载地址:https://3water.com/softs/18343.html

说明:这里我反复强调软件的“位”,是因为这个很重要,一般情况下,我们系统是64位的,那么最好软件也用64位的,但是这里除过系统外,全部选择32位是有原因的,目的是为了配合PLSQL Developer和WAMP的PHP扩展。因为PLSQL Developer没有64位版。有的朋友说用64位Oracle数据库,装32位客户端就行,我不想这样做,如果不喜欢我的操作方式,可以绕道。当然了,如果你不使用PLSQL Developer,而选择使用Oracle 自带的SQL Developer,那么你全安装64位或32都是你自己的事。PHP连接Oracle数据库需要开启相应的扩展,这个扩展也需要数据库客户端的支持,因为php扩展也需要对应数据库客户端的位数。??峦瓯稀?/p>

二、环境配置

1,操作系统的安装我就不说了,Oracle安装自己解决,NetBeans IDE 7.1.2也自己解决。

2,Wamp的安装我也不说了,不会的直接从DOS开始重新学习吧。

3,WAMP会把PHP的网页文件夹定义在安装wamp的文件夹下的www里面,我是安装在D盘,所以就是D:\WAMP\www。我们暂时不做别的自定义修改。启动wamp,系统托盘图标为绿色表示启动OK。

ThinkPHP连接Oracle数据库

4,打开localhost,看到如下界面,表示环境配置基本OK。为什么是基本了,因为还没有对Oracle的配置进行设置。

ThinkPHP连接Oracle数据库

5,打开如图的PHP扩展菜单,在绿色图标上,左键->PHP->PHP扩展,点击php-oci8的扩展,这时候这个WAMP会重启,等待重启后变绿,就表示OK。

ThinkPHP连接Oracle数据库

6,再次打开刚才的localhost页面,如果找到如图4的显示,就表示目前PHP已经支持Oracle了。

ThinkPHP连接Oracle数据库

注意,我现在用的 wamp和oracle客户端都是32位,如果其中一个是64位,那么这个oci的扩展时打不开的,同时自动环境监测页面也没有oci8的显示。在不使用PL/SQL的前提下,必须是32位Oracle和32位WAMP搭配,64位Oracle和64位WAMP搭配,else请绕道。

三、ThinkPHP配置

1,把下载好的3.0正式版解压,项目中只需要ThinkPHP文件夹,这是核心。
2,使用IDE新建一个项目,项目的文件夹为刚才的Wamp下的www文件夹,如果个人需要自定义别的文件夹,需要修改apache的配置文件,这里我不修改。
3,将Thinkphp文件夹拷贝到项目文件夹中,新建一个php文件,命名index.php。
4,IDE中已经有这些文件的显示了,打开index.php,编写如下内容:

<?php
 define('APP_DEBUG', true);
 require './ThinkPHP/ThinkPHP.php';

5,在浏览器中打开localhost/项目名/index.php,Thinkphp会帮你生成好相关文件和文件夹。
6,对配置文件进行操作,找到:Conf文件夹下config.php文件,修改如下:

<?php
return array(
 'DB_TYPE' => 'Oracle', // 数据库类型
 'DB_HOST' => '192.168.0.8', // 服务器地址
 'DB_NAME' => 'orcl', // 数据库名
 'DB_USER' => 'test', // 用户名
 'DB_PWD' => 'test', // 密码
 'DB_PORT' => '1521', // 端口
);

Oracle数据库和mysql 的结构不同,一般默认安装的数据库名是orcl,如果你使用了多个数据库监听,那么就要根据具体的监听字段来设置。比如:我本机数据库坚挺是Orcl,同时监听另外一个外网的数据库,监听字符串为Orcl2,那么如果你需要连接这个外网数据库,那么需要写的数据库名就是orcl2。

7,经过以上的配置,是已经可以连接oracle数据库了,但是在thinkphp的实际操作中有什么注意的地方,且听下回分解。

最近收集了一些关于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

'id', 'username', 'password');

Model解释:这才是重点,这有这样,new出来的$M_User的映射字段数组才不会为空,这样才能和POST的数据进行对应,才会让过滤方法正常识别,不被过滤。

6,经过了以上的操作,针对Oracle的数据库操作就完成了,我现在也可以任意使用ThinkPHP提供的方法来操作数据了,包括分页(limit),find(),findAll等等。

PHP 相关文章推荐
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
php入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
php项目中百度 UEditor 简单安装调试和调用
Jul 15 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
Zend Framework实现将session存储在memcache中的方法
Mar 22 PHP
PHP+Ajax+JS实现多图上传
May 07 PHP
php微信开发之自定义菜单实现
Nov 18 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
May 03 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 PHP
浅谈PHP5.6 与 PHP7.0 区别
Oct 09 PHP
php接口隔离原则实例分析
Nov 11 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 #PHP
yii2 页面底部加载css和js的技巧
Apr 21 #PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 #PHP
又拍云异步上传实例教程详解
Apr 19 #PHP
ThinkPHP中order()使用方法详解
Apr 19 #PHP
ThinkPHP中limit()使用方法详解
Apr 19 #PHP
ThinkPHP中where()使用方法详解
Apr 19 #PHP
You might like
URL Rewrite的设置方法
2007/01/02 PHP
微博短链接算法php版本实现代码
2012/09/15 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
yii操作session实例简介
2014/07/31 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
基于vue cli 通过命令行传参实现多环境配置
2018/07/12 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
Python编程之列表操作实例详解【创建、使用、更新、删除】
2017/07/22 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
通俗讲解python 装饰器
2020/09/07 Python
荷兰本土平价百货:HEMA
2017/10/23 全球购物
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
Linux上比较文件的命令都有哪些
2012/02/24 面试题
一年级班主任寄语
2014/01/19 职场文书
经营场所使用证明
2015/06/19 职场文书
新生儿未入户证明
2015/06/23 职场文书