【问题标题】:Update SQL with checkbox values使用复选框值更新 SQL
【发布时间】:2015-03-12 02:38:45
【问题描述】:

我可以显示来自 SQL 查询的复选框状态,但我无法更新它们。我使用位作为数据类型。我很确定问题出在我使用 cfif 测试复选框值的方式上。如果我将它们注释掉,我在表中的任何值都会被 cfparam 默认值覆盖,并且我会在操作页面上收到我的小确认消息。我已经尝试过 cfif、cfif isDefined 等。自上周以来我一直在阅读和研究这个问题,但似乎无法理解它。这是来自我的测试服务器的示例代码:(仅供参考,我正在使用相同的操作页面来查看和更新​​记录。)

<cfif isDefined ("form.update")>

<cfparam name="checkbox1" default=0>
<cfparam name="checkbox2" default=0>
<cfparam name="checkbox3" default=0>
<cfparam name="checkbox4" default=0>


<cfif #form.chkbox1# EQ checked>
<cfset checkbox1=1>
</cfif>

<cfif IsDefined (form.chkbox2)>
<cfset checkbox2=1>
</cfif>

<!--- <cfif IsDefined (form.chkbox3)>
<cfset checkbox3=1>
</cfif>

<cfif IsDefined (form.chkbox4)>
<cfset checkbox4=1>
</cfif> --->

<cfquery name="update" datasource="HHSCIntra">

    UPDATE tbl_checkbox
    SET chkbox1 = #checkbox1#, chkbox2=#checkbox2#, chkbox3=#checkbox3#, chkbox4=#checkbox4#
    WHERE RecID = #user#

</cfquery>

<cfoutput>Record number: #user# Updated.</cfoutput>

<cfelse>

<cfquery name="checkboxview" datasource="HHSCIntra">

    SELECT * FROM tbl_checkbox WHERE RecID = #form.nameselect#

</cfquery>

<cfif #checkboxview.chkbox1# EQ 1>
<cfset chkbox1checked="yes">
<cfelse>
<cfset chkbox1checked="no">
</cfif>

<cfif #checkboxview.chkbox2# EQ 1>
<cfset chkbox2checked="yes">
<cfelse>
<cfset chkbox2checked="no">
</cfif>

<cfif #checkboxview.chkbox3# EQ 1>
<cfset chkbox3checked="yes">
<cfelse>
<cfset chkbox3checked="no">
</cfif>

<cfif #checkboxview.chkbox4# EQ 1>
<cfset chkbox4checked="yes">
<cfelse>
<cfset chkbox4checked="no">
</cfif>

<cfform action="checkboxaction.cfm" method="post">

<cfoutput query="checkboxview">#name#</cfoutput>

<cfinput name="user" type="hidden" value="#checkboxview.RecID#"><br>


        Checkbox 1: <cfinput type="checkbox" name="chkbox1" checked="#chkbox1checked#" value=1><br>
        Checkbox 2: <cfinput type="checkbox" name="chkbox2" checked="#chkbox2checked#" value=1><br>
        Checkbox 3: <cfinput type="checkbox" name="chkbox3" checked="#chkbox3checked#" value=1><br>
        Checkbox 4: <cfinput type="checkbox" name="chkbox4" checked="#chkbox4checked#" value=1><br>

<br>

<cfinput type="submit" name="update" value="Update">

</cfform>

</cfif>

马哈洛

【问题讨论】:

  • 复选框应该从您的表单中返回为“打开”。无论您为变量检查设置什么值,都不能“打开”。同时抛弃 cfinput 和 cfform 并使用常规的表单和输入标签。
  • 这是因为您为 cfparam 语句和复选框字段使用了不同的名称。所以你没有分配默认值 - 你实际上是在创建全新的变量。名称必须匹配。
  • 另外,还有很多地方可以清理/改进代码。您可能希望将其发布到 codereview 以获得一些反馈。

标签: sql checkbox coldfusion


【解决方案1】:

我的偏好是使用 cfparam,如:

<cfparam name="form.chkbox1" default="0" overwrite="false" />

然后在你的cfquery中使用变量的值:

SET chkbox1 = <cfqueryparam value="#form.chkbox1#" cfsqltype="CF_SQL_BIT" />

如果选中,您的视图会将值设置为 1。如果不勾选,则不会在表单范围内传递。

【讨论】:

  • (编辑)同意范围变量。 (虽然每次都获得默认值的原因是因为输入字段的名称与 cfparam 语句中使用的名称不匹配,即 chkbox1checkbox1。)范围和 cfqueryparam +1。
  • 谢谢,试图让史蒂夫的答案工作,但冷聚变会在 cfparam 标签上抛出各种错误。标签 CFPARAM 的属性验证错误。它不允许属性 VALUE。有效属性为 DEFAULT、MAX、MIN、NAME、PATTERN、TYPE。测试服务器是ColdFusion 9,9不支持这些属性吗?还在 cfsqltype 属性上引发了错误。它在 View 上抛出错误,不知道为什么会这样做,因为所有代码都嵌套在 cfif isDefined form.update 标记中。当我单击查看时,不应该跳过所有代码吗?马哈洛。
  • 这行得通: 我是不是误解了史蒂夫的回答?
  • 我想部分是,我回答了关于 cfif 标签内代码的问题。显然,ColdFusion 在打开页面时会检查页面上的代码,无论它是否正在执行。我还有一个问题。用于此的生产应用程序使用 cfinserts 和 cfupdates 而不是 cfqueries。这些复选框只是对现有应用程序的补充。我应该尝试将复选框合并到现有的 cfupdate 和 cfinsert 中,还是在 cfquery 中单独处理它们?马哈洛
  • 再看看史蒂夫的例子​​。它不对cfparam 语句使用“值”。您可能混淆了cfparamcfqueryparam。两者完全不同。 cfqueryparam 用于保护您的数据库查询免受 sql 注入。看来您可能是 CF 的新手。如果是这样,我建议先阅读the documentation。还有一些不错的介绍网站,例如learncf.com
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2014-11-27
  • 2016-04-25
相关资源
最近更新 更多