#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 записей:
однако, когда тот же запрос выполняется с помощью вызова ODBC, показанного в приведенном выше PHP-коде, он возвращает только 1 запись с нулевыми значениями.
Если я исключу вызов DLookup из запроса, то запрос через ODBC вернет 9 записей.
Это экран просмотра, когда функция DLookup() включена в инструкцию ODBC sql.
Это экран, когда функция DLookup() НЕ включена в инструкцию SQL, выполняемую через ODBC
То, что я пытаюсь сделать, довольно просто. Обратите внимание на результаты запроса выше. столбец [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 КАК какое-то имя