【问题标题】:PHP unable to identify sqlsrv_connect() function while trying to connect SQL ServerPHP 在尝试连接 SQL Server 时无法识别 sqlsrv_connect() 函数
【发布时间】:2022-01-03 17:18:30
【问题描述】:

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

PHP 致命错误:未捕获的错误:调用 C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4 中的未定义函数 sqlsrv_connect()

get_db_data.php 是我尝试连接服务器的文件。似乎 PHP 或 localhost 无法识别 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. 已安装 SQL Server 2019 Developer Edition 以及相应的 Management Studio。
  9. 在我想从 PHP 连接到的 SQL Server 中创建了相应的数据库和表。
  10. 确保 Microsoft ODBC Driver 17 for SQL Server 已安装在我的 PC 中,这是 PHP 所必需的。
  11. 确保我的 PC 中安装了 Microsoft SQL Server 2012 Native Client,这是 PHP 所要求的。
  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 扩展。在IIS的根目录下创建了一个phpinfo.php文件,运行成功但是发现没有提到wincache和sqlsrvin。

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

此时会抛出以下消息:

PHP 警告: PHP Startup: Unable to load dynamic library '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 文件中的 jQuery AJAX get() 和 post() 方法从另一个 PHP 文件中获取数据时,我成功地这样做了。那时没有抛出异常。

那么我现在缺少什么,在 PHP 启动期间似乎既没有加载 php_wincache.dll 和 sqlsrv,也无法从 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.
?>

感谢和问候!

【问题讨论】:

  • 您似乎存在编译器不兼容问题。检查什么与什么兼容,也许有些东西还没有赶上 PHP8.1
  • 不知道为什么要访问php_wincache,但这也不是 PHP 的默认部分,必须手动单独编译。
  • 由于我是 PHP 和 AJAX 的新手,我不太了解兼容性问题。但是我按照 PHP 和 MS-SQL Server 网站上的建议进行了操作,而不是 php.net/manual/en/book.sqlsrv.phpdocs.microsoft.com/en-us/sql/connect/php/…。我反复严格地尝试检查我是否遗漏了什么。但除了我在原始帖子中提到的内容之外,似乎没有更多信息或建议可遵循。
  • 我尝试匹配我下载到的文件和应用程序的版本以及我的操作系统的 x64 版本和体系结构。即使是 Microsoft SQL Server 2012 Native Client 和 Microsoft ODBC Driver 17 for SQL Server,PHP 和 Microsoft 推荐的两个实用程序也安装在我的 PC 中。由于我使用的是 PHP 8.1.1 的非线程安全版本,因此我交叉检查了是否安装了相应的 Microsoft Driver for SQL Server,即 5.9,这也是 PHP 和 Microsoft 推荐的。
  • 我复制到 PHP 的 ext 文件夹中的 Microsoft Driver for PHP for SQL 对应的 dll 是 php_sqlsrv_80_nts_x64.dll 如您所见,它是 PHP 8.0 或更高版本的 x64 版本。我查了这么多。我还应该研究什么?你能指出我还缺少什么地方吗?

标签: javascript php jquery sql-server ajax


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多