我在 Windows 7 Ultimate x64 上的 IIS 7.5 上运行 PHP 5.3.1。我一直在尝试使用 ADODB 通过 ODBC 让 PHP 连接到我本地安装的 SQL Server 2008 Express。起初,我很难连接它,因为即使我在 ODBC 管理器中将本地 SQL 服务器添加为服务器 DSN,我仍然不断收到此错误:
[Microsoft][ODBC Driver Manager] The specified DSN contains an
architecture mismatch between the Driver and Application
我在 Stack Overflow 上询问过此问题并得到了答案。回想起来,我可能应该在这里问这个问题,但我得到了答案,所以我不在乎。(另外,我绝对讨厌三部曲网站分裂的事实,但那是另一个故事......)
无论如何,在使用 %windir%\sysWOW64\odbcad32.exe 设置数据源后,我似乎取得了一些进展。我不再收到上面列出的错误。相反,我收到了一个看似更邪恶的错误,即这个:
之前我只是遇到了一个简单的 PHP 异常。现在我的 PHP 脚本出现了与分段错误相同的问题,因为它显然被这个 64 位 ODBC 驱动程序挂起了。救命!连接到 SQL Server 应该是一个相对简单而直接的任务,那么我需要做什么才能让它正常工作呢?
更新:我开始悬赏是因为我真的需要尽快让 SQL Server 和 PHP 互相通信。一位发帖人建议我检查事件日志,但什么也没显示出来,另一位发帖人建议我启用失败请求跟踪,我已经这样做了,但我不太确定它是否提供了任何说明。可以找到它提供的错误跟踪的副本这里(仅限 IE)。我还显示了(非常基本的)PHP 脚本这里我已将连接的名称更改为“MYCOMPUTER”,将特定数据库/目录的名称更改为“MyDatabase”,并隐藏了密码,但没有做其他更改。
一点背景知识:
- 我的计算机名为 MYCOMPUTER(实际上并非如此,但可以这么想)
- MYCOMPUTER 运行的是 64 位 Windows 7 Ultimate 和 IIS 7.5
- MYCOMPUTER 安装了 PHP 5.3.1(32 位),通过 FastCGI 处理
- MYCOMPUTER 安装了 64 位 SQL Server Express 2008
- 默认 SQL 实例名为 MYCOMPUTER\SQLEXPRESS
- 有一个名为 MyDatabase 的数据库(同样,名称实际上是不同的)
- 有一个名为 MYCOMPUTER 的系统 DSN 设置(使用 32 位 ODBC 管理器设置)
- 有一个名为 MYCOMPUTER64 的系统 DSN 设置(使用 64 位 ODBC 管理器设置)
如果我尝试在链接的脚本中连接到 MYCOMPUTER,我会收到那个可怕的 500 错误。如果我尝试在同一个脚本中连接到 MYCOMPUTER64,我会收到上面列出的“架构不匹配”错误。无论哪种方式它都不起作用。我需要它工作。请帮忙。
答案1
我发现,如果您在使用 IIS7 时以错误的方式查看 PHP+ODBC,它会给您一个通用的 500。收到 500 错误“0”非常有趣。
我有这种感觉,您正在从 OS/IIS 端处理这个问题,而从 PHP 代码端处理这个问题可能会导致我们更快地找到故障(现在您已经解决了驱动程序问题)。
PHPInfo 是否按预期工作?
在引用的 PHP 脚本中,哪一行出错了?如果没有其他办法,只需注释掉 PHP 标记内的所有内容,看看是否能返回空白页;然后逐行取消注释行和代码段(最内层嵌套最后),直到找到导致抛出错误的行和代码段。
由于您的测试脚本很短,所以它会很容易,并且希望它能指出下一步要检查的事情。
嗨嗨。
答案2
您是否已确定启用 32 位应用程序?您可以在您网站的应用程序池的“高级设置”->“常规”下找到它。
答案3
500 - 内部服务器错误是一种非常常见的错误,表示服务器配置存在一些问题。错误代码:0x00000000 表示“无错误”,您可以在网站上启用失败请求跟踪并检查导致问题的原因。
答案4
我在其他地方收到过建议,使用此命令让 IIS 以 32 位运行 -
cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
——但我无法证明它的有效性。
我确实建议不是命名所有内容都相同。要找出哪个 MYCOMPUTER 产生错误可能非常困难,例如...
之前建议检查 PHPinfo 输出,这个建议很好。在进行 ODBC 交互之前,这将证明 PHP 是否正常工作。