PDO 返回错误“找不到驱动程序”和已知的工作 DSN

Posted

技术标签:

【中文标题】PDO 返回错误“找不到驱动程序”和已知的工作 DSN【英文标题】:PDO returning error "could not find driver" with a known working DSN 【发布时间】:2015-10-27 02:40:35 【问题描述】:

我正在尝试通过 phpPDO 类连接到 odbc 数据库:

$dsn = 'odbc:CS_HDZipCodes32bit';
$username = 'demo';
$password = 'skdemo!';

$connection = new PDO($dsn, $username, $password);

die( var_dump( $connection ) );

但是当我这样做时,我得到了错误:

致命错误:在 C:\inetpub\wwwroot\pdoClass.php:7 中未捕获的异常“PDOException”和消息“找不到驱动程序”堆栈跟踪:#0 C:\inetpub\wwwroot\pdoClass.php(7) : PDO->__construct('odbc:CS_HDZipCo...', 'demo', 'skdemo!') #1 main 在第 7 行的 C:\inetpub\wwwroot\pdoClass.php 中抛出

$dsn 值是我在 ODBC 管理器中创建的 DSN 的名称。

我知道这个特殊的 DSN 有效,因为我能够构建另一个演示文件并通过 odbc_connect 成功连接:

$connection = odbc_connect("CS_HDZipCodes32bit", 'demo', 'skdemo!');

if(!$connection)
    die('connection failed');


$statement = "SELECT * FROM ZipCodes";

$result = odbc_exec($connection, $statement);


// Outputs the zips as expected
var_dump(odbc_result_all($result));

我一直在挖掘PDO-ODBC 文档以及其他在线资源,但我无法弄清楚为什么 PHP 在尝试从 PDO 时找不到驱动程序。

有什么想法吗?

更新

我打开了我的 phpinfo 页面,以确保按照 Marc B 的评论安装了 odbc 驱动程序:

除非这是不同的驱动程序,否则该驱动程序似乎已安装。

另一个更新

根据 Marc B 的附加评论进一步检查我的 phpini,看来我没有安装 POD ODBC 特定驱动程序:

所以在这里,如果我安装了 pdo 的 ODBC 驱动程序,odbc 将在列表的末尾,对吗?

【问题讨论】:

你在你的“坏”dsn上试过odbc_connect吗? 是的,底部的代码块是我使用与 odbc_connect 顶部相同的 dsn。 好的,那你检查一下是否安装了pdo odbc驱动? pdo 有自己的驱动程序,而不仅仅是“包装”odbc_*() 函数。 看起来像我。我用显示 phpinfo 的 odbc 部分的屏幕截图更新了原始问题。 这是 odbc 本身,而不是 pdo odbc。它们是两个完全独立的数据库接口。那是你的 odbc_connect() 正在运行,但与 pdo 完全无关。 【参考方案1】:

在最初的问题的 cmets 中得到 Marc B 的一些帮助后,事实证明问题出在我对在我的 Web 服务器上启用 odbc 并安装了 pdo_odbc 驱动程序的误解。

虽然我确实在 Web 服务器上启用了 odbc,但我没有为 PDO 安装 odbc 驱动程序。

此驱动程序是通过 pdo 访问 odbc 数据库所必需的。

根据installing pdo for windows 上的 php.net 文档,驱动程序已经包含在 php 构建中(我使用的是 5.5 版),只需要包含在 php.ini 文件中即可。

添加驱动程序并重新启动服务器后,我现在已经加载了驱动程序:

并且我在演示数据库上使用 PDO 的测试查询有效:

$dsn = 'odbc:CS_HDZipCodes32bit';
$username = 'demo';
$password = 'skdemo!';

$connection = new PDO($dsn, $username, $password);

$query = "Select * FROM ZipCodes";


$result = $connection->query($query);

foreach($result as $row)
    var_dump($row);

转储:

感谢您的帮助,马克 B。

【讨论】:

特别是对于 Windows,如果您绝对确定您的 php.ini 具有应该启用您的扩展的设置,请检查 phpinfo() 以了解它在何处加载了 php.ini。就我而言,它仍在查看 C:\Windows,而我至少忘记了 httpd PHPINIDir 指令来告诉它确切的位置。

以上是关于PDO 返回错误“找不到驱动程序”和已知的工作 DSN的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 的 MS Access PHP 连接“找不到驱动程序”错误

pdo sqlite 找不到驱动程序... php 文件未处理

PDO_OCI:找不到驱动程序

PDO 扩展配置 - 我在我的 PHP 应用程序中不断收到 PDOException“找不到驱动程序”

PostgreSQL 迁移失败并出现错误消息“找不到驱动程序”

PDO 异常找不到驱动程序