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

PHP通过ODBC调用Access联表查询提示PQ_ID字段重复引用报错

问题根因

你遇到的报错是Access ODBC驱动的特性导致的:你的两张关联表tbl_Preference_Questions、tblwebtmporders_detail_Requests都包含PQ_ID字段,即使你在SELECT语句中显式指定了wr.PQ_ID的表前缀,ODBC驱动返回字段元数据时也会丢弃表前缀,仅保留原始字段名PQ_ID,导致odbc_fetch_array生成关联数组时出现重复键名,触发字段歧义报错。而Access原生查询解析器可以识别表前缀,所以不会出错。

解决方案

方案1:为重名字段设置唯一别名(最稳妥)

修改SQL语句中wr.PQ_ID的写法,给它设置一个不重复的别名,保证返回的所有字段名唯一即可:

$sql=
"SELECT wr.SortOrder, wr.webRequests_ID, wr.PQ_ID AS wr_PQ_ID, pq.QText,wr.The_Answer, wr.webtmporders_detail_ID
FROM tbl_Preference_Questions as pq 
INNER JOIN tblwebtmporders_detail_Requests as wr ON pq.PQ_ID = wr.PQ_ID
WHERE wr.webtmporders_detail_ID = 42569
ORDER BY wr.SortOrder";

后续业务代码中从结果数组取PQ_ID的时候,改用别名wr_PQ_ID即可。

方案2:使用索引数组替代关联数组

如果不想修改SQL语句,可以把odbc_fetch_array换成odbc_fetch_row,通过索引下标读取字段值,绕开字段名重复的问题:

function all_odbc_rows($result_id) 
{
  // 注意原代码此处初始化字符串有误,应该初始化为数组
  $tmp_arr = [];
  while($row = odbc_fetch_row($result_id)){
    // 按索引读取对应字段,比如第3个字段是wr.PQ_ID就写$row[2]
    $v = strip_tags($row[2]);
    $pq_id = str_replace("\\","",str_replace("'","''",$v)); 
    // 其他字段同理处理
    $tmp_arr[] = [
      'SortOrder' => $row[0],
      'webRequests_ID' => $row[1],
      'PQ_ID' => $pq_id,
      // 其余字段按顺序补全
    ];
  }
  return $tmp_arr;
}

额外优化提示

原自定义函数中$tmp_arr = ""初始化错误,应该改为$tmp_arr = [],否则低版本PHP会触发数组赋值的警告。

内容的提问来源于stack exchange,提问作者Robert Bryan Davis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:42:03