使用oci8 / MDB2的PHP到Oracle - _doConnect:无法建立连接

时间:2013-11-12 07:50:51

标签: php oracle11g pear oci8 mdb2

我正在使用Oracle 11g,PHP 5.5.4,Apache 2.4.6和PEAR 1.9.4运行Linux Fedora 19设置。除此之外,我还下载并启用了用于PHP的OCI8插件,并下载了MDB2和MDB2_Driver_oci8。

目标是将我的网页连接到Oracle 11g数据库。这已经在现有设置中工作(我没有这样做),我正在尝试在新设置中复制它。

出于某种原因,在新服务器中,它不起作用。它会产生错误:

  

_doConnect:[错误消息:无法建立连接]   ** oci8(oci8):// gbsihr:xxx @ localhost:1521 /

     

尝试连接数据库服务器时发生错误。   错误消息:MDB2错误:连接失败

我真的不知道这意味着什么。这是我的PHP连接功能:

<?php
include_once('includes/configure.inc');
require_once 'MDB2.php';

function DB_connect($intSilent = -1){          
    $db_dsn = $_SESSION['DB_Type'] ."://";
    $db_dsn .= $_SESSION['DB_Username'] .":";
    $db_dsn .= $_SESSION['DB_UserPassword'] ."@";
    $db_dsn .= $_SESSION['DB_Host'] .":";
    $db_dsn .= $_SESSION['DBPort'] ."/?service=";
    $db_dsn .= $_SESSION['DB_DbName'];

    if (PEAR::isError($dbconnect)) {
        print '<pre>';var_dump($intSilent);print '</pre>';
        print '<pre>';var_dump($db_dsn);print '</pre>';
        print '<pre>';print $dbconnect->getDebugInfo();print '</pre>';
        echo "An error occurred while trying to connect to the database server.<br>\n";
        echo "Error message: " . $dbconnect->getMessage() . "<br>\n";
        echo "A more detailed error description: " . $dbconnect->getDebugInfo() . "<br>\n";
        exit();
        // Check whether the object is a connection or
        if($_SESSION["gENDebugInfo"] == "On"){
            $_SESSION["gErrorNote"] = $dbconnect->getDebugInfo();
        }
        if ($intSilent < 0) {
            header("Location:" . $_SESSION["gENWebRoot"] . "showerror.php?ec=1003"); // Failed to connect
            exit();
        }
    }else{
        $dbconnect->setOption('portability', MDB2_PORTABILITY_ALL);
    }
    return $dbconnect;
}   
?>

这是configure.inc的内容:

$_SESSION["gENWebRoot"] = '/hrweb/';
$_SESSION['DB_Type'] = 'oci8';    
$_SESSION['DB_Host'] = 'localhost'; 
$_SESSION['DB_Username'] = 'gbsihr';
$_SESSION['DB_UserPassword'] = 'ids21';
$_SESSION["DBPort"] = '1521';
$_SESSION['DB_DbName'] =  'xe';

由于这适用于其他设置,我不确定错误在哪里。 OCI8似乎是有序的,虽然我确实通过了箍来让它发挥作用。

我做了一些研究,只有两个模糊的结果 - 一个指向oci8.php本身,另一个是Oracle TNS错误(不太可能,因为没有错误)。

以下是我尝试解决问题的方法:

我尝试从this website复制基本查询示例。我修改了“hr”和“welcome”,并在我的新设置上运行它(它在较旧的设置上运行正常)。这就是结果:

  

oci_connect():OCIEnvNlsCreate()失败。有一些问题   你的系统 - 请检查ORACLE_HOME和LD_LIBRARY_PATH是否正确   设置并指向正确的目录。尝试时出错   检索错误的文本ORA01804

我也尝试在/ etc / sysconfig /中打开httpd文件并向其中添加以下行:

  

LD_LIBRARY_PATH =“/ U01 /应用/ ORACLE /产品/ 11.2.0 / XE / lib中
  export LD_LIBRARY_PATH

但是当我尝试在CLI中回显$ LD_LIBRARY_PATH时,它不会返回任何内容。它确实出现在phpinfo()中,但是: enter image description here
这与$ ORACLE_HOME相反,我必须通过在CLI中键入. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh来手动加载每个启动,并且不会出现在环境下,但至少可以回显。 enter image description here

环境下的旧设置中有很多变量; LD_LIBRARY_PATH,ORACLE_HOME和ORACLE_SID是最值得注意的。不过,我只在envvars文件中看到LD_LIBRARY_PATH。我应该将它们添加到httpd文件中吗?

对不起,我不是一个Linux用户。对此有任何帮助将非常感激。

3 个答案:

答案 0 :(得分:1)

我建议您尝试使用普通oci8函数和用于MDB2的相同登录参数连接到oracle数据库。

我的猜测是,这也会失败,但可能会给你更多的错误细节。

答案 1 :(得分:0)

你能连接到php以外的oracle吗? 我假设你有一个有效的tns.ora文件设置。

我需要在VirtualHost定义中设置这两行,注意TNS_ADMIN也是定义的,也许你也这样做了:

SetEnv ORACLE_HOME /opt/oracle/instantclient
SetEnv TNS_ADMIN   /usr/lib/oracle/11.2/client/network/admin/network/admin**

答案 2 :(得分:0)

只需添加此行

即可
  

$ dbconnect = DB :: connect($ db_dsn);

运作DB_connect 像这样

...
$dbconnect = DB::connect($db_dsn);   
if (PEAR::isError($dbconnect)) { ...