Драйвер ODBC PHP MS Access, по-видимому, не может обрабатывать функцию DLookup доступа() в инструкции SQL

#php #sql #ms-access #odbc

Вопрос:

Проблема в следующем. Когда я создаю инструкцию SQL в PHP для обработки драйвером ODBC MS-Access, запрос не будет обработан должным образом, если я включу функцию DLookup() в инструкцию SQL Access. У меня также была эта проблема с предложениями о СОЕДИНЕНИИ, но не со всеми предложениями о СОЕДИНЕНИИ.

Я выполняю запрос для обработки заказа, в котором я получаю настройки, запрошенные пользователем. Эти настройки также используются для заявлений. например, я могу спросить: «Как зовут капитана?», и конечный пользователь введет имя в предоставленное текстовое поле. Тем не менее, в области предпочтений я также сделаю простые заявления, которые не нуждаются в ответе, например: «Вопиющие нарушения недопустимы».

Экран ввода выглядит следующим образом: Пользователь вводит ответы на вопросы и просматривает любые заявления, которые может сделать отдел отдыха

Когда я хочу отобразить эти ответы, сделанные пользователем позже, я выполняю следующий запрос на php,

 $sqlPrefs = "SELECT pq.QText, wr.The_Answer, wr.webtmporders_detail_ID" . 
  ", DLookUp('[IsStatement]','[tbl_Activities_Preference_Questions]','[PQ_ID]=' amp; [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]=' amp; [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
 

Когда я запускаю эту инструкцию SQL с помощью средства разработки запросов в MS Access, запрос возвращает 9 записей:
Запрос возвращает 9 записей при запуске в самом MS Access

однако, когда тот же запрос выполняется с помощью вызова ODBC, показанного в приведенном выше PHP-коде, он возвращает только 1 запись с нулевыми значениями.

Если я исключу вызов DLookup из запроса, то запрос через ODBC вернет 9 записей.

Это экран просмотра, когда функция DLookup() включена в инструкцию ODBC sql. Экран просмотра при запуске DLookup() через вызов ODBC

Это экран, когда функция DLookup() НЕ включена в инструкцию SQL, выполняемую через ODBC

Функция DLookup (), не включенная в вызов ODBC SQL

То, что я пытаюсь сделать, довольно просто. Обратите внимание на результаты запроса выше. столбец [OnlyAStatement] является логическим. Если элемент содержит только утверждение, а не вопрос и ответ

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

Я хочу, чтобы утверждение охватывало две колонки, тогда как если я имею дело с вопросами / ответами, мне нужны две колонки. Смотрите картинку выше с желтым квадратом. Я не могу определить, является ли предложение вопросом / ответом или просто утверждением, поэтому я не могу манипулировать атрибутом colspan в теге <td>.

У кого-нибудь есть какие-либо идеи, почему функция DLookup() не выполняется успешно в вызове ODBC, но запускается при запуске самой программы MS-Access?

Спасибо.

Ответ №1:

DLookup() является частью объектной модели приложения Access (docs), а не ядра базы данных.
Поэтому вы не можете использовать его через ODBC.

В вашем случае этого легко избежать, добавив второе СОЕДИНЕНИЕ tbl_Activities_Preference_Questions .
Обратите внимание, что вам понадобятся круглые скобки вокруг всех соединений, кроме первого, в Access SQL.

Комментарии:

1. Вы попали в цель. Я действительно создал дополнительное соединение. Однако я все равно получаю предупреждение php, когда включаю в запрос поля с одинаковыми именами, такие как: « $sqlPrefs = «ВЫБЕРИТЕ pq.PQ_ID, pq.QText, wr.The_Answer, wr.webtmporders_detail_ID, apq.isStatement ИЗ (tbl_Preference_Questions КАК ВНУТРЕННЕЕ СОЕДИНЕНИЕ pq.tblwebtmporders_detail_Requests КАК wr НА pq.PQ_ID = wr.PQ_ID) ВНУТРЕННЕЕ СОЕДИНЕНИЕ tbl_активные_преферентные_просы apq НА pq.PQ_ID = apq.PQ_ID, ГДЕ wr.webtmporders_detail_ID = $detID И apq. ActivityId = $ПОРЯДОК ActivityId ПО wr.сортировщику;»; «

2. вышеописанное вызывает эту ошибку, которая приводит к [24 августа 2021 г. 20:32:02 Америка/Нью-Йорк] Предупреждение PHP: odbc_fetch_array(): Ошибка SQL: [Microsoft][Драйвер ODBC Microsoft Access] Указанное поле » PQ_ID может относиться к нескольким таблицам, указанным в предложении FROM вашего оператора SQL., состояние SQL S1000 в SQLGetData, тогда оно возвращает только одну запись. PQ_ID существует в таблице [wr] и в таблице [pq]. Драйвер ODBC считает, что поле PQ_ID повторяется, но я определил таблицу, из которой я хочу извлечь поле [PQ_ID]. Это произойдет, если я напишу pq.PQ_ID КАК какое-то имя