首页 > 解决方案 > odbc_fetch_array(): SQL 错误是说字段引用了多个表但不应该。微软访问 ODBC PHP

问题描述

我有以下sql语句

$sql=
"SELECT wr.SortOrder, wr.webRequests_ID, 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";

我通过函数获取记录。变量 $mdbFilename 是 Access 数据库的路径。

$conn=odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$mdbFilename",'','',SQL_CUR_USE_ODBC);
$result_id = odbc_exec($conn, $sql);
$results = all_odbc_rows($result_id);

function all_odbc_rows($result_id) 
{
  $tmp_arr = "";
  while($row = odbc_fetch_array($result_id)){
  
// this needs to be in my program code because ODBC / Access DB query will not accept escaping of single quotes.  single quotes 
// must be replaced by two single quotes for the sql passed to access via ODBC to work.

    foreach ($row as $k => $value)
    {
        $v = strip_tags($value);
        $row[$k] = str_replace("\\","",str_replace("'","''",$v)); 
    }
     $tmp_arr[] = $row;
  }
  return $tmp_arr;
}

但我收到以下 PHP 警告

odbc_fetch_array(): SQL error: [Microsoft][ODBC Microsoft Access Driver] The specified field '`PQ_ID`' 
  could refer to more than one table listed in the FROM clause of your SQL statement., SQL state S1000 
  in SQLGetData

如果我在 Microsoft Access 查询生成器中运行此 sql,它会返回 7 条记录,没有问题。然而,当我在 PHP 中通过 ODBC 运行 sql 语句时出现错误。我收到警告,并且 ODBC 不返回任何记录。无法弄清楚为什么此连接不起作用?

我试图摆脱 wr。和 pq。表标识符并将它们替换为 sequel 语句中的完整表名,但这不起作用。

有人有想法么?

谢谢你。

顺便说一句,如果我从 sql 语句中取出 wr.PQ_ID 字段,ODBC 可以成功运行查询。

这很奇怪。

这是我尝试在 ODBC PHP 中运行的此查询的 Access 中的查询生成器 在此处输入图像描述

MS-Access 查询生成器中的 SQL 语句 在此处输入图像描述 和结果 在此处输入图像描述

所以它适用于 MS Access,但不适用于 PHP 的 ODBC 调用

诡异的。

标签: phpsqlms-accessodbc

解决方案


好吧,我在 php.net 上发现有人提出了同样的问题。然而,他们使用的是 SQL Server。我正在使用 MS-Access .mdb 文件。他们能够在 SQL Server 数据库引擎中使用别名。别名对我不起作用。所以我认为解决方案是,如果使用 MS-Access 数据库,连接字段/列必须具有不同的名称,以便 ODBC odbc_fetch_array() 或 odbc_fetch_object() 在连接 sql 语句中工作。

在此处输入图像描述


推荐阅读