【发布时间】: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)
我希望语句跨越两列,而如果我正在处理问题/答案,我需要两列。见上图黄色方块。我无法确定该句子是一个问题/答案,还是只是一个陈述,所以我无法操纵
有谁知道为什么 DLookup() 没有在 ODBC 调用中成功运行,但在使用 MS-Access 程序本身运行时运行?
谢谢。
【问题讨论】: