通过 PHP、SQL STATE IM004 连接到 SQL Server 时出错,驱动程序的 SQLAllocHandle on SQL_HANDLE_ENV 失败

Posted

技术标签:

【中文标题】通过 PHP、SQL STATE IM004 连接到 SQL Server 时出错,驱动程序的 SQLAllocHandle on SQL_HANDLE_ENV 失败【英文标题】:Connection error to SQL Server via PHP, SQL STATE IM004, Driver's SQLAllocHandle on SQL_HANDLE_ENV failed 【发布时间】:2018-07-22 09:49:23 【问题描述】:

我已经搜索并搜索了我的问题,但我仍然没有找到答案。我的问题是当通过 php PDO/ODBC 连接连接到我的 SQL Server 数据库时,我总是收到错误消息:“[Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_ENV failed, SQL state IM004 in SQLConnect” .但是我与 Oracle 或 mysql 数据库的连接完全没有问题,只有 SQL Server 数据库。

这是我测试连接的代码:

$dbh = null;
try

    $dbh = new PDO('oci:dbname='.TNS, DB_USERNAME, DB_PASSWORD, null);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

catch(PDOException $pe) 
    //var_dump($pe->getMessage());


if (!is_null($dbh)) 
    echo "Oracle Connection success";

else 
    echo "Oracle cannot connect";

echo "<br />";



$dbh = null;
try

    $dbh = new PDO('mysql:host=localhost;dbname=db_test', 'root', '', null);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

catch(PDOException $pe) 
    //var_dump($pe->getMessage());


if (!is_null($dbh)) 
    echo "MySQL Connection success";

else 
    echo "MySQL cannot connect";

echo "<br />";



$dbh = null;
try

    $dbh = new PDO('sqlsrv:server=XXXXX;Database=xxxxxxx', 'xxxx', 'xxxx', null);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

catch(PDOException $pe) 
    //var_dump($pe->getMessage());


if (!is_null($dbh)) 
    echo "MySQL Connection success";

else 
    echo "SQL Server cannot connect";

上面的结果显示为:

Oracle 连接成功 MySQL 连接成功 SQL Server 无法连接

我尝试重新安装 XAMPP 并复制新的 PHP 的 SQL Server 库。但错误仍然相同。正如我上面提到的,我一直在寻找解决方案,但仍然没有运气。我真的希望,我能为我的问题找到一个解决方案,或者至少给我一个开始的线索。哦,是的,我差点忘了,这个错误发生在 Windows 10 更新之后,在此之前,我与 SQL Server 的连接很好。所以,我想知道这个问题是否与 Windows 更新有关。我真的不知道。

对不起我的英语语言,非常感谢您的帮助。我真的很感激任何答案

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,这些是我为确保它正常工作而采取的步骤:

我的配置(Win10、XAMPP、PHP 7.2.8)

1) 下载 Microsoft PHP Drivers for SQL Server 5.3 并将以下文件放入 C:\xampp\php\ext 目录:

php_sqlsrv_72_ts_x86.dll php_pdo_sqlsrv_72_ts_x86.dll

2) 将以下行添加到我的 c:\xampp\php 中的 php.ini 文件

    extension=php_pdo.dll extension=php_sqlsrv_72_ts_x86.dll extension=php_pdo_sqlsrv_72_ts_x86.dll

注意:我最初错过了第一行 (extension=php_pdo.dll),这给了我一个“驱动程序 SQLAllocHandle on SQL_HANDLE_ENV failed”错误。您不需要将 dll 放在 ext 目录中,因为在 PHP 7 中它是内置的,但您确实需要将该行放在 ini 文件中。

3) 已下载并安装 Microsoft ODBC Driver for SQL Server 17。

确保在进行更改后停止并重新启动 Apache 服务器。

【讨论】:

Whoops\Exception\ErrorException:PHP 启动:无法加载动态库 'php_pdo.dll'

以上是关于通过 PHP、SQL STATE IM004 连接到 SQL Server 时出错,驱动程序的 SQLAllocHandle on SQL_HANDLE_ENV 失败的主要内容,如果未能解决你的问题,请参考以下文章

使用 php 和 sql 显示内部连接的结果

使用php和sql显示内连接的结果

QODBC连接字符串

php 64 位 SQL 状态 IM002 错误中的 MS Access DB

基于php004网络投票在线投票系统

java通过配置文件(Properties类)连接Oracle数据库代码示例