一 操作环境搭建
系统: Windows7 旗舰版 64 位
PHP 环境: wampserver2.2e-php5.4.3-httpd2.2.22-mysql5.5.24 32 位版
下载地址: http://www.wampserver.com/en/
ThinkPHP:3.0 正式版
下载地址: http://thinkphp1.cn/down.html
Oracle:Orcale_11gR2 32 位版
下载地址: http://www.oracle.com/technetwork/cn/indexes/downloads/index.html
数据库操作工具: PLSQL Developer 32 位
下载地址: http://www.allroundautomations.com/plsqldev.html
开发工具: NetBeans IDE 7.1.2
下载地址: http://netbeans.org/downloads/index.html 下载单 PHP 的版本即可
说明: 这里我反复强调软件的位, 是因为这个很重要, 一般情况下, 我们系统是 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, 编写如下内容:
代码如下:
- define('APP_DEBUG', true);
- require './ThinkPHP/ThinkPHP.php';
5, 在浏览器中打开 localhost / 项目名 / index.php,Thinkphp 会帮你生成好相关文件和文件夹
6, 对配置文件进行操作, 找到: Conf 文件夹下 config.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().'[ 返 回 ]');
- }
- }
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 等等
来源: https://www.php1.cn/detail/php-b3b92cff3f.html