windwos下使用php连接oracle数据库的过程分享


Posted in PHP onMay 26, 2014

要使用php连接oracle,基本条件是
1.需要你安装了php、
2.安装了oracle、
3.配置了tnsname.ora。
本地命令行使用sqlplus能够连接到oracle。

根据你机器的版本选对64bit或者32bit的php程序,我们使用php的oci8扩展连接oracle

安装好php后,打开oci8扩展,

写一段连接oracle的ora.php代码

<?php
$conn = oci_connect('hr', 'welcome', 'MYDB');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Prepare the statement
$stid = oci_parse($conn, 'SELECT * FROM departments');
if (!$stid) {
    $e = oci_error($conn);
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Perform the logic of the query
$r = oci_execute($stid);
if (!$r) {
    $e = oci_error($stid);
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Fetch the results of the query
print "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    print "<tr>\n";
    foreach ($row as $item) {
        print "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
    }
    print "</tr>\n";
}
print "</table>\n";
oci_free_statement($stid);
oci_close($conn);
?>

说明:
oci_connect('hr', 'welcome', 'MYDB')
第一个参数是oracle的用户名,
第二个参数是oracle的密码
第三个参数是tnsnames.ora里的连接串名

命令行下执行

php ora.php

提示如下错误

PHP Warning: PHP Startup: Unable to load dynamic library 'C:\php\php_oci8.dll'- %1 不是有效的 Win32 应用程序。 in Unknown on line 0
PHP Parse error: syntax error, unexpected '"user"' (T_CONSTANT_ENCAPSED_STRING) in C:\Users\nginx\Desktop\oraclephpoci\oci.php on line 3

开始以为是没有选对版本,我是64位的机器,结果说是win32的程序,一看字面提示,我就重新安装了新的32bit程序还是报错。

仔细查了查发现在32位像64位迁移的问题,出现如下问题时,我们需要安装Oracle Instant Client。

Unable to load dynamic library 'C:\Program Files (x86)\PHP\ext\php_oci8_11g.dll' - %1 is not a valid Win32 application.
Warning oci_connect(): OCIEnvNlsCreate() failed. There is something wrong with your system - please check that PATH includes the directory with Oracle Instant Client libraries

Oracle Instant Client,它是一个解压后就能使用的程序,不需要安装。
如果有oracle账号的可以去oracle下载对应的版本,(注册用户需要一堆信息)

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

嫌麻烦的同学使用这个地址下载

http://eduunix.ccut.edu.cn/index2/database/Oracle%20Instant%20Client/

下载后把压缩包解压到c:\oracleinstantclient,并添加路径到环境变量PATH

重新执行php ora.php,“%1 不是有效的 Win32 应用程序”的错误没有了,但是会提示

syntax error, unexpected T_CONSTANT_ENCAPSED_STRING

代码是从php官网直接拷过来的,代码中有不可见的字符,使用notepad++查看所有字符,去掉乱码即可。

继续执行,这次提示,

PHP Fatal error: ORA-12154: TNS:could not resolve the connect identifier specified in C:\Users\nginx\Desktop\airline\oci.php on line 6

看样子是php没有找到tnsnames.ora的位置,时间比较赶,那我就直接使用ip的形式,具体格式根据你的信息拼写oci_connect的第三个参数
oracle10格式:[//]host_name[:port][/service_name]
oracle11格式:[//]host_name[:port][/service_name][:server_type][/instance_name].
我具体使用的php oci连接串是:
$conn = oci_connect('hr', 'welcome', '//3water.com:1523/sycx');

配好上述信息后,终于能出结果了,但是发现查出来的结果中问乱码,这种问题基本都是编码不匹配。

php oci8中文乱码解决办法,先查询你的oracle的数据库编码使用,

select userenv('language') from dual;

查出来的结果是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,在php的代码里设置环境变量
putenv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK");

终于php能够正确连接到oracle啦。

PHP 相关文章推荐
PHP XML操作的各种方法解析(比较详细)
Jun 17 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 PHP
url decode problem 解决方法
Dec 26 PHP
header跳转和include包含问题详解
Sep 08 PHP
PHP递归调用的小技巧讲解
Feb 19 PHP
深入解析php之sphinx
May 15 PHP
Youku 视频绝对地址获取的方法详解
Jun 26 PHP
CodeIgniter配置之autoload.php自动加载用法分析
Jan 20 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
基于laravel-admin 后台 列表标签背景的使用方法
Oct 03 PHP
查找php配置文件php.ini所在路径的二种方法
May 26 #PHP
php5.2以下版本无json_decode函数的解决方法
May 25 #PHP
模板引擎smarty工作原理以及使用示例
May 25 #PHP
浅析php中json_encode()和json_decode()
May 25 #PHP
浅析PHP微信支付通知的处理方式
May 25 #PHP
PHP开发微信支付的代码分享
May 25 #PHP
php定时计划任务与fsockopen持续进程实例
May 23 #PHP
You might like
收集的DedeCMS一些使用经验
2007/03/17 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
javascript操作excel生成报表全攻略
2014/05/04 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
微信小程序项目实践之九宫格实现及item跳转功能
2018/07/19 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
pytyon 带有重复的全排列
2013/08/13 Python
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
Python分支结构(switch)操作简介
2018/01/17 Python
详解重置Django migration的常见方式
2019/02/15 Python
Python递归及尾递归优化操作实例分析
2020/02/01 Python
python2 对excel表格操作完整示例
2020/02/23 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
Python try except else使用详解
2021/01/12 Python
html5移动端价格输入键盘的实现
2019/09/16 HTML / CSS
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
测控技术与仪器个人求职信范文
2013/12/30 职场文书
社区端午节活动方案
2014/01/28 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
长城导游词
2015/01/30 职场文书
2015年大学生工作总结
2015/04/21 职场文书
法定代表人身份证明书
2015/06/18 职场文书
班主任远程培训研修日志
2015/11/13 职场文书
如何写好竞聘报告
2019/04/03 职场文书
工作计划范文之财务管理
2019/08/09 职场文书