【问题标题】:SQL Server Access from PHP (PDO) Not Working Despite Driver Installed & Enabled尽管已安装和启用驱动程序,但来自 PHP (PDO) 的 SQL Server 访问仍无法正常工作
【发布时间】:2014-10-14 23:46:59
【问题描述】:

我正在尝试访问 SQL Server。

更新:为了响应 Clive 在下面的 cmets,我还尝试重新安装本机 ODBC 驱动程序,但没有任何变化。

我已经检查了我能找到的所有问题,一切似乎都井井有条。我的服务器详情:

PHP 5.4(通过 Plesk 管理)
SQL Server 2008 R2 SP2
视窗服务器 2008 R2

用于 PDO 的最新 mssql 驱动程序位于 EXT 目录中,并在 php.ini 中引用:

extension=php_sqlsrv_54_nts.dll
extension=php_pdo_sqlsrv_54_nts.dll

PHPINFO() 给出以下内容:

PDO Drivers: mysql, sqlite, sqlsrv
pdo_sqlsrv support: enabled
sqlsrv support:  enabled

我的连接字符串如下所示:

$DSN = "sqlsrv:Server=myDbServer,1433;database=my-dbname";
$PdoOptions = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$sparklyGenericPdoObj = new PDO($DSN,'myUsername','myPasswurde', $PdoOptions);

但这只是给了我以下错误,它以迂回的方式链接到我已经安装的驱动程序(我已经检查了版本号):

PHP 致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[IMSSP]:此扩展需要 Microsoft SQL Server 2012 Native Client ODBC Driver 与 SQL Server 通信。使用权 以下 URL 下载 Microsoft SQL Server 2012 Native x86 的客户端 ODBC 驱动程序: http://go.microsoft.com/fwlink/?LinkId=163712'

在这个线程上(报告与我完全相同的错误)是一个解决方案,它说您可以通过在 PHPINFO 中查找我上面提到的项目来确认驱动程序已安装:Not getting connected to Sql Server 2012

任何帮助将不胜感激!

【问题讨论】:

  • 错误提示您缺少驱动程序 - 尝试安装该驱动程序
  • 谢谢克莱夫。当我看到丢失的驱动程序时,我认为驱动程序可能丢失了,所以我确保驱动程序没有丢失,根据上面的 cmets:PDO 的最新 mssql 驱动程序位于 EXT 目录中,并在 php.ini 中引用:扩展=php_sqlsrv_54_nts.dll 扩展=php_pdo_sqlsrv_54_nts.dll
  • 这是一个 PHP 扩展...你需要安装the SQL server odbc driver。完全不同的东西
  • 抱歉——我对 PHP 不太熟悉,所以假设它们也被称为驱动程序。已经为服务器安装了 ODBC、OLEDB 等驱动程序。 SQL Server 数据库正在运行许多其他数据库,这些数据库通过许多不同的语言(.NET、ASP.NET、VBscript)毫无问题地访问,而 MySQL WorkBench 则通过本机 ODBC 驱动程序访问它。这是我第一次尝试通过 PHP 访问它。
  • 然而,一个危险信号是它要求 SQL Server 2012 驱动程序,但我安装了 SQL Server 2008 R2(我知道它们是同一代但仍然看起来很奇怪?)

标签: php sql-server


【解决方案1】:

我喜欢 php.ini 中的一些配置,但被注意到了;

;extension=odbc
;extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc

去掉前面的“;”,重启服务,就可以了!

【讨论】:

    【解决方案2】:

    虽然这是一篇相当老的帖子,但我决定最好将我的答案放在这里而不是创建其他问题...

    经过 3 周的全网研究并围绕 php 安装、php 代码和驱动程序安装测试了很多假设,我终于找到了这个问题的解决方案。

    问题:

    我有一个安装在 WIN SERVER 2012 SP2 上并在 IIS 下运行的应用程序。 该应用程序的开发基于 WIN 7 SP1 并在 32 位 XAMPP 3.2.2 下运行。所有这些都运行 PHP 5.6。

    服务器上一切正常,但在 XAMPP 上本地执行时,我一直收到此消息:

    此扩展需要 Microsoft ODBC Driver 11 for SQL Server 才能与 SQL Server 通信

    即使我已多次安装此驱动程序(使用找到的其他 php 驱动程序 here,配置我的 php.ini 以加载 php_sqlsrv_56_ts.dll 和 php_pdo_sqlsrv_56_ts.dll),它仍然向我返回相同的消息...

    我用来连接远程 MSSQL Server 的 PDO 命令是:

    $db = new PDO("sqlsrv:server=192.168.165.XXX;Database=testDB;", "userName", "passWord");

    我尝试了其他驱动程序,它与 ODBC 驱动程序配合得很好;

    $db = new PDO("odbc:Driver={SQL Server};Server=192.168.165.XXX;Database=testDB;", "userName", "passWord");

    但我发现后来的驱动程序存在一些限制,我没有在 PROD 服务器上使用 sqlsrv 体验过,所以我决定多做一点研究,以找到一种在本地实现 sqlsrv 的方法机器……

    调查:

    在使用 PHP 连接之前,我尝试使用 ODBC 源管理器 (ODBCSA) 应用程序创建系统 DSN(数据源名称),并在尝试连接我的应用程序之前从那里测试连接。 我在 Win7 中发现的一件很奇怪的事情是,有两个不同的 ODBCSA 应用程序。

    32 位版本的 Odbcad32.exe 文件位于 %systemdrive%\Windows\SysWoW64 文件夹中。

    64 位版本的 Odbcad32.exe 文件位于 %systemdrive%\Windows\System32 文件夹中。

    32 位版本的 ODBC 管理器工具显示 32 位系统 DSN、32 位用户 DSN 和 64 位用户 DSN。

    64 位版本的 ODBC 管理器工具显示 64 位系统 DSN、32 位用户 DSN 和 64 位用户 DSN

    为了确定您使用的是什么 ODBCA,请检查 odbcad32.exe 下的任务管理器,如果您在右侧看到 *32,则表示它是 32 位版本。

    首先,我执行 64 位 ODBCSA,使用品牌新安装的 ODBC Driver 11 创建 DSN,称为 ODBC_11_64,并使用 ODBCSA 测试连接。一切正常。当我测试我的代码时,我收到了另一条错误消息:

    指定的 DSN 包含驱动程序和应用程序之间的体系结构不匹配

    好吧,我尝试使用 32 位 ODBCSA 创建一个新的 DSN。起初很奇怪,当我发现除了一些驱动程序名称之外没有版本号并且我从 ODBCSA 收到此错误:

    找不到适用于 SQL Server 的 ODBC 驱动程序 11 的安装例程。请重新安装驱动程序。

    还有一条消息:

    在注册表中找不到组件

    很明显,安装有问题,后来的消息给我指出了正确的方向,注册表...

    以管理员身份启动 regedit,我发现所有 64 位 ODBC 驱动程序都可以在这里找到: HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI

    所有 32 位 ODBC 驱动程序都可以在这里找到: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI

    在尝试访问 64 位密钥(SQL Server 的 \ODBC 驱动程序 11)时,我能够显示密钥值,但是当我尝试访问 32 位密钥时,我收到了以下消息:

    错误打开键,无法打开 SQL Server 驱动程序的 ODBC 驱动程序 11。 错误是阻止打开此密钥。 详细信息:访问被拒绝。

    解决方案:

    通过右键单击32位故障密钥,我能够访问权限界面。然后我可以添加我的用户名(我也可以添加一个组)并授予对注册表项的完全控制权。

    然后,我使用 32 位 ODBCSA 和 ODBC Driver 11 for SQL Server 创建新的 DSN,测试连接成功! :-)

    当我回到我的应用程序时,发现我能够在本地计算机上使用 sqlsrv 访问远程 MSSQL SERVER。

    一直都是驱动安装包出错!我应该拥有 SYSTEM、用户和管理员对密钥的安装权限,与此驱动程序的 64 位注册表项一样。

    这是一个相当长的故事,但我认为这是值得的,因为很多人试图解决这个复杂的问题,但在许多不同的方向上都没有成功。这也是我对你们所有人的贡献,你们没有找到解决方案,但在我的调查中帮助了我;-)

    【讨论】:

      【解决方案3】:

      最后我通过从这里 (SqlCmdLnUtils.msi) 安装“Microsoft® SQL Server® 2012 SP1 命令行实用程序”解决了这个问题:

      http://www.microsoft.com/en-in/download/details.aspx?id=35580

      不知道为什么会这样,但确实如此。

      【讨论】:

      • @MAK 那个帖子已经七岁了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2019-09-23
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      相关资源
      最近更新 更多