【问题标题】:PHP MS Access ODBC driver seems not to be able process Access DLookUp() Function in SQL statementPHP MS Access ODBC 驱动程序似乎无法处理 SQL 语句中的 Access DLookUp() 函数
【发布时间】:2021-10-24 23:52:20
【问题描述】:

问题是这样的。当我在 PHP 中创建要由 MS-Access ODBC 驱动程序处理的 SQL 语句时,如果我在 Access SQL 语句中包含 DLookUp() 函数,则查询将无法正确处理。我在 JOIN 子句中也遇到过这个问题,但不是所有的 JOIN 子句。

我正在运行查询以处理我正在检索用户请求的首选项的订单。这些首选项也用于语句。例如,我可能会问,“船长叫什么名字?”最终用户将在提供的文本框中输入名称。然而在偏好方面,我也会做一些不需要回答的简单陈述,比如“不会容忍明目张胆的犯规”。

输入屏幕如下所示:

当我想稍后显示用户做出的这些答案时,我在 php 中运行以下查询,

$sqlPrefs = "SELECT pq.QText, wr.The_Answer, wr.webtmporders_detail_ID" . 
  ", DLookUp('[IsStatement]','[tbl_Activities_Preference_Questions]','[PQ_ID]=' & [wr].[PQ_ID]) AS OnlyAStatement " .
  " FROM `tbl_Preference_Questions` pq" .
  " INNER JOIN `tblwebtmporders_detail_Requests` wr ON pq.PQ_ID = wr.PQ_ID" . 
  " WHERE wr.webtmporders_detail_ID =" .  $detID . 
  " ORDER BY wr.SortOrder";
          
$result_id_prefs = odbc_exec($connection_id, $sqlPrefs);
$numResults_prefs = odbc_record_count ($result_id_prefs, $connection_id, $sqlPrefs);
$results_prefs = all_odbc_rows($result_id_prefs);
        
if($numResults_prefs >0){
   $thePreferences = "<table border=\"0\" style=\"margin-top:0px;margin-bottom:0px\">";
   foreach ($results_prefs as $result_pref) 
   {
      $qtext = $result_pref['QText'];    
      if($result_pref['OnlyAStatement'] == true){
         $thePreferences .= "                   
<tr>
  <td class=\"prefs\" width=\"100%\" colspan=\"2\">$qtext</td>
</tr>";                 
      }else{
         $thePreferences .= "                   
<tr>
  <td class=\"prefs\" width=\"50%\">$qtext</td>
  <td class=\"prefs\">" . $result_pref['The_Answer'] . "</td>
</tr>";
      }
   }
}

我省略了一些对我编写的日志记录函数的调用,它将显示 $sqlPrefs 变量解析为什么:

SELECT pq.QText, wr.The_Answer, wr.webtmporders_detail_ID,
 DLookUp('[IsStatement]','[tbl_Activities_Preference_Questions]','[PQ_ID]=' & [wr].[PQ_ID]) AS OnlyAStatement  
FROM `tbl_Preference_Questions` pq 
INNER JOIN `tblwebtmporders_detail_Requests` wr ON pq.PQ_ID = wr.PQ_ID 
WHERE wr.webtmporders_detail_ID =76884 
ORDER BY wr.SortOrder

当我在 MS Access 中使用查询设计工具运行此 SQL 语句时,查询返回 9 条记录:

但是,当通过上面 PHP 代码中显示的 ODBC 调用运行相同的查询时,它只返回 1 条记录,所有记录均为空值。

如果我从查询中取出 DLookup 调用,那么通过 ODBC 的查询将返回 9 条记录。

当 DLookup() 函数包含在 ODBC sql 语句中时,这是查看屏幕。

这是当 DLookup() 不包含在通过 ODBC 运行的 SQL 语句中时的屏幕

我想做的很简单。注意上面的查询结果。 [OnlyAStatement] 列是布尔值。如果该项目仅包含陈述,而不是问答

if($result_pref['OnlyAStatement'] == true)

我希望语句跨越两列,而如果我正在处理问题/答案,我需要两列。见上图黄色方块。我无法确定该句子是一个问题/答案,还是只是一个陈述,所以我无法操纵

标记中的 colspan 属性。

有谁知道为什么 DLookup() 没有在 ODBC 调用中成功运行,但在使用 MS-Access 程序本身运行时运行?

谢谢。

【问题讨论】:

    标签: php sql ms-access odbc


    【解决方案1】:

    DLookup() 是 Access 应用程序对象模型 (docs) 的一部分,而不是数据库引擎。
    因此您不能通过 ODBC 使用它。

    在您的情况下,通过向tbl_Activities_Preference_Questions 添加第二个 JOIN 可以轻松避免。
    请注意,除了 Access SQL 中的第一个之外,所有 JOIN 都需要括号。

    【讨论】:

    • 你是目标。我确实创建了额外的连接。但是,当我在查询中包含相同的命名字段时,我仍然会收到 php 警告,例如:``` $sqlPrefs = "SELECT pq.PQ_ID, pq.QText, wr.The_Answer, wr.webtmporders_detail_ID, apq.isStatement FROM (tbl_Preference_Questions AS pq INNER JOIN tblwebtmporders_detail_Requests AS wr ON pq.PQ_ID = wr.PQ_ID) INNER JOIN tbl_Activities_Preference_Questions apq ON pq.PQ_ID = apq.PQ_ID WHERE wr.webtmporders_detail_ID = $detID AND apq.ActivityID = $theActivityId ORDER BY wr.SortOrder;"; ```
    • 以上会触发此错误,这会产生 [24-Aug-2021 20:32:02 America/New_York] PHP 警告:odbc_fetch_array(): SQL 错误:[Microsoft][ODBC Microsoft Access Driver]指定字段“PQ_ID”可以引用 SQL 语句的 FROM 子句中列出的多个表。SQLGetData 中的 SQL 状态 S1000 则它只返回一条记录。 PQ_ID 存在于表 [wr] 和表 [pq] 中。 ODBC 驱动程序认为 PQ_ID 字段是重复的,但我已确定要从中提取 [PQ_ID] 字段的表。如果我写 pq.PQ_ID AS somevarname,就会发生这种情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多