You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:30:51