致命错误:调用未定义的函数sqlsrv_connect()

39

我遇到了很多关于同一个主题问题的帖子,但是我仍然无法解决它,所以我想问一下。我正在尝试在我的PHP脚本中连接到SQL。我的连接字符串是:

/* Specify the server and connection string attributes. */
$serverName = "xxx-PC\SQLExpress";
$connectionOptions = array("Database"=>"Salesforce");
$conn = sqlsrv_connect($serverName, $connectionOptions);
if($conn === false)
{
      die(print_r(sqlsrv_errors(), true));
}

我已经安装并在wamp文件夹下的php.ini文件中包含了以下内容:C:\wamp\bin\php\php5.4.16

extension=c:/wamp/bin/php/php5.4.16/ext/php_sqlsrv_53_ts.dll

我的 wampserver 运行正常,wampapachewampsqld 服务也都正常。我能够成功地执行 php.exe 。但是我无法连接到存放数据库的 SQL Server 2008 R2 。请帮忙解决!

编辑1:wamp服务器正在运行 wampmysql 服务,而我正在尝试连接到 SQL Server 2008 R2。这可能是原因吗?我应该使用 MySQL 而不是 SQL 吗?有什么指示吗?

编辑2:当我运行 phpinfo() 时,我根本看不到 sqlsrv 部分,尽管我已经在位于 wamp 服务器 bin 文件夹中的 php.ini 文件中添加了 extension=php_sqlsrv_54_ts.dll

enter image description here


为避免转移话题:MySQL和SQL Server是完全不同的数据库引擎 - 您发布的代码既不使用PDO也不使用MySQL。 - Álvaro González
1
@ÁlvaroG.Vicario 我已经删除了 PDO dll 并更新了扩展的路径,以确保它引用 php/ext 文件夹中的 dll。然而,我的 phpinfo() 没有返回 sqlsrv 部分。有什么建议吗? - Sarah
8个回答

20
安装第三方扩展时,您需要确保所有编译参数匹配:

  • PHP版本
  • 体系结构(32位/64位)
  • 编译器(VC9、VC10、VC11等)
  • 线程安全

常见问题包括:

  • 编辑错误的php.ini文件(这在捆绑包中很典型);正确路径显示在phpinfo()中。
  • 忘记重新启动Apache。
  • 无法看到启动错误;这些应该显示在Apache日志中,但您也可以使用命令行进行诊断,例如:

    php -d display_startup_errors=1 -d error_reporting=-1 -d display_errors -c "C:\Path\To\php.ini" -m
    

如果一切正常,您应该在命令输出和/或phpinfo()(取决于您配置的SAPI)中看到sqlsrv

[PHP模块]
bcmath
日历
Core
[...]
SPL
sqlsrv
standard
[...]

phpinfo()


1
我再次修改了PHP代码并在命令输出中看到了sqlsrv。然而,当我运行phpinfo()时却没有看到它。它不包含任何关于sqlsrv的头文件。考虑到我在命令输出中看到了它,这是否表明我的设置是正确的? - Sarah
"php -i"和"phpinfo()"是相同的,除了格式(纯文本与HTML)。 - Álvaro González
我在上面添加了一张截图。如果是相同的情况,为什么在HTML页面中没有反映出 sqlsrv 呢? 当我尝试使用 sqlsrv_connect 连接到我的SQL服务器时,仍然会收到相同的错误。 - Sarah
问题已解决!原来是我引用了错误的 php.ini 文件,感到有些尴尬。 - Sarah

12

这篇回答 帮助我找到了答案。在我的情况下,对于 wamp,有两个php.ini文件,一个在 php 文件夹下,另一个在 C:\wamp\bin\apache\Apachex.x.x\bin 文件夹下。当使用sqlsrv_connect函数连接 SQL 时,我们要引用apache文件夹下的php.ini文件。按照您的版本,在此文件中添加以下内容:

extension=c:/wamp/bin/php/php5.4.16/ext/php_sqlsrv_53_ts.dll

你是把这个添加到php.ini文件的Windows扩展中吗? - kya
@user2995165 是的,这是在Windows扩展下。 - Sarah
我已经尝试过了,但错误仍然存在。如果数据库位于不同的服务器上,会有什么影响吗?因为我有两个服务器,一个是带有WAMP的应用服务器,另一个是带有SQL Server 2005的数据库服务器。 - kya
不,那应该不是问题。你收到了什么错误信息? - Sarah
你能否帮我看一下我的这篇文章:https://dev59.com/9IHba4cB1Zd3GeqPS5CP。我没能得到任何帮助。如果你能帮我解决这个问题,那就太棒了。我一直遇到“致命错误:调用未定义的函数sqlsrv_connect()”。 - kya
这是我的问题;我正在编辑错误的配置文件。谢谢!我想补充说明的是,被使用的配置文件在 phpinfo() 的输出中列出,所以一定要检查。 - JeffryHouser

6
如果您正在使用Microsoft Drivers 3.1、3.0和2.0,请检查已安装的PHP版本与IIS是否兼容。

请使用此脚本检查PHP版本:
<?php echo phpinfo(); ?>

或者

如果您使用 Web 平台安装程序安装了 IIS 中的 PHP 管理器,则可以从中检查版本。

然后:
如果您正在使用新的 PHP 版本(5.6),请从此处下载驱动程序

对于低于 5.6 的 PHP 版本,请从此处下载驱动程序

  • PHP 驱动程序版本 3.1 需要 PHP 5.4.32 或 PHP 5.5.16 或更高版本。
  • PHP 驱动程序版本 3.0 需要 PHP 5.3.0 或更高版本。如果可能,请使用 PHP 5.3.6 或更高版本。
  • PHP 驱动程序版本 2.0 可与 PHP 5.2.4 或更高版本一起使用,但不能与 PHP 5.4 一起使用。如果可能,请使用 PHP 5.2.13 或更高版本。
然后使用PHP管理器将已下载的驱动程序添加到php config文件中。您可以按照以下方式执行此操作(浏览文件并按“确定”)。 然后重新启动IIS服务器。

enter image description here

如果这种方法不起作用,请更改php版本并尝试运行您的php脚本。 提示:将php版本更改为较低版本,并尝试了解发生了什么。然后,您可以下载相关驱动程序。

1
我正在Windows 10上使用MAMP和PHP 8.1。我需要从Microsoft下载SQL Server驱动程序(https://learn.microsoft.com/en-us/sql/connect/php/download-drivers-php-sql-server?view=sql-server-ver16),然后提取并复制正确的驱动程序dll到此文件夹中:

C:\MAMP\bin\php\php8.1.0\ext

(副注:Laravel 使用 PDO。)
然后引用它:
在此文件中: C:\MAMP\conf\php8.1.0\php.ini 添加此行: extension=php_pdo_sqlsrv_81_ts_x64.dll 并在此文件中: C:\MAMP\bin\php\php8.1.0\php.ini 添加此行: extension=pdo_sqlsrv_81_ts_x64 当然,需要重新启动服务/ Apache。
然后我可以像这样连接:
try {
    $conn = new PDO("sqlsrv:server=$servername,$port;Database=$database;ConnectionPooling=0", $username, $password,
        array(
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        )
    );


    $sql = "SELECT * FROM Table";

    foreach ($conn->query($sql) as $row) {
        print_r($row);
    } 


} catch (PDOException $e) {
    echo ("Error connecting to SQL Server: " . $e->getMessage());
}

希望能对其他人有所帮助!

1

首先检查扩展是否在phpinfo();中正确加载(应该出现类似于sqlsrv的内容)。如果没有,则扩展未正确加载。安装扩展后还需要重新启动apache。


@DaveChild 我运行了 phpinfo(),但是没有看到 sqlsrv。我错过了什么吗?它应该出现在哪里?如果这确实是问题,那么如何正确上传扩展? - Sarah
如果你没有找到它(这很可能),那么问题就在于扩展的加载。有很多可能的原因导致它无法加载。首先检查是否修改了正确的php.ini文件(php.ini文件位置将显示在phpinfo中)。还要检查错误日志以获取更多信息。 - Dave Child
@DaveChild 对不起,这是我第一次在 PHP 中使用 SQL。在哪些标题下可以检查 php.ini 的路径?我对此完全感到困惑。 - Sarah
@DaveChild,请查看上面问题的“编辑”。 - Sarah

1
我之所以有同样的问题,是因为在Apache的httpd.conf文件中,PHPIniDir D:/wamp/bin/php/php5.5.12 这一行配置是错误的。

1

问题已经解决。尽管我指定了存储所有文件的文件夹,例如C:\shared,但事实证明PHP只是在c:\中查找lumina-online-dependencies文件夹。

我将其复制到C:\中,现在它可以正常工作。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接