我没有输入任何内容时插入空记录

时间:2012-08-01 17:44:00

标签: coldfusion null cfquery

我正在尝试首先检查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>

3 个答案:

答案 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>

那么......这些空值出现在哪里?如果它们位于数据库的其他列中(这不是此查询的一部分),那是因为您没有插入这些列,并且它们被设置为“允许空值”并且没有“默认”值。