2012-06-26 69 views
3

例如#Trim(FORM.fromfirstname)#附近的“”是做什么的?我正在添加<cfqueryparam...>标签,并且想知道引号是否仍然需要?在ColdFusion中,属性值的单引号和双引号是做什么用的?

<CFQUERY NAME="account" DATASOURCE="#APPLICATION.centralDSN#"> 
    SELECT * 
    FROM users 
    WHERE (firstname =<CFQUERYPARAM VALUE="#Trim(FORM.fromfirstname)#">) 
     AND (lastname = <CFQUERYPARAM VALUE="#Trim(FORM.fromlastname)#">) 
     AND (email = '#Trim(FORM.fromemail)#') 
</CFQUERY> 

这里有一个不使用引号为WHERE条款:

<CFIF getUser.RecordCount> 
    <CFQUERY NAME="cUser" DATASOURCE="#APPLICATION.centralDSN#"> 
     UPDATE users 
      SET mailing_list = <CFIF IsDefined("FORM.mailing_list")>#FORM.mailing_list#<CFELSE>0</CFIF> 
     WHERE user_id = #getUser.user_id# 
    </CFQUERY> 
</cfif> 

编辑:如果他们没有做任何事情,有一个在让他们没有伤害,对不对?在另一个文件中,我发现像

to="#ListFirst(EnglishEmailList)#" 
    cc="#ListRest(EnglishEmailList)#" 

例子所以,如果他们已经在那里我会留下来?

回答

10

SQL需要字符串的引号。

行情是标准的SQL语法来表示一个字符串的一部分(如他们确实在几乎所有语言)。

如果没有报价那么SQL解析器将有不知道那里的字符串结束,SQL继续。

引号对于数字不是必需的 - 对于值的结束位置没有歧义。

也要记住,#哈希#是无关的SQL - 他们是完全在CFML侧。当运行cfquery标记时,CF会评估正文(包括它包含的所有哈希表达式)以创建一个SQL字符串,然后将其传递给数据库(以及其他设置/参数/ etc)。 SQL服务器不知道该字符串的哪些部分是硬编码的,哪些部分可能是通过散列进行评估的。


cfqueryparam不需要引号。

当您修复查询以使用cfqueryparam时,您正在创建参数,并且该标记将处理向SQL数据库指示字符串/ etc所需的所有内容。 (你永远需要包裹cfqueryparam标签本身放在引号)。

内cfqueryparam标签,这让零差价无论是否使用引号的属性 - 这三个都产生相同的结果:

<cfqueryparam value="#var#" /> 
<cfqueryparam value='#var#' /> 
<cfqueryparam value=#var# /> 
5

如果你使用<cfqueryparam>那么你永远不会需要使用引号。

如果您要比较的SQL字符串(而不是使用<cfqueryparam>),那么你需要使用引号。如果你正在比较一个数字(而不是使用<cfqueryparam>),那么你不需要报价。如果你不使用queryparam标签

3

的报价仍需要串,每当有可能,你应该在查询中使用queryparams任何变量。

不使用该功能会为SQL注入创建一个可能的攻击点,并且几乎是一个滥用请求。

2

我知道它很单调乏味,但是如果您在清理变量之前将其插入到SQL语句中,则会更容易理解和阅读。

这是我怎么会这样写:

// manipulate and rescope variables as required here 
// no quotes or pound signs necessary when when not outputting 
<cfset VARIABLES.FirstName = Trim(FORM.fromfirstname)> 
<cfset VARIABLES.LastName = Trim(FORM.fromlastname)> 
<cfset VARIABLES.Email  = Trim(FORM.fromemail)> 

// stop sql inject ~ use cfqueryparam 
// simplifying your sql statement will make it much easier to diagnose problems 
<CFQUERY NAME="account" DATASOURCE="#APPLICATION.centralDSN#"> 
    SELECT * 
    FROM users 
    WHERE firstname = <CFQUERYPARAM cfqltype='cf_sql_varchar' VALUE="#VARIABLES.FirstName#"> 
     AND lastname = <CFQUERYPARAM cfqltype='cf_sql_varchar' VALUE="#VARIABLES.LastName#"> 
     AND email = <CFQUERYPARAM cfqltype='cf_sql_varchar' VALUE="#VARIABLES.Email#"> 
</CFQUERY> 

在下面的SQL语句的WHERE条款,你输出一个整数,所以没有引号是必要的。

WHERE user_id = #getUser.user_id# 

当然,这很容易搞砸你的数据库。使用cfqueryparam并保存你的工作......

WHERE user_id = <CFQUERYPARAM cfqltype='cf_sql_integer' VALUE="#VARIABLES.user_id#"> 

而不是做你的SQL语句中的IF/ELSE登录,之前做到这一点,是这样的:

<cfif isDefined("FORM.mailing_list")> 
    <cfset VARIABLES.mailing_list = trim(FORM.mailing_list)> 
<cfelse> 
    <cfset VARIABLES.mailing_list = 0> 
</cfif> 

UPDATE users 
SET mailing_list = <cfqueryparam cfsqltype="cf_sql_varchar" value="#VARIABLES.mailing_list#"> 
WHERE user_id = #getUser.user_id# 
+0

哦,相信我,我是不是一个人写这个代码,这是一个阅读屁股的痛苦。我现在正在处理的文件至少从1999年开始就已经存在,并且在我开始工作之前有5个人。 – Celeritas

相关问题