我正在尝试访问SQL Server。
更新:作为对下面Clive的评论的回应,我也尝试过重新安装本机ODBC驱动程序,但没有更改。
我已经检查了所有可以找到的问题,一切似乎都井然有序。我的服务器详细信息:
PHP 5.4(通过Plesk管理)
SQL Server 2008 R2 SP2
Windows Server 2008 R2
用于PDO的最新mssql驱动程序位于EXT目录中,并在php.ini中进行了引用:
extension=php_sqlsrv_54_nts.dll
extension=php_pdo_sqlsrv_54_nts.dll
Run Code Online (Sandbox Code Playgroud)
PHPINFO() 给出以下内容:
PDO Drivers: mysql, sqlite, sqlsrv
pdo_sqlsrv support: enabled
sqlsrv support: enabled
Run Code Online (Sandbox Code Playgroud)
我的连接字符串如下所示:
$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);
Run Code Online (Sandbox Code Playgroud)
但这只是给我以下错误,该错误以回旋方式链接到我已经安装的驱动程序(我已经检查了版本号):
PHP致命错误:消息为'SQLSTATE [IMSSP]的未捕获异常'PDOException':此扩展要求Microsoft SQL Server 2012本机客户端ODBC驱动程序与SQL Server通信。访问以下URL,以下载适用于x86的Microsoft SQL Server 2012 Native Client ODBC驱动程序:http : //go.microsoft.com/fwlink/?LinkId=163712 '
在此线程上(报告与我完全相同的错误),是一个解决方案,它表示您可以通过在PHPINFO中查找我上面提到的项目来确认驱动程序已安装:未连接到Sql Server 2012!
任何帮助将非常感激!
尽管这是一个相当老的帖子,但我认为最好将答案放在此处而不是创建其他问题...
经过3个星期的网上研究并测试了关于php安装,php代码和驱动程序安装的许多假设,我终于找到了解决此问题的方法。
问题:
我有一个安装在WIN SERVER 2012 SP2上并在IIS下运行的应用程序。该应用程序的开发是在WIN 7 SP1上进行的,并在32位XAMPP 3.2.2下运行。所有这些都运行PHP 5.6。
在服务器上一切正常,但是在XAMPP上本地执行时,我一直收到此消息:
此扩展要求用于SQL Server的Microsoft ODBC Driver 11与SQL Server通信
即使我已经多次安装了该驱动程序(与在此处找到的其他php驱动程序一样,将我的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 Source Administrator(ODBCSA)应用程序创建System DSN(数据源名称),并在尝试与应用程序连接之前从中测试连接。我在Win7中发现的一件很奇怪的事情是,有两个不同的ODBCSA应用程序。
Odbcad32.exe文件的32位版本位于%systemdrive%\ Windows \ SysWoW64文件夹中。
Odbcad32.exe文件的64位版本位于%systemdrive%\ Windows \ System32文件夹中。
ODBC管理器工具的32位版本显示32位系统DSN,32位用户DSN和64位用户DSN。
ODBC管理器工具的64位版本显示64位系统DSN,32位用户DSN和64位用户DSN。
仅要确定您使用的是哪种ODBCA,请在odbcad32.exe下检查任务管理器,如果您在右边看到* 32,则表示它是32位版本。
首先,我执行了64位ODBCSA,使用全新安装的ODBC驱动程序11(称为ODBC_11_64)创建了DSN,并使用ODBCSA测试了连接。一切都很好。测试代码时,我收到了另一条错误消息:
指定的DSN包含驱动程序和应用程序之间的体系结构不匹配
好的,然后,我尝试使用32位ODBCSA创建一个新的DSN。起初很奇怪,当我发现除了一些驱动程序名称之外没有版本号,并且我从ODBCSA收到此错误:
找不到用于SQL Server的ODBC Driver 11的安装例程。请重新安装驱动程序。
和另一个消息:
在注册表中找不到组件
很明显,这是一个安装问题,后来的消息指出了正确的方向,即注册表...
以admin身份启动regedit,我发现可以在这里找到所有64位ODBC驱动程序:
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
所有32位ODBC驱动程序都可以在这里找到:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI
尝试访问64位密钥(用于SQL Server的\ ODBC Driver 11)时,我能够显示键值,但是当我尝试访问32位密钥时,却收到此消息:
错误打开键,SQL Server驱动程序的ODBC驱动程序11无法打开。错误导致此键无法打开。详细信息:访问被拒绝。
解决方案:
通过右键单击32位错误密钥,我可以访问权限界面。然后,我可以添加我的用户名(也可以添加组),并授予对注册表项的完全控制权限。
然后,我回到使用用于SQL Server的32位ODBCSA和ODBC Driver 11创建新的DSN的过程中,测试了与SUCCESS的连接!:-)
回到我的应用程序时,我发现我可以在本地计算机上使用sqlsrv访问远程MSSQL SERVER。
一直以来都是驱动程序安装包有问题!我应该具有SYSTEM的安装权限,该密钥的用户和管理员具有与此驱动程序的64位注册表项所做的权限。
这是一个漫长的故事,但是我认为这是值得的,因为许多人试图解决这个复杂的问题,并朝着许多不同的方向努力而没有成功。这也是我对你们所有人的贡献,他们未能找到解决方案,但对我的调查有所帮助;-)
| 归档时间: |
|
| 查看次数: |
12887 次 |
| 最近记录: |