PHP 尝试连接 SQL 服务器时无法识别 sqlsrv_connect() 函数

PHP unable to identify sqlsrv_connect() function while trying to connect SQL Server

我正在尝试使用 sqlsrv_connect() 函数从一个简单的 PHP 文件连接到本地 SQL 服务器,但每次我都在浏览器中调用该文件通过本地主机,它抛出一个 500(内部服务器错误)说:

PHP Fatal error: Uncaught Error: Call to undefined function sqlsrv_connect() in C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4

get_db_data.php 是我尝试连接服务器的文件。似乎 PHP 或本地主机无法识别 sqlsrv_connect() 功能。但就我而言,我做了所有必要的事情来确保 PHP 连接到 SQL 服务器。

我的环境:Windows10 Pro,版本 21H2,64 位。

我做了什么:

  1. 启用 IIS 确保 CGI/Fast CGI 正常工作。
  2. 在 C:\Program Files\PHP-8.1.1
  3. 安装了 PHP 8.1.1 非线程安全 x64 版本
  4. 在C:\Program Files\PHP-8.1.1中,将php.ini-开发文件重命名为php.ini
  5. 在 php.ini 文件中,取消注释 extension_dir = "ext" 指令。
  6. 已下载 php_wincache.dll 并将其添加到 PHP 的默认 ext 目录。
  7. 在 php.ini 文件的动态扩展部分添加了行扩展=php_wincache.dll。
  8. 已安装 PHPManagerForIIS_V1.5.0 并相应配置 IIS,以便 PHP 可以通过 IIS 托管。还在这里启用了 php_wincache.dll 扩展。
  9. 已安装 SQL Server 2019 Developer Edition 以及相应的 Management Studio。
  10. 在 SQL 服务器中创建了相应的数据库和表,我想从 PHP.
  11. 连接到该服务器
  12. 已确保 SQL 服务器的 Microsoft ODBC 驱动程序 17 安装在我的 PC 中,这是 PHP 所需要的。
  13. 已确保 Microsoft SQL Server 2012 Native Client 安装在我的 PC 中,这是 PHP 所要求的。
  14. 已为 SQL Server 5.9 下载 PHP 的 Microsoft 驱动程序并提取其内容。将压缩包中名为php_sqlsrv_80_nts_x64.dll的文件复制粘贴到默认的ext目录PHP.
  15. 在 php.ini 文件的动态扩展部分添加了行扩展=php_sqlsrv_80_nts_x64.dll。
  16. 在 IIS 管理器中,通过 PHP 管理器,启用 php_sqlsrv_80_nts_x64.dll 扩展。在 IIS 的根目录下创建了一个 phpinfo.php 文件,运行 成功但没有找到 wincache 和 sqlsrvin。

在上面的步骤之后,我 运行 实际的 PHP 文件试图连接 SQL 服务器,但它抛出一个错误,说它无法识别 sqlsrv_connect() 函数。假设 PHP 正在启动时 php_sqlsrv_80_nts_x64.dll 没有被加载,我 运行 php --ini 在命令提示符下。

此时会抛出以下消息:

PHP Warning: PHP Startup: Unable to load dynamic library 'php_wincache.dll' (tried: ext\php_wincache.dll (The specified module could not be found), ext\php_php_wincache.dll.dll (The specified module could not be found)) in Unknown on line 0

Warning: PHP Startup: sqlsrv: Unable to initialize module
Module compiled with module API=20200930
PHP compiled with module API=20210902
These options need to match
in Unknown on line 0

Configuration File (php.ini) Path:
Loaded Configuration File: C:\Program Files\PHP-8.1.1\php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed: (none)

但是,PHP 似乎 运行 没问题,因为当我使用 jQuery AJAX get() 和 post() 方法时HTML 文件从另一个 PHP 文件中获取数据,我成功了。然后没有抛出异常。

所以现在我缺少什么 php_wincache.dll 和 sqlsrv 似乎在 PHP 启动期间加载,我也无法从 PHP 文件连接 SQL 服务器?由于我是 jQuery AJAX 和 PHP 的新手,我不太了解它们的复杂性,因此在过去四天里一直在解决这个问题。我已经用尽了手中的所有资源,但没有任何效果。请帮忙。因此我无法完成我的任务。

get_db_data.php代码:

<?php
    $serverName = "(local)";    // Optionally use port number (1433 by default).
    $connectionString = array("Database"=>"TestDB");    // Connection string.
    $conn = sqlsrv_connect($serverName, $connectionString); // Connect using Windows Authentication.

    if($conn === false) {
        echo "Connection could not be established.<br/>";
        die(print_r(sqlsrv_errors(), true));
    } else {
        echo "Connection established successfuly.<br/>";
    }

    sqlsrv_close($conn);    // Close connection resources.
?>

感谢和问候!

我找到了问题的根源,即版本不匹配。当我使用 PHP-8.1 时,我下载了 PHP-8.0 的 SQLSRV。由于此匹配,在服务器 PHP 启动期间未加载驱动程序文件。降级到 PHP-8.0 解决了这个问题。