首页 > 解决方案 > sqlsrv_connect 工作正常,但 laravel 失败:TCP Provider: No connection could be made because the target machine positively denied it

问题描述

不幸的是,我必须让 laravel 与 sql server 对话.. 我通常使用 mysql.. 并且对 sql server 产生了迅速的仇恨..

我在本地主机上运行 xampp 进行开发。我可以用navicat和sql server management studio很好地连接和查询本地sql server。

sqlsrv_connect 在 php 中工作正常,我可以手动运行查询没有问题。mssql_connect 在 php 中工作正常,我可以手动运行查询没有问题。

但是 laravel 失败了。

在环境中:

DB_CONNECTION=sqlsrv
DB_HOST=localhost
DB_DATABASE=handheld2
DB_USERNAME=handheld
DB_PASSWORD=thepasswordhere
DB_PORT=1433

在 laravel 数据库配置中:

'sqlsrv' => [
            'driver' => 'sqlsrv',
            'url' => env('DATABASE_URL', 'localhost'),
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'handheld2'),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
]

我不清楚'url'是干什么用的?这与 db_host 有何不同?

我收到

Illuminate\Database\QueryException SQLSTATE[08001]:[Microsoft][ODBC Driver 17 for SQL Server]TCP 提供程序:无法建立连接,因为目标计算机主动拒绝了它。

php_sqlsrv_72_ts_x64.dll 和 php_pdo_sqlsrc_72_x64.dll 都在 php 中启用

我错过了一些简单而明显的东西吗?

编辑:请注意,此代码有效

$connectionInfo = array(
    "Database"=>"handheld2",
    "UID" => "handheld",
    "PWD" => "thepasswordhere",
);
$conn = sqlsrv_connect("localhost", $connectionInfo);
if ($conn === false) {
    echo "Could not connect.\n";
    die(print_r(sqlsrv_errors(), true));
}
$stmt = sqlsrv_query($conn, 'SELECT top 1 * from users where users.id = 1');
if($stmt === false) {
    die( print_r( sqlsrv_errors(), true) );
}

while( $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC) ) {
    print_r($row);
}

并从 db 打印出记录 .. 那么为什么它在这里工作但不是 laravel ???

标签: phplaravelsqlsrv

解决方案


如果其他人发现自己在这里,也许这会有所帮助。

在把我的头撞在墙上几个小时之后,最后对我的修复非常简单。我正在使用全新安装的所有内容(包括 Sql Server),我不得不打开 Sql Server 配置管理器(这本身就是 Windows 10 中的一个痛点......我最终不得不在 windows 文件夹中搜索SQLServerManager 因为我不知道确切的版本号,即 15)。

然后 > SQL Server 网络配置 > MSSQLSERVER 的协议 > TCP/IP 被禁用。启用此功能,在 Windows 服务和 viola 中重新启动 SQLSERVER,laravel 工作。


推荐阅读