1

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

3 回答 3

6

前面的答案是正确的,因为在测试一般字符串时,NULL 检查不适用于 CF。您可以测试长度或值。

这个问题吓到我了,我认为有必要提供一个完整的例子。用户提供数据的查询的每个字段都必须包含在 CFQUERYPARAM 中。查找术语“ sql 注入”以了解原因。

此查询应该适合您:

<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() 函数的结果。

于 2012-08-02T14:55:01.180 回答
2

如果您的意思是希望在表单字段为空时跳过插入,trim()请先检查长度。如果长度为 0,则跳过插入:

 <cfif len(trim(form.TBCom))>
      not empty. do the insert ...
 </cfif>

顺便说一句,您不需要cfoutputcfquery. 变量将被自动评估。此外,您应该cfqueryparam在所有用户提供的参数上使用(请参阅 Mike 的答案以获取示例)并确保您的变量范围,即form.TBCom不仅使用TBCom.

于 2012-08-01T18:56:46.537 回答
0

上面的代码不会在指定的 3 列(uniqueNum、comTyp 和注释)中插入空值。它将插入空字符串 - 这与 NULL 不同。

另外 - 我同意 Leigh 的观点,正确的语法应该是:

   <cfquery name="TestTBComm" datasource="TrenaTest">
        INSERT INTO Comment1 (
            UniqueNum,
            ComTyp,
            Comments )
        VALUES (
           '#UniqueNum#',
           '#TBComV#',
           '#TBCom#'
           )
    </cfquery>

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

于 2012-08-01T22:06:08.040 回答