Дублирование CFLOOP
У меня есть выпадающий список, который создается двумя циклами. Внутренний цикл генерирует последовательность чисел, то есть от 0 до 23. Внешний цикл - это цикл запроса, который выбирает правильное значение из 23 чисел на основе значений, хранящихся в моей базе данных.
Моя проблема здесь в том, что эти два цикла конфликтуют, что приводит к отображению чисел от 0 до 23 дважды. Как можно сохранить обе петли, но избежать этой проблемы? Эта проблема также вызывает проблемы при отправке формы, пытаясь отправить форму дважды и удаляя введенные пользователем данные.
Это мой код:
<select id="openHours#CountVar#" name="openHours#CountVar#">
<cfloop query="doctorHours" >
<cfloop from="0" to="23" index="OpenHours">
<option value="#openHours#"
<cfif TimeFormat(doctorHours.openTime,'HH') EQ OpenHours AND CountVar EQ doctorHours.day > selected="selected"</cfif>>#OpenHours#</option>
</cfloop>
</cfloop>
</select>
Это мой CFDUMP для этого запроса
query
RESULTSET
query
CLOSETIME DAY DOCTORID OPENTIME
1 1970-01-01 16:00:00.0 4 2011041516290025478779 1970-01-01 10:00:00.0
2 1970-01-01 16:00:00.0 1 2011041516290025478779 1970-01-01 13:00:00.0
3 1970-01-01 16:00:00.0 2 2011041516290025478779 1970-01-01 13:00:00.0
CACHED false
EXECUTIONTIME 0
SQL select doctorID, opentime, closetime, day from doctorBusinessHours where doctorID='2011041516290025478779'
2 ответа
Вы должны вернуть только те часы, которые вам нужны, а затем выполнить цикл для создания выпадающего списка:
DATEPART(hh,yourdate)
вернет часы для вашего значения datetime:
<cfquery name="doctorHours" datasource="#ds#">
SELECT doctorID,DATEPART(hh,openTime) As OpenHours, DATEPART(hh,closetime) As CloseHours
FROM doctorHours
WHERE day = #CountVar#
AND doctorID='#docID#'
</cfquery>
ValueList
преобразует результаты вашего запроса в список:
<cfset openTimesList = ValueList(doctorHours.OpenHours) />
<cfset closeTimesList = ValueList(doctorHours.CloseHours ) />
ListContains
вернет индекс значения в вашем списке:
<select id="openHours#CountVar#" name="openHours#CountVar#">
<cfloop from="0" to="23" index="OpenHours">
<option value="#openHours#"
<cfif ListContains(openTimesList,OpenHours) NEQ 0 >
selected="selected"
</cfif>
>#OpenHours#</option>
</cfloop>
</select>
Вы можете использовать ту же стратегию для closeTimesList.
Хммм.... количество значений, отображаемых в приведенном выше коде, будет равно числу записей, возвращаемых запросом X 23. Если ваш запрос возвращает 2 записи, вы увидите 46 вариантов и так далее. Похоже, вы верите, что в запросе только 1 запись. Я хотел бы предложить, возможно, у него есть больше.
Попробуйте LIMIT 1 или TOP 1 в своем запросе - или используйте Maxrows (как предложено в комментариях)... но убедитесь, что вы знаете, что вы включаете, а что исключаете. Вы должны знать, почему ваш запрос не соответствует ожиданиям:)