PHP - 找不到oci_connect

时间:2018-03-16 10:45:59

标签: php oracle database-connection oracle-apex

我研究并发现oci_connect()是要走的路。我发现我可以使用tnsnames.ora文件中的Connect Name或使用简单的连接语法。由于我的数据库没有在本地存储,我不知道所说的tnsnames.ora文件位于apex.oracle.com中的哪个位置,因此我选择了简单的连接字符串。这就是我所知道的到目前为止。

    $username = "myemail";
    $host = "apex.oracle.com";
    $dbname = "name";
    $password = "password";

    // url = username@host/db_name

    $dburl = $username . "@".$host."/".$dbname;

    $conn = oci_connect ($username, $password, $dburl);

    if(!$conn) echo "Connection failed";

我得到了

    Call to undefined function oci_connect()

那么将要走的路是什么?

更新1:

这是我做的事情清单:

  • 已安装的Oracle DB

  • 解压缩Oracle实例客户端

  • 设置环境变量

  • 取消注释php.ini中的extension = php_oci8_12c.dll

  • 将所有* .dll文件从实例客户端文件夹复制到xampp / php和xampp / apache / bin

  • 还确保php / ext文件夹具有所需的dll。

那是昨晚。我已多次重启我的电脑,APACHE,但我仍然收到此错误:

    Call to undefined function oci_connect()

此时我很沮丧,不知道从哪里开始。 PHP似乎没有链接到oci8。我可以在cmd中查看我从Database Configuration Assistant中创建的数据库' sqlplus'命令和一些select语句。所以一切似乎都设置正确,它只是在尝试使用oci_connect()时遇到问题的PHP。 我的database.php现在设置为:

public function __construct()
{
    error_reporting(E_ALL);

    if (function_exists("oci_connect")) {
        echo "oci_connect found\n";
    } else {
        echo "oci_connect not found\n";
        exit;
    }

    $host = 'localhost';
    $port = '1521';

    // Oracle service name (instance)
    $db_name     = 'haatbazaar';
    $db_username = "SYSTEM";
    $db_password = "root";

    $tns = "(DESCRIPTION =
        (CONNECT_TIMEOUT=3)(RETRY_COUNT=0)
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = $host)(PORT = $port))
        )
        (CONNECT_DATA =
          (SERVICE_NAME = $db_name)
        )
      )";
    $tns = "$host:$port/$db_name";

    try {
        $conn = oci_connect($db_username, $db_password, $tns);
        if (!$conn) {
            $e = oci_error();
            throw new Exception($e['message']);
        }
        echo "Connection OK\n";

        $stid = oci_parse($conn, 'SELECT * FROM ALL_TABLES');

        if (!$stid) {
            $e = oci_error($conn);
            throw new Exception($e['message']);
        }
        // Perform the logic of the query
        $r = oci_execute($stid);
        if (!$r) {
            $e = oci_error($stid);
            throw new Exception($e['message']);
        }

        // Fetch the results of the query
        while ($row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_NULLS)) {
            $row = array_change_key_case($row, CASE_LOWER);
            print_r($row);
            break;
        }

        // Close statement
        oci_free_statement($stid);

        // Disconnect
        oci_close($conn);

    }
    catch (Exception $e) {
        print_r($e);
    }
}

它输出:

oci_connect not found

OCI8列在我的phpInfo().

2 个答案:

答案 0 :(得分:1)

好吧,我发现了整个考验背后的罪魁祸首。我设置了lk) = (Student n g liked dl):students ++ likedNewSubject newSubject studName students | ((Student n g lk dl)环境变量,但显然忘了添加一个名为students) = (Student n g liked dl):students | otherwise = likedNewSubject newSubject studName students where liked = newSubject:lk的新系统环境变量,并将目录设置为PATH。 这是您需要添加的系统环境变量列表:

  • 修改TNS_ADMIN系统变量并添加PATH/TO/INSTANCE/CLIENT目录
  • 编辑PATH系统变量并添加Instance Client目录
  • 添加新系统变量,将其命名为$ORACLE_HOME/bin并添加Instance Client目录

我希望这可以帮助那些来看的人。

答案 1 :(得分:0)

首先,之前已经问过,但是Oracle doesn't allow remote database connections to their free apex.oracle.com example service。抱歉。您只能通过Web界面与其进行交互。

其次,如果您确实找到要连接的远程Oracle数据库,则需要为您的操作系统安装Oracle Instant Client,并configure the PHP OCI8 extension