LuckyHu Blog

首页 产品 工作室

PHP连接ORACLE时遇到的问题总结

08 Sep 2011

本文由博主整理,如需转载,请注明。

最近和同事合作做点东西,需要用PHP连接oracle数据库做十分简单的应用,遇到种种十分恶心人的问题,查阅了大量国内外的资料才搞定,特地总结一下,希望以后如果有人遇到类似的问题,能通过这一片文章就得到解决。当然对于十分熟悉php和oracle的大牛,这种东西毫无意义,但希望能给那些像我一样的php入门,oracle耳闻过的菜鸟一些帮助。

有一篇E文的文章总结得很不错了,把地址发在这里

通常可能遇到的问题有一下几种:

1.Fatal error: Call to undefined function oci_connect() in xxxxxxx on line 7 ..

2.PHP Warning: PHP Startup: Unable to load dynamic library ‘C:/AppServphp5extphp_oci8.dll’ - The specified procedure could not be found.rn in Unknown on line 0

..

出现这两个错误,通常是由于php配置和库文件加载错误的问题,请检查:

1-是否在php.ini配置文件中将需要用到的库文件前面的的分号“;”去掉,这个分号表示注释的意思,去掉了表示采用该库。连接oracle时,需要去掉 extension=**php_oci8.dll **前的分号。

2-是否把php.ini配置文件中 extension_dir=“”设置正确,这个地址应该设置为你的php存放extension dll库文件的地址。好像php版本不同,这个地址略有区别。

3-是否把Oracle Instance Client中的三个文件 oraociei10.dll,orannzsbb10.dll,oci.dll **拷贝到了 C:WindowsSystem32 **下。关于这几个文件可以自己去找,网上很多。

4-有一点需要注意的是,我使用的是wamp配置的apache和php,我不太清楚分别配置会出现什么情况,但在这种情况下,apache和php文件夹中各有一个php.ini配置文件,如果以上的情况你都达到了,有可能是你改的是php文件夹中的配置文件,不是apache中的,可能会还会出现问题。

3.Warning: oci_connect() [function.oci-connect]: OCIEnvNlsCreate() failed. There is something wrong with your system - please check that PATH includes the directory with Oracle Instance Client libraries in xxxxxxx on line 7

..

通常出现这个错误都是由于某些路径没有配置正确,我觉得可能情况比较多种,有些e文博客说是由于环境变量中oracle_home没有配置导致的,有一篇中文博文分析了这个问题,说是由于apache某些配置路径错误的导致的,并深究了原因,大家有兴趣可以看看这里

4.Warning: oci_connect() [function.oci-connect]: ORA-12705: Cannot access NLS data files or invalid environment specified in C:AppServwwwmyphpphp_oracle.php on line 7 ….

这个问题我的理解是由于某些语言配置方面的冲突导致的,操作办法是在 **开始菜单-> 运行 -> Regedit -> HKEY_LOCAL_MACHINE -> SOFTWARE -> ORACLE -> NLS_LANG **原本默认的值应该是NA,把他改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK就行了,我感觉这个应该是在中国默认的一种语言设置,也有人说可以把这个NLS_LANG删掉,我没有试过,大家如果以上不行,也可以试试。

5.Warning: oci_connect() [function.oci-connect]: ORA-28009: 应当以 SYSDBA 身份或 SYSOPER 身份建立 SYS 连接 …. 这个问题很简单,先用sqlplus登录,利用sys账户连接,创建一个账户并分配权限,再利用创建的账户进行连接就行了,但可能也不太好理解,因为以前我是用mysql比较多,连接一个数据提供一个账户密码就是了,但oracle中sys是一个很特别的账号,权限是最大的,在用sys登录时需要加上一个as sysdba参数才行,利用php连接时我没研究过哪里输入这个参数,知道这个道理就是了。

大概总结就是这样,最后提一点是,如果没有再出现1,2两个问题的话,你可以在脚本中输出phpinfo();看看其中是否有oci8如:PHP & Oracle (oci8) Config OCI8 Support For PHP

如果有,说明库的配置是成功了的,在后面的过程中就不需要再考虑php这边的错误,应该都是服务器配置方面的问题。

当然,大家最好不要遇到任何问题。一切顺利最好。