Php PDO返回错误“;找不到驱动程序“;使用已知的工作DSN

Php PDO返回错误“;找不到驱动程序“;使用已知的工作DSN,php,pdo,odbc,dsn,Php,Pdo,Odbc,Dsn,我正试图通过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堆栈跟踪

我正试图通过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堆栈跟踪:#0 C:\inetpub\wwwroot\pdoClass.php(7):PDO->u构造('odbc:CS_HDZipCo…','demo','skdemo!')中的消息“找不到驱动程序”)#1{main}在C:\inetpub wwwroot\pdoClass.php的第7行抛出

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

我知道这个特定的DSN可以工作,因为我能够构建另一个演示文件,并通过
odbc\u 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));
我一直在网上查阅文档和其他资源,但我不明白为什么PHP在尝试使用PDO时找不到驱动程序

有什么想法吗

更新 我打开我的phpinfo页面,确保按照Marc B的注释安装了odbc驱动程序:

除非是其他驱动程序,否则看起来驱动程序已安装

另一个更新 根据Marc B的补充意见对我的phpini进行进一步检查后,我似乎没有安装POD ODBC特定的驱动程序:


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

在最初问题的评论中得到Marc B的一些帮助后,发现问题来自于我对在web服务器上启用
odbc
以及安装
pdo_odbc
驱动程序的误解

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

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

根据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);
}
丢弃:


感谢您的帮助Marc B.

您是否在“坏”dsn上尝试了odbc_connect?是的,底部的代码块是我在odbc_connect上从顶部使用相同的dsn。好的,那么您是否检查了pdo odbc驱动程序是否已安装?pdo有自己的驱动程序,它不仅仅是“包装”odbc函数,它看起来像我一样。我用显示phpinfo的odbc部分的屏幕截图更新了原始问题。这是odbc本身,但不是pdo-odbc。它们是两个完全独立的数据库接口。这就是您的
odbc\u connect()
正在运行,但与pdo完全无关。特别是对于Windows,如果您完全确定
php.ini
具有启用扩展的设置,请检查
phpinfo()
以了解它在哪里加载了
php.ini
。在我的例子中,它仍然在
C:\Windows
中查找,我忘记了至少一个httpd
PHPINIDir
指令来告诉它确切的位置。