Laravel连接SQL Server出现连接字符串无效(证书相关)问题求助
解决Laravel连接SQL Server的"连接字符串无效[87]"错误
核心问题分析
你遇到的SQLSTATE[08001]错误,本质是Laravel的SQL Server连接配置未正确传递TrustServerCertificate参数,同时原有配置存在变量映射缺失、关键参数未定义的问题,导致驱动无法生成合法的连接字符串。
分步解决方案
1. 修正config/database.php的SQL Server连接配置
将原有的硬编码配置替换为读取.env变量,并添加options数组传递安全证书信任参数:
'sqlsrv_attendance' => [ 'driver' => 'sqlsrv', 'host' => env('DB_SQLSRV_HOST', '192.168.10.13'), 'port' => env('DB_SQLSRV_PORT', 1433), // 显式指定端口,避免默认值异常 'database' => env('DB_SQLSRV_DATABASE', 'dbname'), 'username' => env('DB_SQLSRV_USERNAME', 'user'), 'password' => env('DB_SQLSRV_PASSWORD', 'pass'), 'charset' => 'utf8', 'prefix' => '', 'options' => [ // 强制异常模式,便于调试 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // 指定UTF-8编码 PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8, // 信任SQL Server证书,解决SSL连接验证问题 PDO::SQLSRV_ATTR_TRUST_SERVER_CERTIFICATE => env('DB_SQLSRV_TRUST_SERVER_CERT', true), ], ],
2. 优化.env文件的配置项
删除无用的DB_ODBC=0,将原DB_OPTIONS替换为更清晰的专用变量:
#####SQL Server Added DB_SQLSRV_HOST=192.168.10.13 DB_SQLSRV_PORT=1433 DB_SQLSRV_DATABASE=dbname DB_SQLSRV_USERNAME=user DB_SQLSRV_PASSWORD=pass DB_SQLSRV_TRUST_SERVER_CERT=true #####################
3. 清除Laravel配置缓存
修改配置后,必须清除缓存让新配置生效:
php artisan config:cache
4. 验证PHP扩展状态
确保sqlsrv和pdo_sqlsrv扩展已正确启用:
- 在XAMPP的PHP目录中打开
php.ini,确认以下两行无注释:extension=sqlsrv extension=pdo_sqlsrv - 重启Apache服务后,访问
phpinfo()页面,搜索sqlsrv和pdo_sqlsrv,确认扩展已加载。
5. 检查SQL Server的TCP/IP协议
在目标SQL Server服务器上:
- 打开SQL Server配置管理器
- 展开SQL Server网络配置 → 对应实例的协议
- 确保TCP/IP已启用
- 双击TCP/IP,在IP地址选项卡中确认
IPAll的TCP端口为1433
额外说明
- 不需要配置ODBC DSN:Laravel的
sqlsrv驱动支持直接通过参数建立连接,无需预定义DSN。 - 测试路由无需修改,配置生效后重新访问即可读取数据。
内容的提问来源于stack exchange,提问作者hamid
相关产品推荐
相关产品推荐

