cakephp之oracle <摘录>

环境:XP系统+apache2.2+php5.3(5.2)+oracle10g(9i,两个库都有)+oracle client 10g


问题解决过程:

好几天的纠结。。。
因项目要求,更换cakePHP数据库连接至oracle,查询一个数据库表,页面完全不载入,
使用cakephp的原始程序(下载后的原始包),首页测试是否能连接上数据库,连接不成
跟踪debug代码,ConnectionManager ->getDataSource->loadDataSource 再定位到dbo_oracle 中的connect方法,发现该方法出错,判定是php连接oracle有问题

搜索php oracle连接,找到oracle官网的faq说明和technical note:  http://www.oracle.com/technology/pub/notes/technote_php_instant.html。需要oracle本地客户端,加上php的extension模块
ext目录增加php_oci8.dll,php.ini增加php的oci8 extension:
[PHP_OCI8]
extension=php_oci8.dll
重启apache启动不了,出现entry point OCIPing missing in OCI.DLL  无法定位程序输入点OCIPing于动态链接库的错误
试了半天,修改未果,本地是php5.3.2版本,下载php5.2.14安装,在安装时设置了oracle extension,连接数据库成功。
ok,成功的第一步。总结以为是php安装时没有按照步骤来引起的。

第二天发现查询oracle数据库结果为乱码,又发现查询mysql本来毫无问题,也变成乱码。
想想又把php5.3版本装上,并且尝试了php5.3.3这个稳定版,mysql乱码消除,oracle数据库重新连不上,安装时设置了oracle extension模块也未果。
google未果,问王征大神说php5.2貌似不支持Unicode,于是改用5.3版本,继续研究为何连接不上数据库。
定位到oci.dll,参照网络上资料复制了oracle客户端的oci.dll文件到c:\windows\system32一份,重启依然内存错误,输入点错误。
修改重试多次,apache重装,php5.3.2 php5.3.3 php5.2三个版本切换尝试,最终回忆起oracle网站的文档说明,
instantclient-basic-win32-10.2.0.3-20061115\instantclient_10_2   文件目录中的oci版本跟本地oracle客户端版本并不一致,
复制目录中的oci.dll版本10.2.0.1覆盖本地客户端的E:\Oracle\product\10.1.0\Client_1\BIN   10.1.0.2
plsql仍然可用,使用php5.3重启apache终于不报错,可以连接上oracle服务器
mysql数据库结果没有乱码,但是oracle数据库仍然是乱码,跟踪发现,虽然oracle数据库编码为utf8
但读出的结果却变为gbk编码  使用函数mb_convert_encoding($appl['Appl']['soft_name'], "UTF-8", "GBK")
才能读出正确值,在database.php中配置  'encoding'=>"GBK" 无效,配置为utf8也无效,查询条件也要从utf8转码为gbk后才能查询出正确结果。有待进一步研究。
ok,这已算成功的第二步。总结认为php的版本真有问题。

第三天思索乱码原因,可能为本机编码原因,也可能是php编码配置,最终发现是oracle client编码设置问题,

参考文章http://junmail.iteye.com/blog/137996。进入注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\设置

更改NLS_LANG值:  SIMPLIFIED CHINESE_CHINA.ZHS16GBK =》 american_america.AL32UTF8

终于不用转换gbk了!成功的最后一步! 但依然发现问题,oracle client的sql查询结果变为乱码,估计是比较难找到两全方法了

2010-8-18日,测试php函数连接oracle和cakePHP连接oracle,终于从对比中发现,database的charset是关键,设置为charset=utf8终于成功,也无需依赖NLS_LANG变量
oracle client,PHP 版本Unicode支持差异和dll文件差异以及oracle client编码多重问题导致此次action困难重重。
总结php之oracle连接步骤:

1必须是php5.3版本,安装时选定oracle extension。5.2对Unicode支持有问题,mysql和oracle均为乱码(也可能修改两者字符集后可用,方便起见还是5.3吧)

2oracle client  bin目录下的dll版本必须正确,10.2.0.1版本才可用,10.1.0.2版本的dll估计没有OCIPing入口?本地没有oracle client的话,可以安装官方给的instantclient_10_2 ,将路径加入path环境变量中(没有试验过,按oracle note说明应该是可用)。

3NLS_LANG值更改,避免乱码:  进入注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\设置

更改NLS_LANG值:  SIMPLIFIED CHINESE_CHINA.ZHS16GBK =》 american_america.AL32UTF8

或直接在database.php里配置charset=utf8
oracle api

XCVIII. Oracle 8 函数库  "ora_"开头的 函数为现在最新版本函数

cakephp配置为:

var $defaultd = array(
  'driver' => 'oracle',
  'persistent' => false,
  'host' => '124.205.46.166',      

  'login' => 'netqin',
  'password' => 'netqin#))*',
  'database' => 'jtuser1_124.205.46.166',
      'prefix' => '',
  'encoding'=>"gbk",

);

不依赖本地onsnames.ora和nls_lang的配置版本:

  var $default = array(
  'driver' => 'oracle',
  'persistent' => false,
  'host' => '124.205.46.166',       //    192.168.3.232
  'login' => 'netqin',
  'password' => 'netqin#))*',
  'database' => '//124.205.46.166:1521/jtuser1',
      'prefix' => '',
  'charset'=>"UTF8",

);

database名称为  Oracle\product\10.1.0\Client_1\NETWORK\ADMIN\tnsnames.ora 配置的tnsname

连接及数据获取小例子:

$c1 =    oci_connect("baike", "baike", "baike");
// $c2=    oci_connect("netqin", "netqin#))*", "jtuser1_124.205.46.166");
if($c2) echo "connected success!";
$stmt = oci_parse($c1, "select * from tbl_aq_software_i t where soft_id = 33");
  oci_execute($stmt, OCI_DEFAULT);
  echo $c1."----selecting\n\n";
  while (oci_fetch($stmt))
Unknown macro: {     echo $conn . " [" . oci_result($stmt, "SOFT_ID") . "]nn";   }

  echo $conn . "----done\n\n";

其中oci_result 的第二个参数须是数据表中字段的大写形式

在cakePHP中 字段名称则必须是小写,否则出现Undefined index错误

$appFile['AppFile']['REIT_VERSION']  =>$appFile['AppFile']['reit_version']
Labels parameters
标签
添加标签

你可能感兴趣的:(oracle,PHP,mysql,XP,cakephp)