`

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
标签
添加标签
分享到:
评论

相关推荐

    cakephp的CMS教程

    &lt;th&gt;创建时间&lt;/th&gt; &lt;/tr&gt; &lt;!-- 使用foreach遍历$articles,打印文章信息 --&gt; &lt;?php foreach ($articles as $article): ?&gt; &lt;tr&gt; &lt;td&gt;&lt;?= $this-&gt;Html-&gt;link($article-&gt;title, ['action' =&gt; 'view', $article-&gt;...

    CakePHP php框架-PHP

    &lt;/p&gt;&lt;p&gt;主要特性:&lt;/p&gt;&lt;p&gt;基于MVC架构&lt;/p&gt;&lt;p&gt;视图支持Ajax&lt;/p&gt;&lt;p&gt;内置校验框架&lt;/p&gt;&lt;p&gt;提供应用程序的基础模块和CRUD 代码自动生成功能&lt;/p&gt;&lt;p&gt;提供处理session,request,security的组件&lt;/p&gt;&lt;p&gt;灵活的视图缓存功能&lt;/p&gt;...

    Cake框架

    &lt;th&gt;Created&lt;/th&gt; &lt;/tr&gt; &lt;?php foreach ($this-&gt;post-&gt;find_all() as $post): ?&gt; &lt;tr&gt; &lt;td&gt;&lt;?=$post['id']?&gt;&lt;/td&gt; &lt;td&gt;&lt;?=$this-&gt;link_for($post['title'], "/posts/view/{$post['id']}")?&gt;&lt;/td&gt; &lt;td&gt;&lt;?=$...

    Cakephp安装和配置

    - 修改 `httpd.conf` 文件中的 `DocumentRoot` 和 `&lt;Directory&gt;` 设置。 ```conf DocumentRoot "E:/htdocs/app/webroot" &lt;Directory "E:/htdocs/app/webroot"&gt; ``` 2. **启用 URL 重写** - 在 `httpd.conf` ...

    如何有效学习html基本语言.pdf

    要有效学习HTML,首先要理解其基本元素,如标题(`&lt;h1&gt;`到`&lt;h6&gt;`)、段落(`&lt;p&gt;`)、图像(`&lt;img&gt;`)、链接(`&lt;a&gt;`)等。了解每个标签的作用和使用场景,以及如何通过类(class)和ID选择器来增加自定义样式。 CSS...

    初学web开发需要掌握哪些知识.docx

    理解基本的HTML标签,如段落(`&lt;p&gt;`)、标题(`&lt;h1&gt;`到`&lt;h6&gt;`)、图像(`&lt;img&gt;`)、链接(`&lt;a&gt;`)等至关重要。随着HTML5的普及,学习新的元素和属性,如音频和视频支持,离线存储,以及新的表单控件,也是必要的。 ...

    19个Web开发速查表

    它引入了新的元素如`&lt;header&gt;`、`&lt;nav&gt;`、`&lt;section&gt;`、`&lt;article&gt;`和`&lt;footer&gt;`,增强了语义化。同时,HTML5支持离线存储(AppCache)、拖放功能、媒体元素(音频、视频)以及 canvas 和 svg 等图形绘制功能。 2. ...

    wrench:CakePHP 3维护模式插件

    CakePHP &lt;3&gt; = 3.3.0 CakePHP&gt; = 3.5.0 扳手1.X 扳手2.X 扳手3.X PHP&gt; = 5.4.16 PHP&gt; = 5.5.9 PHP&gt; = 5.6.0 使用CakePHP DispatcherFilter机制 使用CakePHP中间件堆栈和PSR-7请求/响应实现 使用CakePHP...

    PHP的框架之CakePHP-CakePHP教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    PHP的框架之CakePHP-CakePHP教程终极教程

    打包下载,里面有CakePHP的框架源码,下载后可直接使用,版本是1.1的,稳定版;CakePHP的分页组件源码;CakePHP的中文及英文教程,CHM格式;CakePHP的中文打印版教程,WORD格式,下载后可直接打印,方便的;CakePHP...

    plus:插件 Jquery 在 CakePHP 3.x 中的表上添加删除功能

    plus - 在 CakePHP 中添加和删除表 安装 在默认模板中链接 js 文件 蛋糕PHP &lt;?= $this-&gt;Html-&gt;script("jquery.plus");?&gt; html [removed][removed] 用法 &lt;table&gt; &lt;thead&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;/tbody&gt; ...

    CakePHP创建验证器

    '&lt;/font&gt;&lt;br&gt;'; } } } else { echo "没有错误。"; } echo $this-&gt;Form-&gt;create("Logins", array('url' =&gt; '/validation')); echo $this-&gt;Form-&gt;input('username'); echo $this-&gt;Form-&gt;input('password'); echo ...

    cakephp php-framework

    There are two main ways to get a fresh copy of CakePHP. You can either download an archive copy (zip/tar.gz/tar.bz2) from the main website, or check out the code from the git repository. To download ...

    CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4

    ### CakePHP 3.4 开发手册文档概览 #### CakePHP 一瞥 CakePHP 是一款基于 PHP 的快速开发框架,它强调采用约定优于配置(Convention Over Configuration, CoC)的原则来简化开发过程,使得开发者能够快速构建稳定...

    cakephp 框架书籍 英文版

    ### CakePHP框架书籍知识点概述 #### 一、Getting Started(开始使用) - **博客教程**:本书籍通过一个博客项目的示例,引导读者逐步了解CakePHP框架的基本用法。这包括了如何设置环境、创建模型(Model)、控制器...

    CakePHP 1.2 API 中文文档

    例如,通过 `$this-&gt;Article-&gt;find()` 方法可以轻松获取文章数据。此外,它支持CRUD(创建、读取、更新、删除)操作,简化了数据库的增删改查。 **组件(Components)与助手(Helpers)** 组件类似于可重用的代码块...

    cakephp所见即所得编辑器

    &lt;script src="/js/tinymce.min.js"&gt;&lt;/script&gt; &lt;script&gt; tinymce.init({ selector: 'textarea', // 选择要转化为编辑器的textarea元素 plugins: 'image code', // 激活所需插件,这里我们选择了图像和代码插件 ...

    cakephp-1.2 manual

    《CakePHP 1.2 手册》是针对该版本框架的重要参考资料,旨在帮助开发者深入理解和有效使用 CakePHP 进行Web开发。 CakePHP 是一个基于Model-View-Controller(MVC)架构模式的开源PHP框架,它简化了Web应用程序的...

    cakephp分页.docx

    ### CakePHP分页详解 #### 一、简介 在现代Web开发中,高效地管理和展示大量数据是一项重要的挑战。为了确保用户体验良好并且服务器资源得到合理利用,开发者们常常需要实现分页功能。对于使用CakePHP框架的应用...

Global site tag (gtag.js) - Google Analytics