【问题标题】:PHP + odbc: Data source name not found and no default driver specifiedPHP + odbc:未找到数据源名称且未指定默认驱动程序
【发布时间】:2018-07-10 22:47:04
【问题描述】:

我使用 odbc 驱动程序从 MS Access 数据库文件中加载数据。

PHP 代码:

$connStr ='odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};' . 'Dbq=C:\\inetpub\\wwwroot\\dir\\dir.accdb;';

$dbh = new PDO($connStr);

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql="my_sql_query";
$sth = $dbh->prepare($sql);
$params=array();
$sth->execute($params);

在本地计算机上这可行,但是当我上传到主服务器时,我在尝试访问站点时收到此消息:

错误:

PHP 致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[IM002] SQLDriverConnect: 0 [Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序 C:\inetpub\wwwroot\dir\index.php:424 堆栈跟踪:#0 C:\inetpub\wwwroot\dir\index.php(424): PDO->__construct('odbc:Driver={Mi...') #1 {main} 抛出 C:\inetpub\wwwroot\dir\index.php 第 424 行

系统:

  • PHP 版本:5.6.3
  • 服务器:带有 IIS 7.5 的 Windows Server 2008 R2

我已安装 64bit ODBC Driver 11 for SQL Server 并且在 php.ini 文件中启用了扩展。我看到一些教程表明我必须打开 ODBC 数据源管理器,转到系统 DSN 选项卡,然后创建一个系统数据源。如果我必须这样做,在服务器上连接我应该选择什么,因为我实际上是在使用这个驱动程序来访问 Access 数据库文件。同样在测试环境中,我不必做这样的事情。

有什么想法吗?

提前谢谢你

编辑 好的。我做了以下事情: 1)我安装了 MS Visual C++ 2015,因为我缺少 Microsoft Access 数据库引擎 2016 的 dll 文件(这会添加 ODBC 中缺少的驱动程序)。 2) 安装 MS Access 数据库引擎 2016。 3)在这 2 次安装之后,我创建了一个 DSN 并将其指向我的访问文件

当我尝试运行 php 文件时,我得到了这个:

PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY009]:                                                                          
Invalid use of null pointer: 0 [Microsoft][ODBC Microsoft Access Driver]Invalid use of null pointer  (SQLPrepare[0] at ext\pdo_odbc\odbc_driver.c:206)' in C:\inetpub\wwwroot\dir\index.php:434
Stack trace:
#0 C:\inetpub\wwwroot\dir\index.php(434): PDO->prepare('')
#1 {main}
  thrown in C:\inetpub\wwwroot\dir\index.php on line 434 

有什么想法吗??

【问题讨论】:

  • 您的问题不是涉及 SQL Server,而是涉及 MS Access——虽然是同一家公司,但有两个不同的 DBMS。

标签: php ms-access odbc


【解决方案1】:

您需要在连接字符串中指定正确的 ODBC 驱动程序。 如果您的 PHP 在 32 位模式下工作 - 您必须使用 32b 驱动程序。

其次,SQL Server 的驱动程序和 MS Access 的驱动程序是两个非常不同的东西。如果您需要使用 .MDB - 您需要安装 MS Access。

在数据源管理器中创建系统 DSN 很有用,它极大地简化了程序中的连接字符串(到“DSN=mydsn”这一点,仅此而已)。它还允许您以方便的方式配置 DSN(选择不同版本的驱动程序、更改文件位置等)。它还允许您通过简单的“DSN=mydsn”从不同的应用程序连接到同一个数据库。 创建 DSN 可能不利的唯一情况是您由于某种原因无法创建 DSN。例如,如果您在计算机上没有足够的权限。但在所有其他情况下 - 创建 DSN,将节省大量时间和精力。

【讨论】:

  • 非常感谢您的回答!关于 php 模式,我在哪里查看它是在 32 位还是 64 位上运行?另外,我真正需要的是连接到 ms access 数据库文件而不是 sql server,我需要将 ms access 安装到我的服务器还是特定的驱动程序?关于最新的,您建议只创建一个 DSN?如果是,我如何使用我在原始帖子中编写的代码在 php 代码中使用它?
  • 您可以安装 Access ODBC 驱动程序而无需安装(或需要许可证)Access。与其他所有 ODBC 一样,请确保将 32/64 位 ODBC 驱动程序与 PHP 匹配。还要注意 inetpub 文件夹有一些特殊的权限问题;您最好将数据库放在其他地方。 ODBC 驱动程序不需要该文件可以通过 Web 访问。
  • 我看到 PHP 是 32 位运行的,但服务器是 64 位的,所以当我尝试安装 32 位驱动系统时,由于不兼容而无法安装
  • 我也将我的文件直接放在 C:\ 驱动器中,以防权限问题。我创建了一个系统 DSN,我只是输入了一个名称,而没有弄乱其他设置。现在的问题是如何在我的 php 代码中使用这个数据源?在我的连接字符串中?语法是什么?
猜你喜欢
  • 2011-11-24
  • 2011-06-02
  • 2011-07-30
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2018-02-12
相关资源
最近更新 更多