例如 #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#