DB连接oracle10g数据库
DB是PEAR中的一个包,提供了目前市面上绝大多数数据库的连接层。我的oracle 10g安装在window xp上,因为听说oracle在linux下的安装十分麻烦,当然舍繁求简啦(不过以后有机会还是可以试试)。。一路按照向导安装就可以了,一般都没什么问题。我曾经尝试在freebsd下连接oracle 10g数据库,但屡试屡败,最终放弃。。换成linux系统。。果然一试就灵。
客户端连接oracle数据库大体有2种方法,一种是在安装oracle标准的客户端,这种方法需要配置相关的参数,如oracle_sid等。这种情况在window系统下安装也很简单,但在linux下就没那么轻松了。另外一种是通过安装instant client客户端,这个不需要任何配置相关参数,当然还是要设置几个常见的环境变量以便解决用一些工具连接oracle乱码的问题。因此,我推荐如果是linux客户端,用instant client比较方便而且简单。
首先我们去oracle的官方网站下载instant client客户端,一般来说,和你oracle服务器的版本保持一致,我就用的是
oracle-instantclient-basic-10.2.0.3-1.i386.rpm
oracle-instantclient-devel-10.2.0.3-1.i386.rpm(这个不一定需要,安装也没啥影响)
使用rpm -Uvh安装好这2个包。。
重新编译安装php,使用如下配置命令
'./configure' '--prefix=/usr/local/php4' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-mcrypt=/usr/local/libmcrypt' '--with-iconv' '--with-gettext' '--with-mysql=/usr/local/mysql4' '--with-zlib' '--enable-mbstring' '--with-oci8-instant-client'
这是最简单的配置,仅仅用来验证连接oracle用的。我用的php版本是4.4.2,因此直接支持--with-oci8-instant-client,不知道php早期的版本支持不支持该编译选项,但早期的版本是支持--with-oci8的。。,php安装好后就可以用phpinfo查看是否支持oci8,见我的
| OCI8 Support | enabled |
| Revision | $Revision: 1.183.2.18.2.3 $ |
| Oracle Version | 10.1 |
| Compile-time ORACLE_HOME | /usr/lib/oracle/10.2.0.3/client/lib |
| Libraries Used | no value |
其中/usr/lib/oracle/10.2.0.3/client/lib就是我们安装上面basic包产生的。
安装完毕后就可以用DB连接oracle数据库了。DB库的具体使用请参考pear.php.net
oracle的dsn为:oci8://username:password@myoracle,用户和密码就不用说了,myoracle是指你的数据库实例名,就和oracle默认的orcl一样,而不是你服务器的ip地址,这个地方我弄错过。。友情提醒一下。。具体调用请看下面调用代码
include_once "DB.php";
$dbconn = DB::connect($dsn, false);
if (DB::isError($dbconn))
exit;
$sql = "select * from v$parameter";
$result = $dbconn->getAll($sql,array(),DB_FETCHMODE_ASSOC);
本来以为这样就可以大功告成了,那知道当sql语句中的字段为小写时居然查不出数据。。。什么地方出毛病了?我开始以为是php少安装了某个库,但仔细查看,我用同样的配置连接mysql都没有任何问题,看来是oracle数据库的问题。。。网上有人通过改oracle的相关配置参数说可以实现大小写兼容。但我试过alert session set 参数=value还是不行。不过大多数人说通过oracle自带的lower和uper函数来实现。我觉得在每个字段加这么一个函数太麻烦。。。。于是在数据库连接层DB上动脑筋,DB提供的getall方法,如果修改一次,不就可以不必每次都加lower和uper函数了吗?于是找到DB/common.php文件,修改其中的getall方法。。将
最后谈下oracle的客户端连接工具的乱码问题。。。我用toad和PL/SQL连接oracle数据库时,中文都出现乱码。。
于是我在linux里设置了以下环境变量
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" export LC_ALL="simplified chinese" export LANG="simplified chinese"
注意上面=号2边千万不要有空白字符,这可不是写代码的良好习惯的体现。。否则根本就不能正确设置。。我又在这上面栽了半天。。。呵呵。
ok,基本上在linux用php连接oracle数据库就没什么问题了。。。。祝大家好运