【发布时间】:2014-09-23 16:08:12
【问题描述】:
我正在尝试使用 php 中的 PDO_OCI 从远程 Ubuntu 14.04 服务器连接到在 Windows 上运行的 Oracle Database 11g XE。我遵循本指南http://gist.github.com/tassoevan/10392954(无数次)并不断收到以下错误:
找不到驱动程序
但是,当我调用 PDO::getAvailableDrivers() 时,它给了我这个:
数组([0] => mysql [1] => oci [2] => sqlite)
注意:在我按照上面链接中的指南进行操作之前,oci 不存在。
我能找到的所有其他教程基本上都是一样的。
我安装了 Oracle 即时客户端(版本 11.1)。最新版本甚至没有让驱动程序出现在可用驱动程序列表中。
我还知道,此方法中使用的驱动程序较旧,但没有关于如何使其与最新驱动程序一起使用的分步指南。我是 Oracle 数据库和 php 的新手,非常感谢您提供逐步帮助。
更新: 我发现了驱动程序的问题。它在我的 php 代码中,而且非常愚蠢。我发帖是为了他人的利益。
我的原始代码在设置连接时用大写字母“OCI”。
$tns = "
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = myIP)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = XE)
)
)
";
try{
$pdo = new PDO('OCI:dbname='.$tns ,'username','password'); // Capital 'OCI' here is WRONG so changed to 'oci:dbname='
} catch(PDOException $e){
echo $e->getMessage();
}
print_r(PDO::getAvailableDrivers());
但是,我在查询数据库时遇到问题。似乎什么都没有发生。我已允许 Windows 防火墙中的端口 1521 用于传入和传出。有什么建议吗?
这是我的 php 代码:
$stmt = $pdo->prepare("SELECT * FROM `PDO`;");
$stmt->execute();
$result = $stmt->fetchColumn(0);
echo $result;
PDO 表只有一列一行。
Oracle 数据库是否需要配置为允许远程连接?
【问题讨论】:
-
向我们展示您尝试连接到数据库并设置 PDO 的代码。
-
感谢 Brad,您的要求让我仔细查看了代码。我“解决了”驱动程序错误,但现在我不知道它为什么不查询数据库。见上文。
-
遗憾的是,PDO 默认不会抛出异常。使用
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);并查看您的try/catch块是否被触发。 -
添加 setAttribute() 后没有任何变化。我在 pdo 查询之前和之后添加了一些回显语句,而在查询之后从未出现过。所以我认为它可能在查询本身或其执行中?
-
试试
var_dump($e);...一些异常没有消息(但这很少见)。更有可能的是,您的 PHP 错误日志中有一些有用的信息。
标签: php pdo oracle11g oracle-call-interface