2016-08-31 9 views
2

Я пытаюсь обернуть свою голову вокруг сделок объединения, mysql и coldfusion. Следующий запрос работает без последнего условия.Coldfusion CFQUERY w/Inner Join & Dateformat не работает

 <cfquery name="GetWeekends"> 
     SELECT w.id, w.weekend_type, w.community_id, w.start_date, w.end_date, 
      w.language, 
      c.community_id, c.location, c.language, c.state, c.country 
     FROM _weekends w 
     INNER JOIN _communities c 
     ON w.community_id=c.community_id 
     WHERE w.weekend_type = 1 AND w.start_date > Now() AND   
     #DateFormat(w.start_date, "m")# = '#form.home_by_month#' 
     ORDER BY w.start_date ASC 
     </cfquery> 

Он умирает на

#DateFormat(w.start_date, "m")# 

говорит мне переменную [W] не существует. К сожалению, я учусь, как я иду сюда ...

+0

Под «умиранием» это означает, что он приходит с ошибкой? –

+0

Да, «переменная [W] не существует» – mck

+2

Кроме того, я настоятельно рекомендую использовать параметр cfquery для дезинфекции вашей переменной. Я уверен, что в теге запроса вам не нужны octothorps, но прошло более года с тех пор, как я работал cfquery. –

ответ

8

Проблема здесь в том, что DateFormat() функция ColdFusion, и которые не могут быть применены MySQL «переменная» (w). Вам нужно использовать функцию MONTH() для MySQL и передать дату в нее.

Не забудьте очистить входные данные формы, вы очень восприимчивы к SQL-инъекции. Используйте cfqueryparam так:

MONTH(w.start_date) = <cfqueryparam cfsqltype="cf_sql_integer" value="#form.home_by_month#" /> 
0

Рабочий раствор, благодаря Стерлинг Арчер:

<cfquery name="GetWeekends"> 
    SELECT w.id 
      , w.weekend_type 
      , w.community_id 
      , w.start_date 
      , w.end_date 
      , w.language 
      , c.community_id 
      , c.location 
      , c.language 
      , c.state 
      , c.country 
    FROM _weekends w INNER JOIN _communities c ON w.community_id = c.community_id 
    WHERE w.weekend_type = 1 
    AND w.start_date > Now() 
    AND MONTH(w.start_date) = '#form.home_by_month#' 
    ORDER BY w.start_date ASC 
</cfquery> 
+1

Если это ваше решение, вы должны принять совет Стерлинга, также используя 'cfqueryparam'. Всегда всегда используйте 'cfqueryparam' при отправке параметров в запрос базы данных. – beloitdavisja

+0

Кроме того, фильтрация по месяцам, а не году может привести к неожиданным результатам. –

+0

Кроме того, если вы ищете записи для определенного месяца * и * года, подумайте об использовании [этой парадигмы] (http://stackoverflow.com/questions/13666883/date-comparison-in-ms-sql-2005/ 13687006 # 13687006), что является более гибким - не говоря уже о дружественном индексе - чем использование 'Month()'. – Leigh

3

(слишком долго для комментариев ...)

Поскольку вы упомянули быть новым для CF, немного фона на том, как CF обрабатывает запросы к базе данных может помочь понять, почему произошла ошибка и какие типы вещей вы можете (и не можете) делать внутри cfquery.

Хотя CF может связываться с движком базы данных, эти два полностью разделены и говорят на разных языках. Тот факт, что вы можете смешивать CFML и SQL в теге cfquery, дает ошибочное впечатление о том, что функции CF могут работать с объектами базы данных (или наоборот). Они не могут. Сервер CF ничего не знает о объектах базы данных (и механизм базы данных не понимает CFML). Любой CFML-код в теге запроса обрабатывается первый - на сервере CF. Сгенерированный SQL затем отправляется в механизм базы данных и выполняется отдельно.

Когда сервер CF встречает запрос к базе данных, он анализирует содержимое тега, ищет CFML переменные или выражения, которые должны быть оценены, а именно:

SELECT Column FROM Table WHERE ColA = '#form.someField#' AND ColB = '#form.otherField#' 

Затем преобразует эти переменные и выражение в буквенные значения, т.е. строки, числа и т. д. Наконец, CF руки SQL строки в генерируется от ядра базы данных для выполнения, а именно:

SELECT Column FROM Table WHERE ColA = 'John Smith' AND ColB = 'ABC' 

Так что причина CF дроссели на #DateFormat(w.start_date, "m")#, что она не понимает, w.start_date ссылается на столбец базы данных. Он считает, что это имя переменной CF: в частности структура с именем «w», содержащая ключ «start_date». Очевидно, что таких переменных нет. Отсюда неопределенная ошибка.

+0

Это очень хорошее объяснение того, как языковые переменные и переменные базы данных сосуществуют в запросе. (Кроме того, привет Ли!) –

+0

Спасибо, Стерлинг. В * некоторых * способах он аналогичен смешиванию клиента (JS) и кода на стороне сервера (CF) внутри одного и того же сценария. Просто потому, что вы можете их смешивать, не означает, что CF-сервер может выполнять код на стороне клиента, или наоборот ;-) – Leigh

+1

Спасибо, Ли ... ОЧЕНЬ полезно !!!! – mck