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
相关产品推荐
相关产品推荐

