如何将PDO_SQLSRV代码转换为PDO_ODBC?解决unixODBC驱动未找到报错问题
解决用PDO_ODBC连接SQL Server的问题
我来帮你搞定这个连接问题!你碰到的SQLSTATE[IM002]错误,本质是ODBC驱动管理器找不到对应的SQL Server驱动,再加上你的DSN格式也有问题,咱们一步步来修正:
1. 先确认服务器上的SQL Server ODBC驱动
因为你的生产服务器是非Windows系统(比如Linux),PHP的pdo_odbc扩展只是上层接口,底层还需要微软官方的SQL Server ODBC驱动(比如msodbcsql17或者msodbcsql18)。你可以先检查驱动是否安装:
- Debian/Ubuntu系统:
dpkg -l | grep msodbcsql - RHEL/CentOS系统:
rpm -qa | grep msodbcsql
如果没找到对应驱动,需要先安装(你提到生产环境仅装了pdo_odbc,大概率是缺这个底层驱动)。
2. 修正PDO的DSN格式
你原来的DSN写法有两个问题:一是驱动标识不对,二是端口的语法错误。正确的DSN写法要直接指定驱动名称,示例如下:
// 注意Driver名称要和你实际安装的完全匹配,比如"ODBC Driver 17 for SQL Server" $dsn = 'odbc:Driver={ODBC Driver 17 for SQL Server};Server=tcp:my_server_host.net,' . $my_port . ';Database=my_database'; $user = '你的用户名'; $password = '你的密码'; try { $connection = new PDO($dsn, $user, $password); $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $result = $connection->query('SELECT * FROM my_table'); // 可以加个测试输出验证连接 foreach ($result as $row) { print_r($row); } } catch(PDOException $e) { echo "连接失败: " . $e->getMessage(); }
另外注意你原来的代码里把$password拼写成了$passowrd,这个小错误也要修正!
3. 确认驱动名称的准确性
如果你不确定驱动的准确名称,可以用下面的命令列出系统中所有已安装的ODBC驱动:
odbcinst -q -d
输出里会有类似[ODBC Driver 17 for SQL Server]的条目,把这个名称原封不动放到DSN的Driver={}里,不能有拼写错误。
额外排查点
- 确认生产服务器能通过指定的端口访问到SQL Server实例(可以用
telnet my_server_host.net my_port或者nc -zv my_server_host.net my_port测试网络连通性) - 如果SQL Server用的是Windows身份验证,还需要额外配置,但通常生产环境用SQL身份验证(就是你代码里的用户名密码方式)更方便。
内容的提问来源于stack exchange,提问作者Sidra Sultana
相关产品推荐
相关产品推荐

