PHP+Symfony调用Advantage ODBC带参查询触发段错误求助
问题:Advantage ODBC驱动在Doctrine参数化查询时触发Segmentation Fault
环境与问题
- Docker容器内部署adsdbc-11.10.0.24连接器
- 技术栈:PHP + Symfony + Doctrine ORM
- 现象:无参数拼接的SQL查询可正常返回结果,但使用Doctrine参数绑定语法执行查询时触发Segmentation fault
- 验证:直接使用PDO进行参数化查询无异常,排除Symfony框架本身问题
ODBC配置(odbc.ini)
[ODBC Data Sources] CAFETERIA_ODBC = Advantage ODBC Driver [CAFETERIA_ODBC] Driver=/usr/local/ads/odbc/redistribute/x64/libadsodbc.so Setup=/usr/local/ads/odbc/redistribute/x64/libadsodbc.so DataDirectory=\\172.22.9.4:6262\CAFTECH\DBF Description=Advantage ODBC driver DefaultType=FoxPro MaxTableCloseCache=0 LOCKING=FILE CharSet=ANSI Language=ANSI Compression=INTERNET ADVANTAGELOCKING=ON ServerTypes=2 CommType=TCP_IP TableExtension= TrimTrailingSpaces=TRUE
正常执行的无参数查询代码
$cafeteriaEm = $this->getContainer()->get('doctrine.orm.advantage_entity_manager'); $rawSql = " SELECT * FROM assure WHERE assure='10679257' "; $stmt = $cafeteriaEm->getConnection()->prepare($rawSql); $stmt->execute(); $assures= $stmt->fetchAll();
触发错误的参数化查询代码
$rawSql = " SELECT * FROM assure WHERE assure=:assure; "; $stmt = $cafeteriaEm->getConnection()->prepare($rawSql); $stmt->bindValue(':assure', '10679257'); $stmt->execute(); $assures= $stmt->fetchAll(); dump($assures);
排查与解决方案建议
- 显式指定参数类型:Doctrine默认的参数类型推断可能与Advantage ODBC不兼容,尝试绑定参数时明确指定类型:
$stmt->bindValue(':assure', '10679257', \PDO::PARAM_STR); - 检查驱动依赖库:执行
ldd /usr/local/ads/odbc/redistribute/x64/libadsodbc.so查看驱动依赖的系统库,确保Docker容器内所有依赖都已安装(如libstdc++6、libgcc1等)。 - 升级Doctrine DBAL:旧版DBAL的ODBC参数处理可能存在bug,升级至最新稳定版测试。
- 验证驱动与环境兼容性:确认adsdbc-11.10.0.24与当前PHP版本、Docker基础镜像的系统版本匹配,必要时更换驱动版本或基础镜像。
内容的提问来源于stack exchange,提问作者jeremy.raf
相关产品推荐
相关产品推荐

