我正在尝试连接到我在 Linux VM 上托管的 SQL Server 数据库。我在我的开发 Windows 机器上运行 xampp,连接来自我正在构建的 php 站点。我想我需要使用 sqlsrv
来连接。我从 https://learn.microsoft.com/en-us/sql/connect/php/download-drivers-php-sql-server?view= 下载了 dll sql-server-ver15&viewFallbackFrom=sql-server-2019
我已将必要的 dll 文件移至我的 xamppphpetc
目录。我还验证了 php.ini 文件中的扩展目录是 extension_dir="C:xamppphpext"
以下内容已添加到 php.ini 的 Dynamic Extensions
部分:
extension=php_sqlsrv_81_ts_x86.dll extension=php_pdo_sqlsrv_81_ts_x86.dll extension=php8ts.dll
我在网上找到了有关删除 php_
前缀、删除 .dll
后缀、使用 ts 或非 ts、将所有文件移动到扩展目录、仅将上面列出的几个文件移动到目录中的信息,不包括 php8ts。 dll
等。我已经尝试了上面的每一个配置,无论是逻辑的还是不逻辑的。
这是我的网站的示例连接代码:
$conn = new PDO('sqlsrv:Server=my_server_ip\MSSQLSERVER;Database=dbname', 'username', 'password'); if ($conn === false) { echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true); exit; } else { echo "success"; }
我尝试了多个不同的连接示例。通过上面的操作,我收到此错误:
致命错误:未捕获的 PDOException:在 C:xampphtdocssiteindex.php:123 中找不到驱动程序 堆栈跟踪:#0 C:xampphtdocssiteindex.php(123): PDO ->__construct('sqlsrv:Server=my_server_ip', 'username', 'password') #1 {main} 在第 123 行的 C:xampphtdocssiteindex.php 中抛出
从这里我逻辑上认为好吧,让我们通过回显来检查 phpinfo();
。列表中的任何位置都没有列出 sqlsrv
或 PDO 变体的任何内容。即使在sqlsrv的页面上ctrl+f,也只能发现上面的错误。
我已验证已安装 ODBC 驱动程序。
我尝试过的其他事情是使用 sqlsrv_connect
而不是 PDO。我发现与我的 php 版本(8.1)有关的信息存在冲突,但我想无论如何还是要尝试一下。但是,当我遇到该变体时,我得到:
致命错误:调用未定义的函数 sqlsrv_connect()
对我来说,很明显我的 .dll 没有被识别或类似的东西。然而我一生都无法理解为什么。我已经验证所有内容都以管理员身份运行,多次重新启动 xampp,删除/重新下载 dll 等。
谁能指出我可能没有想到的任何明显问题?
P粉7980104412023-11-10 19:58:28
已解决。有两个问题。
我的 Xampp 安装已损坏。它无法识别我在页面上使用 echo phpinfo();
时注意到的任何新 DLL。
出于某种原因,ini 文件配置尝试使用 x86 dll 而不是 x64,即使扩展在 ini 中编写为 x64 也是如此。
解决步骤:
我再次使用默认设置重新安装并重新配置了 Xampp,现在可以识别 dll。
我从 Xampp 的扩展目录中删除了 x86 dll。
最终的 php.ini 是这样的:
extension=php_sqlsrv_81_ts_x64.dll extension=php_pdo_sqlsrv_81_ts_x64.dll extension=php8ts.dll extension=php_pdo_odbc.dll extension=php_pdo.dll
使用最终的 .dll 可能是多余的,但它仍然可以按预期工作。确保验证 sqlsrv 或 pdo_sqlsrv 的正确版本,因为可能会出现与您的 php 版本的兼容性问题。