2014-12-03 3 views
0
sel_prod_dt = "select distinct change_app_code, change_number " 
      & " \<cfif NDA_check eq " 
      &'"Y"' 
      &"> FROM db.tb tb" 
      &"\<cfelse\>FROM db.tb2 PC\<\/cfif\>" 

я получаю следующую ошибкукак я оценить Cfif с оператором выбора в строке

ошибки синтаксиса, ожидается что-то вроде имени или Unicode разделителей идентификатора между словом «change_number» и конец запроса.

может кто-нибудь, пожалуйста, помогите мне в этом отношении ..

+0

Вы хотите использовать условие в базе данных или переменной ColdFusion? –

+2

Для справок в будущем вышесказанное недействительно cfml/cfscript. Когда это возможно, вы должны опубликовать [* автономный * случай воспроизведения] (http://www.sscce.org/). Кроме того, всегда включайте свой тип dbms с вопросами SQL. – Leigh

ответ

2

Почему над усложнять?

<cfif NDA_check eq "Y"> 
    sel_prod_dt = "select distinct change_app_code, change_number FROM db.tb tb" 
<cfelse> 
    sel_prod_dt = "select distinct change_app_code, change_number FROM db.tb2 PC" 
</cfif> 
+0

Возможно, NDA_check - это имя столбца в db. Хотя я не уверен. –

+0

Ну, тогда и инструкция sql также неверна;) –

+0

Кто-нибудь еще читает это: Поскольку '' ДОЛЖЕН быть вложенным в cfquery, вы не должны собирать запросы в виде строк. Это просто не правильный способ сделать что-то. Хотя это почти безвредно в запросе, который не содержит переменных, все еще существует небольшой риск и отсутствие выгоды. Не обижайтесь на Оссора. –

6

Нельзя добавить CFML в строку, и они каким-то образом ожидают ее запуска! Строки не обрабатываются до времени выполнения, а код CFML должен быть скомпилирован до его запуска.

Чтение этого следует уточнить «The ColdFusion request/response process»

Таким образом, вы должны иметь полную и синтаксически правильный CFML в файле перед тем он работает.

Вы не дали достаточно подробностей в своем вопросе, чтобы иметь возможность помочь с фактическим кодовым решением для вашей проблемы, но в основном @Ocssor, вероятно, это правильно.

+0

Это похоже на сообщение об ошибке db. Таким образом, можно скомпилировать фактический код *. Однако, даже если это так, код cfml запускается на CF-сервере, а не в базе данных. Поэтому нет смысла вставлять код cfml * внутри * строки SQL. Это может быть причиной ошибки db. Однако, без каких-либо подробностей, это просто догадка. Как сказал Адам, вам нужно предоставить дополнительную информацию. – Leigh

+0

@Leigh О, это def из БД, поскольку строка недействительна SQL. Поскольку OP ожидает, что CFML будет * выполнять *, а не оставаться в строке. –

+0

Дух, я только что понял, что неправильно читаю первую часть вашего комментария, и это то, о чем вы уже говорили.Мне нужно больше кофеина ;-) – Leigh

0

Чтобы использовать условную логику при построении строк, сделайте это шаг за шагом.

sqlString = "select field1, field2 "; 
if (something) { 
sqlString &= ", field3"; 
} 
sqlString &= " rest of the query goes here"; 
2

Сборка запроса SQL динамически (в строку) часто опасно и редко (и когда это, пришло время пересмотреть вещи, и рассмотреть еще раз, если вы все еще думаете, что это). Он также жертвует возможностью использовать критически важный тег cfqueryparam.

Таким образом, вы могли бы сделать что-то вроде этого

<cfquery...> 
    select distinct change_app_code, change_number 
    <cfif NDA_check eq '"Y"'>FROM db.tb tb 
    <cfelse>FROM db.tb2 PC</cfif> 
</cfquery> 

Теперь вот прекрасное время, чтобы использовать Тернарные IFS, они выглядят намного чище

(это значение проверки NDA действительно должен быть "Y" Я не могу сказать, что более вероятно, что он должен быть Y. Вы, возможно, потребуется изменить.)

<cfquery...> 
    select distinct change_app_code, change_number 
    FROM #(NDA_check eq '"Y"' ? "db.tb tb" : "db.tb2 PC")# 
</cfquery> 

троичной МСФ могут быть использованы в строках Li ke Вы пытаетесь сделать:

<cfset myfavcolor = "green"> 
<cfset yourfavcolor "red"> 
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : "different favorite colors")#"> 

Однако они работают на очень простой природе If/else. Единственный путь к другому, если нужно вложить еще один Ternary, если, поэтому они действительно не идеальны для elseifs, особенно для многих elseifs.

<cfset myfavcolor = "green"> 
<cfset yourfavcolor "red"> 
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : (yourfavcolor is not "purple" ? "different favorite colors" : "... I'm not talking to you, you like purple"))#"> 

Для записи мне кажется странным, что вы не пользуетесь табличным псевдонимом. Используя мой пример cfquery сверху.

<cfquery...> 
    select distinct change_app_code, change_number 
    FROM #(NDA_check eq '"Y"' ? "db.tb" : "db.tb2")# theTB 
</cfquery> 

Таким образом, в зависимости от того таблица тянет из, вы можете ссылаться на таблицу (в пределах запроса) в качестве theTB.


Теперь, для некоторых советов.

Если вы чувствуете необходимость загрузки имя таблицы в имя переменной

select * from #thetable# 

Убедитесь, что объем этой переменной. Если это то, что вы установили на странице, установите его, как этот

<cfset variables.thetable = "mytable"> 

и

select * from #variables.thetable# 

Но, как правило, я избегаю сбросив переменную в запрос, если я не могу <cfqueryparam> и имена таблиц не могут быть <cfqueryparam> 'd.

Если я абсолютно необходим, я масштабы этот переменный, как я продемонстрировал, так что я знаю источник, потому что ...

select * from #thetable# 

Может случайно оказаться с источником url.thetable или формы. которая катастрофична и открыта для SQL Injection.


Дополнительных советы, так как вы только начинаете с CF, вы должны начать хорошую (и критически важную) привычку Теперь <cfqueryparam> каждую # переменной # в ИНЕКЕ запросов. Он также должен использоваться для каждой настраиваемой пользователем переменной в запросах на вставку или обновление. Это всегда важно. (К сожалению, вы не можете cfqueryparam динамическое имя таблицы).

Читайте на cfqueryparam здесь: cfqueryparam

Тег может выглядеть longwinded (и это, я никогда не буду знать, о чем думает саман), но это ваша первая линия обороны против SQL Injection.

+0

Это все прекрасно, но на самом деле это не вопрос. –