升级Zend Framework 1.5+ 版本 Pdo_Oci 注意事项

Database XML Config xml file 如:
    <database>
       <adapter>Pdo_Oci</adapter>
       <!-- web server 上 tnsname.ora 中的 tnsname -->
       <dbname>q78=</dbname>
       <username>qsC8</username>
       <password>qsC8</password>
       <charset>utf8</charset>
    </database>

    Zend Framework 1.0+ 运行OK,升级到 ZF1.5 后,用原来的配置档,无法连到 Oracle,出现如下错误:
     Fatal error: Uncaught exception 'Zend_Db_Adapter_Exception' with message 'SQLSTATE[HY000]: pdo_oci_handle_factory: ORA-12533: TNS:illegal ADDRESS parameters (ext/pdo_oci/oci_driver.c:579)' in C:/Program Files/Zend/Core For Oracle/ZendFramework/library/Zend/Db/Adapter/Pdo/Abstract.php:131 Stack trace: #0 C:/Program Files/Zend/Core For Oracle/ZendFramework/library/Zend/Db/Adapter/Abstract.php(390): Zend_Db_Adapter_Pdo_Abstract->_connect() #1

    经过一番折腾,找出原因如下:
       在 Zend Framework 1.5 的版本中 Zend/Db/Adapter/Pdo/Oci.php 的 protected function _dsn() 做了更改, 1.0+ 中的程式代码如下:

   [phpcode]protected function _dsn()
    {
        // baseline of DSN parts
        $dsn = $this->_config;

        $tns = 'dbname=';
        if (isset($dsn['host'])) {
            $tns .= '//' . $dsn['host'];
            if (isset($dsn['port'])) {
                $tns .= ':' . $dsn['port'];
            }
            $tns .= '/';
        }
        $tns .= $dsn['dbname'];

        if (isset($dsn['charset']))
        {
            $tns .= ';charset=' . $dsn['charset'];
        }     

        return $this->_pdoType . ':' . $tns;
    }[/phpcode]

    1.5 中 protected _dsn() function 如下:

protected function _dsn()
    {
        // baseline of DSN parts
        $dsn = $this->_config;

        $tns = 'dbname=(DEscrīptION=';
        if (isset($dsn['host'])) {
            $tns .= '(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=' . $dsn['host'] . ')';
            if (isset($dsn['port'])) {
                $tns .= '(PORT=' . $dsn['port'] . ')';
            } else {
                $tns .= '(PORT=1521)';
            }
            $tns .= '))';
        }
        $tns .= '(CONNECT_DATA=(SID=' . $dsn['dbname'] . ')))';

        if (isset($dsn['charset']))
        {
            $tns .= ';charset=' . $dsn['charset'];
        }

        return $this->_pdoType . ':' . $tns;
    }

  解决以上错误必须修改 Database Config xml file

    1. 必须指定 host
    2. dbname 必须为指定 host(database server name or ip address)上 database 的 sid(service name)

    修改后适合 ZF 1.5 xml config file 内容如下:
    <database>
       <adapter>Pdo_Oci</adapter>
       <!-- hostname or IP address-->
       <host>192.168.0.200</host>
       <!-- database SID or Service Name -->
       <dbname>dbsid</dbname>
       <username>qsC8</username>
       <password>qsC8</password>
       <charset>utf8</charset>
    </database>

    其它方法:
       不用 Pdo_Oci adapater 直接用 Oracle Adapter 就可以不用改动了.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值