2012-08-01 95 views
1

我想首先检查空值,如果值为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

您的检查发生在cfif空吗? – 2012-08-01 18:18:23

+0

我想通了。谢谢 – trlewis 2012-08-01 18:56:37

+2

与你的问题没有任何关系,但是你使用带有静态值而不是'VALUES'子句的'SELECT'的任何原因?还是有更多的查询比发布? – Leigh 2012-08-01 19:02:16

回答

2

如果你的意思是你想先跳过插入当表单字段为空,trim()并检查长度。然后跳过插入如果长度为0:

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

顺便说一句,你不需要cfquery周围cfoutput标签。变量将被自动评估。此外,您应该在所有用户提供的参数(see Mike's answer for an example)上使用cfqueryparam,并确保范围变量,即使用form.TBCom而不仅仅是TBCom

+0

谢谢。我会尝试删除cfoutput标签,看看会发生什么。我从来没有使用过cfqueryparam,所以我不得不做一些调查。我目前正在检查len,但是,我也会执行len(trim(form.TBCom),看看会发生什么 – trlewis 2012-08-02 13:02:11

+0

上面的代码检查'value'而不是'length',这是不同的。我假设你的意思是“空字符串”而不是'null',正如马克提到的那样是一个不同的概念。 – Leigh 2012-08-02 13:12:33

0

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

而且 - 我与雷同意,正确的语法应为:

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

所以......哪里这些零点出现?如果他们在数据库中的其他列(这不是这个查询的一部分),这是因为你没有插入到这些列中,他们被设置为“允许空值”并且没有“默认”值。

+0

嗯,我相信我必须检查空字符串和空字符串,唯一的办法是检查两者。 – trlewis 2012-08-02 13:15:42

+0

两者都是什么意思?因为一般来说CF并不像数据库那样有'null'这个概念。 – Leigh 2012-08-02 13:18:34

+0

好的,除了cfqueryparam外,我做了所有人都推荐的东西,一切都很成功。 。 – trlewis 2012-08-02 15:02:55

6

以前的答案是正确的,因为在测试通用字符串时,NULL检查不适用于CF.您要么测试长度或价值。

该查询令我害怕,我认为一个完整的例子是必要的。必须将其数据由用户提供的查询的EVERY字段包含在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> 

在空参数,请注意,这倒数的LEN()函数的结果“!”。

+1

同意关于cfqueryparam。虽然他们可能需要调整cfsqltypes。目前还不清楚“UniqueNum”列是数字还是字符串。该名称暗示数字,但该值在原始示例中引用。所以它可以用任何方式:) – Leigh 2012-08-02 15:59:26

+0

是的,Leigh ...我应该说明我对数据类型的假设。谢谢。 – 2012-08-03 16:04:05

+0

迈克 - 我喜欢那个“!len(form.tbcomv)”的例子......我总是最终为此写了一个函数。从未想过将评估操作数添加到它。太好了! – 2012-08-06 14:47:39

相关问题