不使用coldfusion将空白/空字段插入数据库

时间:2014-09-23 19:07:35

标签: mysql coldfusion

如何使用coldfusion 避免将null或空白字段插入数据库?

表单上的输入框是:

 <cfloop index="x" from="1" to="5"> 
 <cfoutput>
  <tr>
    <td><input name="ITIProgramName#x#" type="text" size="50" maxlength="50"  ></td>
    <td><input name="ITIProgVer#x#" type="text" size="50" maxlength="50"  ></td>
  </tr>
 </cfoutput>
 </cfloop> 

行动表格如下:

<cfquery datasource="ITSReporting" name="InsertQuery">
    INSERT INTO ITIPRO
        (   ServerID,
            ServerName,
            <cfif #Form["ITIProgramName#x#"]# neq="">ProgramName,</cfif>
            <cfif #Form["ITIProgVer#x#"]# neq="">CurrentProgVer,</cfif>
            LastUser,
            UpDone  )
VALUES
        (   '#Form.ServerID#',
            '#Form.ServerName#',
            <cfqueryparam value="#Form["ITIProgramName#x#"]#" >,
            <cfqueryparam value="#Form["ITIProgVer#x#"]#" >,
            '#CGI.Auth_User#',
            #CreateODBCDateTime(Now())#
                        )
</cfquery>

如何让数据库不接受空值?用户并不总是需要在所有字段中输入信息。

谢谢!

3 个答案:

答案 0 :(得分:4)

我认为你混淆了一些基本概念:table column versus row/record

执行INSERT命令将始终将新记录添加到db表中。从插入列表中省略几列对此没有任何影响。它只是使数据库将默认值插入到您省略的任何列中。在这种情况下,null

如果您的目标是在这些表单字段为空时跳过整个 INSERT,则需要不同的逻辑。首先检查表单字段的值。仅在填充了至少一个查询时才运行查询。

没有经过测试,但这些方面的内容如下:

<!--- If at least one of the fields is NOT an empty string .. --->
<cfif Form["ITIProgramName#x#"] neq "" OR
      Form["ITIProgVer#x#"] neq "">

     <--- create a new record --->
     <cfquery datasource="ITSReporting" name="InsertQuery">
         INSERT INTO ITIPRO
         (   ServerID
           , ServerName
           , ProgramName
           , CurrentProgVer
           , LastUser
           , UpDone  
         )
         VALUES
         (   
            <cfqueryparam value="#Form.ServerID#" cfsqltype="cf_sql_varchar">
           , <cfqueryparam value="#Form.ServerName#" cfsqltype="cf_sql_varchar">
           , <cfqueryparam value="#Form['ITIProgramName'& x]#" cfsqltype="cf_sql_varchar">
           , <cfqueryparam value="#Form['ITIProgVer'& x]#" cfsqltype="cf_sql_varchar">
           , <cfqueryparam value="#CGI.Auth_User#" cfsqltype="cf_sql_varchar">
           , <cfqueryparam value="#Now()#" cfsqltype="cf_sql_timestamp">
         )
    </cfquery>
</cfif>

值得重申我在你的另一个帖子上发表的一些评论:

  
      
  • 始终对变量查询参数使用cfqueryparam。 (确保指定与目标列匹配的cfsqltype)。 cfqueryparam有助于保护您的数据库   反对sql注入。它还可以在执行时提高性能   正如你所做的那样,多次进行相同的查询。
  •   
  • 为确保数据完整性,请不要忘记将循环包装起来   一个cftransaction。这将确保所有插件成功或失败为一个单元。
  •   

答案 1 :(得分:0)

如果您根本不想插入条件,则需要将条带和值设置为条件。虽然您的DB可能会设置默认值,通常为null,除非您另行指定。

<cfif #Form["ITIProgramName#x#"]# neq "">ProgramName,</cfif>
...
<cfif #Form["ITIProgramName#x#"]# neq ""><cfqueryparam value="#Form["ITIProgramName#x#"]#" >,</cfif>

答案 2 :(得分:0)

如果要插入空值而不是空白,可以使用null

cfqueryparam属性

有多种方法可以做到这一点,但是使用上面的代码可以做到这一点:

ProgramName,
...
<cfif #Form["ITIProgramName#x#"]# neq "">
    <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(Form["ITIProgramName#x#"])#" >
<cfelse>
    <cfqueryparam cfsqltype="cf_sql_varchar" value="" null = "yes" >
</cfif>
,

请注意,我冒昧地修改您的输入,以便空空格计算为空字符串。如果您不想这样,请将其关闭。