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\>"
我收到以下错误
语法错误,在单词&#39; change_number&#39;之间需要类似名称或Unicode分隔符的标识符。和请求的结束。
在这方面,有谁可以帮助我..答案 0 :(得分:6)
无法将CFML添加到字符串中,并且它们会以某种方式期望它运行!字符串直到运行时才被处理,CFML代码需要在它运行之前进行编译。
阅读此内容应该澄清&#34; The ColdFusion request/response process&#34;
因此,在运行之前,您需要在文件中使用完整且语法正确的CFML。
您的问题中没有提供足够的详细信息,无法为您的问题提供实际的代码解决方案,但基本上@Ocssor可能已经做对了。
答案 1 :(得分: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>
答案 2 :(得分: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>
现在是使用Ternary Ifs的好时机,它们看起来更清洁了
(NDA检查的值确实应该是"Y"
我无法分辨,更可能的是,它应该是Y
。您可能需要更改它。)
<cfquery...>
select distinct change_app_code, change_number
FROM #(NDA_check eq '"Y"' ? "db.tb tb" : "db.tb2 PC")#
</cfquery>
三元IF可以像你想要的那样用在字符串中:
<cfset myfavcolor = "green">
<cfset yourfavcolor "red">
<cfset DoWeAgree = "We have #(myfavcolor is yourfavcolor ? "the same favorite color" : "different favorite colors")#">
但是,它们的运行方式非常简单。唯一的办法就是如果要嵌套另一个三元组,那么它们对于其他的非常不理想,特别是很多其他的。
<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>
这样,无论从哪个表中提取,您都可以将表(在查询中)引用为TB。
现在,提出一些建议。
如果您觉得需要将表名加载到变量名
select * from #thetable#
确保范围该变量。如果是您在页面中设置的内容,请将其设置为
<cfset variables.thetable = "mytable">
和
select * from #variables.thetable#
但是,作为一项规则,如果我不能<cfqueryparam>
且表名不能<cfqueryparam>
',我就不会将变量放入查询中。
如果我绝对必须,我会对该变量进行调整,正如我演示的那样,以便我知道源,因为......
select * from #thetable#
可能会意外地获得url.thetable或form.thetable的来源,这是一个灾难性的并且对SQL注入开放。
更多建议,因为你刚刚开始使用CF,你应该在查询的where子句中的每个#variable#中开始一个好的(而且非常重要的)习惯<cfqueryparam>
。它还应该用于插入或更新查询中的每个用户可配置变量。这样做总是很重要。 (很遗憾,你不能cfqueryparam一个动态表名。)
在此处阅读cfqueryparam:cfqueryparam
标签可能看起来很长(事实上,我永远不会知道adobe在想什么),但它是你对SQL Injection的第一道防线。
答案 3 :(得分:0)
要在构建字符串时使用条件逻辑,请一步一步。
sqlString = "select field1, field2 ";
if (something) {
sqlString &= ", field3";
}
sqlString &= " rest of the query goes here";