php - 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 ???
解决方案
如果其他人发现自己在这里,也许这会有所帮助。
在把我的头撞在墙上几个小时之后,最后对我的修复非常简单。我正在使用全新安装的所有内容(包括 Sql Server),我不得不打开 Sql Server 配置管理器(这本身就是 Windows 10 中的一个痛点......我最终不得不在 windows 文件夹中搜索SQLServerManager 因为我不知道确切的版本号,即 15)。
然后 > SQL Server 网络配置 > MSSQLSERVER 的协议 > TCP/IP 被禁用。启用此功能,在 Windows 服务和 viola 中重新启动 SQLSERVER,laravel 工作。