在 ColdFusion 中,属性值周围的单引号和双引号有什么作用



例如 #Trim(FORM.fromfirstname)#周围的"做什么?我正在添加<cfqueryparam...>标签,想知道是否仍然需要引号?

<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)#"

所以如果他们已经在那里,我会离开他们吗?

SQL 需要字符串的引号。

引号是标准SQL语法的一部分,用于表示字符串(实际上它们几乎在每种语言中都是如此)。

如果它没有引号,那么SQL解析器将不知道字符串在哪里结束,SQL继续。

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

还要记住,#hashes# 与 SQL 无关 - 它们完全在 CFML 方面。运行 cfquery 标记时,CF 计算正文(包括它包含的任何哈希表达式)以创建一个 SQL 字符串,然后将其传递给数据库(以及其他设置/参数/等)。SQL 服务器不知道该字符串的哪些部分是硬编码的,哪些部分可能是从哈希中计算的。


cfqueryparam 不需要引号。

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

在 cfqueryparam 标签中,是否对属性使用引号没有区别 - 这三个都产生相同的结果:

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

如果您使用的是<cfqueryparam>那么永远不需要使用引号。

如果你在SQL中比较一个字符串(而不是使用<cfqueryparam>),那么你需要使用引号。如果您正在与数字进行比较(并且不使用<cfqueryparam>),那么您不需要引号。

如果不使用 queryparam 标签,字符串仍然需要引号,并且应尽可能对查询中的任何变量使用 queryparams。

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

我知道

这很乏味,但是如果您在将变量插入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#

相关内容

  • 没有找到相关文章

最新更新