我正在尝试首先检查NULL,如果值为NULL,则跳过INSERT
。但这不是正在发生的事情。即使我没有在表单字段中输入任何内容,代码也会插入NULL记录。这几乎就像是在认识到不存在的东西。
<cfoutput>
<cfif form.TBCom is not "">
<cfquery name="TestTBComm" datasource="TrenaTest">
INSERT INTO Comment1 (
UniqueNum,
ComTyp,
Comments )
SELECT
'#UniqueNum#',
'#TBComV#',
'#TBCom#'
</cfquery>
</cfif>
</cfoutput>
答案 0 :(得分:6)
之前的答案是正确的,因为在测试一般字符串时,NULL检查不适用于CF.您可以测试长度或值。
那个查询吓到我了,我觉得有必要提供一个完整的例子。必须将用户提供数据的查询的每个字段都包含在CFQUERYPARAM中。查找“sql injection”一词的原因。
此查询应该适合您:
<cfquery name="TestTBComm" datasource="TrenaTest">
INSERT INTO Comment1 (
UniqueNum,
ComTyp,
Comments )
VALUES (
<cfqueryparam cfsqltype="cf_sql_integer" value="#FORM.UniqueNum#">
, <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.TBComV#" NULL="#!Len(FORM.TBComV)#">
, <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.TBCom#" NULL="#!Len(FORM.TBCom)#">
)
</cfquery>
在NULL参数中,注意“!”,它反转LEN()函数的结果。
答案 1 :(得分:2)
如果您的意思是希望在表单字段为空时跳过插入,请先trim()
,然后检查长度。如果长度为0,则跳过插入:
<cfif len(trim(form.TBCom))>
not empty. do the insert ...
</cfif>
另外,cfoutput
周围不需要cfquery
个标签。变量将自动评估。此外,您应该对所有用户提供的参数cfqueryparam
使用see Mike's answer for an example,并确保对变量进行调整,即使用form.TBCom
而不仅仅是TBCom
。
答案 2 :(得分:0)
上面的代码不会在指定的3列中插入空值(uniqueNum,comTyp和comments)。它会插入空字符串 - 这与NULL不同。
另外 - 我同意Leigh的正确语法应该是:
<cfquery name="TestTBComm" datasource="TrenaTest">
INSERT INTO Comment1 (
UniqueNum,
ComTyp,
Comments )
VALUES (
'#UniqueNum#',
'#TBComV#',
'#TBCom#'
)
</cfquery>
那么......这些空值出现在哪里?如果它们位于数据库的其他列中(这不是此查询的一部分),那是因为您没有插入这些列,并且它们被设置为“允许空值”并且没有“默认”值。