XAMPP/SQLSRV: 无法在 PHPINFO() 中找到 Sqlsrv; - 来自连接的错误

XAMPP/SQLSRV: Unable to find Sqlsrv in PHPINFO(); - errors coming from connection

我正在尝试连接到我在 Linux 虚拟机上托管的 SQL 服务器数据库。我正在 运行ning xampp 我的开发 windows 机器上,连接来自我正在构建的 php 站点。我想我需要使用 sqlsrv 来连接。我从 https://docs.microsoft.com/en-us/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver15&viewFallbackFrom=sql-server-2019

下载了 dll

我已将必要的 dll 文件移动到我的 xampp\php\etc\ 目录中。我还验证了 php.ini 文件中的扩展目录是 extension_dir="C:\xampp\php\ext"

以下内容已添加到 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";
}

我尝试了多个不同的连接示例。使用上面的错误,我收到此错误:

Fatal error: Uncaught PDOException: could not find driver in C:\xampp\htdocs\site\index.php:123 Stack trace: #0 C:\xampp\htdocs\site\index.php(123): PDO->__construct('sqlsrv:Server=my_server_ip', 'username', 'password') #1 {main} thrown in C:\xampp\htdocs\site\index.php on line 123

从这里我逻辑上认为可以,让我们通过回显来检查 phpinfo();sqlsrv 或列表中任何位置的 PDO 变体都没有列出任何内容。甚至在sqlsrv的页面上ctrl+f,发现也只有上面的错误

我已经确认我安装了 ODBC 驱动程序。

我尝试过的其他事情是使用 sqlsrv_connect 而不是 PDO。我发现关于我的 php 版本 (8.1) 的这项工作的信息相互矛盾,但我想还是让我们试试吧。但是,当我 运行 进入该变体时,我得到:

Fatal error: Call to undefined function sqlsrv_connect()

在我看来,我的 .dll 文件没有被识别或类似的事情是显而易见的。但是我终生无法理解为什么。我已经验证一切都是 运行 作为管理员,重新启动 xampp 多次,removed/redownloaded dll 等

任何人都可以指出我可能没有想到的任何明显问题吗?

已解决。有两个问题。

  1. 我的 Xampp 安装已损坏。它不会识别我在页面上使用 echo phpinfo(); 时注意到的任何新 DLL。

  2. ini 文件配置出于某种原因试图使用 x86 dll 而不是 x64,即使在 ini 中将扩展名写为 x64 也是如此。

解决步骤:

  1. 我再次使用默认设置重新安装和配置 Xampp,现在可以识别 dll。

  2. 我从 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 版本可能会出现兼容性问题。