【发布时间】: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 位。
我做了什么:
- 启用 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 扩展。
- 已安装 SQL Server 2019 Developer Edition 以及相应的 Management Studio。
- 在我想从 PHP 连接到的 SQL Server 中创建了相应的数据库和表。
- 确保 Microsoft ODBC Driver 17 for SQL Server 已安装在我的 PC 中,这是 PHP 所必需的。
- 确保我的 PC 中安装了 Microsoft SQL Server 2012 Native Client,这是 PHP 所要求的。
- 已下载 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 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.php 和 docs.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