首页 文章

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

提问于
浏览
0

我正在使用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:[错误消息:无法 Build 连接] ** 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 / apps / oracle / product / 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

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

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

  • 1

    你能连接到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**
    
  • 0

    只需添加此行即可

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

    像这样运作 DB_connect

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

相关问题