ThinkPHP连接Oracle数据库
一、操作环境搭建
系统:windows7 旗舰版 64位
php环境:wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24 32位版
下载地址:
thinkphp:3.2.3正式版
下载地址:
oracle:orcale_11gr2 32位版
下载地址:
数据库操作工具:plsql developer 32位
下载地址:
开发工具:netbeans ide 7.1.2
下载地址:
说明:这里我反复强调软件的“位”,是因为这个很重要,一般情况下,我们系统是64位的,那么最好软件也用64位的,但是这里除过系统外,全部选择32位是有原因的,目的是为了配合plsql developer和wamp的php扩展。因为plsql developer没有64位版。有的朋友说用64位oracle数据库,装32位客户端就行,我不想这样做,如果不喜欢我的操作方式,可以绕道。当然了,如果你不使用plsql developer,而选择使用oracle 自带的sql developer,那么你全安装64位或32都是你自己的事。php连接oracle数据库需要开启相应的扩展,这个扩展也需要数据库客户端的支持,因为php扩展也需要对应数据库客户端的位数。啰嗦完毕。
二、环境配置
1,操作系统的安装我就不说了,oracle安装自己解决,netbeans ide 7.1.2也自己解决。
2,wamp的安装我也不说了,不会的直接从dos开始重新学习吧。
3,wamp会把php的网页文件夹定义在安装wamp的文件夹下的www里面,我是安装在d盘,所以就是d:\wamp\www。我们暂时不做别的自定义修改。启动wamp,系统托盘图标为绿色表示启动ok。
4,打开localhost,看到如下界面,表示环境配置基本ok。为什么是基本了,因为还没有对oracle的配置进行设置。
5,打开如图的php扩展菜单,在绿色图标上,左键->php->php扩展,点击php-oci8的扩展,这时候这个wamp会重启,等待重启后变绿,就表示ok。
6,再次打开刚才的localhost页面,如果找到如图4的显示,就表示目前php已经支持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,表结构如下:
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封装的数据库函数与用法示例【参考thinkPHP】
-
ThinkPHP连接Oracle数据库
-
Spring的连接数据库以及JDBC模板(实例讲解)
-
java基于jdbc连接mysql数据库功能实例详解
-
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
-
PHP连接数据库实现注册页面的增删改查操作
-
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
-
thinkPHP数据库增删改查操作方法实例详解
-
ZendFramework框架实现连接两个或多个数据库的方法
-
java实现的连接oracle/mysql数据库功能简单示例【附oracle+mysql数据库驱动包】