如何使用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>
如何让数据库不接受空值?用户并不总是需要在所有字段中输入信息。
谢谢!
答案 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>
,
请注意,我冒昧地修改您的输入,以便空空格计算为空字符串。如果您不想这样,请将其关闭。