2014-12-03 65 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\>" 

我碰到下面的错误评估与SELECT语句中的CFIF我如何在一个字符串

语法错误,期望像一个名称或一个Unicode分隔单词“change_number”和之间的标识请求结束。

任何人都可以请帮我在这方面..

+0

你想在数据库或ColdFusion变量上使用if条件吗? – 2014-12-03 11:41:44

+2

以供参考,以上是无效的cfml/cfscript代码。在可能的情况下,您应该发布一个[*自包含的* repro案例](http://www.sscce.org/)。另外,总是包含你的dbms类型和SQL问题。 – Leigh 2014-12-03 13:49:13

回答

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中的列名。但我不确定。 – 2014-12-03 11:56:21

+0

那么,那么sql语句也是错误的;) – 2014-12-03 11:59:13

+0

其他人读这个:因为''必须嵌套在一个cfquery中,你不应该把查询组装成字符串。这根本不是正确的做事方式。虽然在不包含变量的查询中几乎无害,但风险仍然很小,并且没有收益。奥索尔没有冒犯性。 – 2014-12-04 07:23:20

6

一个不能添加CFML到一个字符串,他们以某种方式期望它运行!直到运行时才会处理字符串,并且CFML代码在运行之前需要进行编译。

阅读这应该澄清“The ColdFusion request/response process

所以你需要运行之前已经完成,语法正确CFML在文件

在您的问题中,您没有提供足够的细节来帮助您解决问题的实际代码解决方案,但基本上@Ocssor可能是正确的。

+0

这看起来像一个数据库错误消息。所以实际的代码可能会编译。但是,即使这样做,cfml代码也会在CF服务器上运行,而不是在数据库中运行。所以在一个SQL字符串中嵌入cfml代码*是没有意义的。这可能是导致数据库错误的原因。然而,没有更多的细节,这只是一个猜测。正如亚当所说,你需要提供更多信息。 – Leigh 2014-12-03 13:41:47

+0

@Leigh哦,它是从数据库中定义的,因为字符串不是有效的SQL。因为OP期望CFML执行*,所以不要留在字符串中。 – 2014-12-03 13:52:02

+0

Duh,我刚刚意识到我误解了你评论的第一部分,这就是你的意思。我需要更多的咖啡因;-) – Leigh 2014-12-03 13:57:48

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> 

三元国际单项体育联合会在字符串里使用ke您正在尝试:

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

但是,它们在非常简单的If/else性质上运行。唯一的办法是如果嵌套另一个Ternary,那么它们对于其他ififs尤其不是很理想,特别是其他很多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> 

这样,无论从哪个表中抽取,都可以引用该表(在查询中)作为TB。


现在,对于一些建议。

如果你觉得需要加载一个表名到一个变量名

select * from #thetable# 

确保范围变量。如果它的东西,你的页面设置,设置像这样

<cfset variables.thetable = "mytable"> 

select * from #variables.thetable# 

但是,作为一项规则,我落下一个变量到查询走就走,如果我不能<cfqueryparam>而表名不能是<cfqueryparam>'d。

如果我绝对必须,我作用域的变量,因为我证明,让我知道源,因为......

select * from #thetable# 

可能凑巧用的url.thetable或形式的源告终。该表对SQL注入来说是灾难性的和开放的。


更多的建议,因为你只是CF起步,你应该开始一个很好的(和极为重要的)习惯现在<cfqueryparam>每#变量#你的查询的where子句。它也应该用于插入或更新查询中的每个用户可配置变量。这样做总是很重要的。 (不幸的是,你不能使用cfqueryparam一个动态表名)。

阅读上cfqueryparam这里:cfqueryparam

标签可以看冗长的(并且是,我永远也不会知道是什么土坯的想法),但它是你对SQL Injection的第一道防线。

+0

这很可爱,但它并没有真正解决实际问题。 – 2014-12-05 07:09:18