ThinkPHP 连接Oracle数据库的详细教程[全] |
一、 操作环境搭建
说明:这里我反复强调软件的“位”,是因为这个很重要,一般情况下,我们系统是64位的,那么最好软件也用64位的,但是这里除过系统外,全部选择32位是有原因的,目的是为了配合PLSQL Developer和WAMP的PHP扩展 。因为PLSQL Developer没有64位版 。有的朋友说用64位Oracle数据库,装32位客户端就行,我不想这样做,如果不喜欢我的操作方式,可以绕道 。当然了,如果你不使用PLSQL Developer,而选择使用Oracle 自带的SQL Developer,那么你全安装64位或32都是你自己的事 。PHP连接Oracle数据库需要开启相应的扩展,这个扩展也需要数据库客户端的支持,因为php扩展也需要对应数据库客户端的位数 。啰嗦完毕 。 二、 环境配置 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配置 复制代码 代码如下: <?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,表结构如下:
下面就来说解决方法,其实很简单,按照基本的MVC结构,不管是PHP还是JAVA还是.NET都有这样的结构,那么按照严格的标准,MODEL层的代码是必须写的,就是要和数据库的字段做映射 。但是很多用mysql的,就直接没有去写MODEL里面的代码 。这种习惯被用到了oracle中,就出了问题 。 5, 下面针对我上面的数据表写出我的代码: 复制代码 代码如下: 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等等 。 |