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: [错误信息:无法建立连接] ** 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 错误(不太可能,因为没有错误)。

这是我解决问题的尝试:

我尝试从这个网站复制基本查询示例。我修改了“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
导出LD_LIBRARY_PATH

然而,当我尝试在 CLI 中回显 $LD_LIBRARY_PATH 时,它不会返回任何内容。它确实出现在 phpinfo() 中,但: 在此处输入图像描述
这与 $ORACLE_HOME 形成对比,我必须通过在 CLI 中键入每次启动手动加载它. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh,并且不会出现在环境下,但至少可以回显' d。 在此处输入图像描述

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

对不起,我不是一个 Linux 人。对此的任何帮助将不胜感激。

4

3 回答 3

1

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

我的猜测是这也会失败,但可能会为您提供更多错误详细信息。

于 2013-11-12T16:06:40.183 回答
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**
于 2013-11-13T14:03:26.893 回答
0

只需添加这一行

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

DB_connect 像这样 运作

...
$dbconnect = DB::connect($db_dsn);   
if (PEAR::isError($dbconnect)) { ...
于 2013-11-23T23:37:30.830 回答