尝试连接 SQL Server 时,PHP 无法识别 sqlsrv_connect() 函数

尝试连接 SQL Server 时,PHP 无法识别 sqlsrv_connect() 函数

我正在尝试使用 sqlsrv_connect() 函数从一个简单的 PHP 文件连接到我的本地 MSSQL 服务器,但是每次我通过 localhost 在浏览器中调用该文件时,它都会抛出 500(内部服务器错误)并显示:“PHP 致命错误:未捕获错误:在 C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4 中调用未定义的函数 sqlsrv_connect()”。get_db_data.php 是我尝试连接服务器的文件。似乎 PHP 或本地主机无法识别 sqlsrv_connect() 函数。但就我而言,我已采取一切必要措施确保 PHP 连接 SQL Server。

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

我做了什么:

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

完成上述步骤后,我运行了实际的 PHP 文件,尝试连接 SQL Server,但它抛出了一个错误,说它无法识别 sqlsrv_connect() 函数。假设在 PHP 启动时未加载 php_sqlsrv_80_nts_x64.dll,我在命令提示符中运行了 php --ini。此时抛出了以下消息:

PHP 警告:PHP 启动:无法加载动态库“php_wincache.dll”(已尝试:ext\php_wincache.dll(找不到指定的模块)、ext\php_php_wincache.dll.dll(找不到指定的模块))在第 0 行的未知位置

警告:PHP 启动:sqlsrv:无法初始化模块 使用模块 API=20200930 编译的模块 使用模块 API=20210902 编译的 PHP 这些选项需要在第 0 行的未知中匹配 配置文件(php.ini)路径:已加载的配置文件:C:\Program Files\PHP-8.1.1\php.ini 扫描其他 .ini 文件:(无) 解析的其他 .ini 文件:(无)

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

那么我现在缺少什么呢?php_wincache.dll 和 sqlsrv 似乎在 PHP 启动期间都没有加载,我也无法从 PHP 文件连接 SQL Server?由于我是 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.
?>

答案1

PHP Fatal error: Uncaught Error: Call to undefined function sqlsrv_connect()因为模块未加载,所以您遇到了此问题。sqlsrv模块未加载,因为您的错误消息明确指出了这一点compiled with module API=20200930。PHPPHP compiled with module API=20210902要求模块使用与 PHP 本身相同的 API 版本进行编译。您需要获取与模块编译版本相同的 PHP 版本,或者获取针对您的 PHP 版本编译的模块。

答案2

我认为https://github.com/microsoft/msphpsql/releases/download/v5.10.0-beta2/Windows-8.1.zip就是您所需要的。

在你的 php.ini 中尝试这些

extension=php_pdo_sqlsrv_81_ts.dll
extension=php_sqlsrv_81_ts.dll

相关内容