PDO 返回错误“找不到驱动程序”和已知的工作 DSN
Posted
技术标签:
【中文标题】PDO 返回错误“找不到驱动程序”和已知的工作 DSN【英文标题】:PDO returning error "could not find driver" with a known working DSN 【发布时间】:2015-10-27 02:40:35 【问题描述】:我正在尝试通过 php 的 PDO
类连接到 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 扩展配置 - 我在我的 PHP 应用程序中不断收到 PDOException“找不到驱动程序”