我正在尝试使用 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 位。
我做了什么:
- 启用 IIS 确保 CGI/Fast CGI 正常工作。
- 在 C:\Program Files\PHP-8.1.1 安装了 PHP 8.1.1 非线程安全 x64 版本
- 在 C:\Program Files\PHP-8.1.1 中,将 php.ini-development 文件重命名为 php.ini
- 在 php.ini 文件中,取消注释 extension_dir = "ext" 指令。
- 下载 php_wincache.dll 并将其添加到 PHP 的默认 ext 目录中。
- 在 php.ini 文件的动态扩展部分添加了行 extension=php_wincache.dll。
- 安装了 PHPManagerForIIS_V1.5.0 并相应地配置了 IIS,以便可以通过 IIS 托管 PHP。还在此处启用了 php_wincache.dll 扩展。
- 安装 MSSQL Server 2019 开发人员版以及相应的 Management Studio。
- 在 SQL Server 中创建了我想要从 PHP 连接的相应数据库和表。
- 确保我的电脑上安装了 PHP 所需的 SQL Server 的 Microsoft ODBC Driver 17。
- 确保我的电脑上安装了 PHP 所需的 Microsoft SQL Server 2012 Native Client。
- 下载 Microsoft Drivers for PHP for SQL Server 5.9 并解压其内容。复制包中名为 php_sqlsrv_80_nts_x64.dll 的文件并将其粘贴到 PHP 的默认 ext 目录中。
- 在 php.ini 文件的动态扩展部分添加了行 extension=php_sqlsrv_80_nts_x64.dll。
- 在 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 启动:无法加载动态库“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