代码之家  ›  专栏  ›  技术社区  ›  Gary Stanton

简单的ColdFusion脚本可以在IE中使用,但不能在Firefox中使用?

  •  4
  • Gary Stanton  · 技术社区  · 17 年前

    我有一个非常简单的脚本,可以更改MySQL数据库中某个项目的状态-在IE7中它可以正常工作,但是如果我在Firefox中尝试它,它看起来可以工作,但是没有……这是非常奇怪的。

    代码非常简单-首先我得到我要查找的记录的详细信息:

    <cfscript>
    // Get the Product Attribute details
    Arguments.qGetProductAttribute = Application.cfcProducts.getProductAttributes(Arguments.iProductAttributeID);
    </cfscript>
    

    这很好,如果我转储结果,它只是记录的内容,如预期的那样。因此,我使用if语句将“active”字段从1更改为0,反之亦然。

    <!--- If Product Attribute is active, mark as inactive --->
    <cfif Arguments.qGetProductAttribute.bActive EQ 0>
        <cfquery name="qChangeStatus" datasource="#Request.sDSN#">
        UPDATE  tblProductAttributes
        SET     bActive = <cfqueryparam value="1" cfsqltype="CF_SQL_INTEGER" maxlength="1" />
        WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
        </cfquery>
    
    <!--- Else if Product Attribute is inactive, mark as active --->
    <cfelseif Arguments.qGetProductAttribute.bActive EQ 1>
        <cfquery name="qChangeStatus" datasource="#Request.sDSN#">
        UPDATE  tblProductAttributes
        SET     bActive = <cfqueryparam value="0" cfsqltype="CF_SQL_INTEGER" maxlength="1" />
        WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
        </cfquery>
    </cfif>
    

    我看不出有什么理由不起作用…实际上,在IE7中,它工作得很好…

    运行此脚本后,浏览器将返回显示所有这些记录的页面。对于每个记录,如果“bactive”字段设置为“1”,它将显示单词“active”,如果设置为“zero”,它将显示“disabled”。 足够简单。

    如果我运行脚本来禁用记录,firefox会按预期显示单词“disabled”,但数据库记录不会更改!

    我不知所措…服务器端代码如何在一个浏览器中而不是在另一个浏览器中正常工作?!

    6 回复  |  直到 17 年前
        1
  •  3
  •   Re0sless    17 年前

    您是否100%确定数据库记录不会更改?如果火狐两次调用脚本,一次在页面呈现之前,一次在页面呈现之后,您可能会受到这种影响。

    因此,产品被设置为禁用,然后在页面发送到浏览器后,它将再次更新(因为它已经被禁用,所以它将被重新启用)。

    如果您已经向数据库中添加了最后一个更新字段,并在每次修改产品时更新该字段,那么您就可以知道情况是否如此。

    编辑:响应下面的评论,一个快速+肮脏的修复方法是首先检查最后一个更新时间戳,如果它在当前时间的n秒内取消更新。

    你有没有火狐中的插件可以重新调用页面?也许是为了开发?一个简单的测试,看看它是你的脚本还是火狐中的一个怪癖,就是用post方法把你的get url改成一个表单,因为浏览器/插件不应该重新调用post请求。

        2
  •  3
  •   Gary Stanton    17 年前

    我找到了问题的原因…萤火虫。

    我一点都不知道Firebug认为它在做什么,如果我从脚本中删除“cflocation”标记(将用户带回摘要页的标记),那么它就可以正常工作。但是如果我把它放在里面,Firebug似乎在将浏览器转发到摘要页之前再次运行了这个函数。

    没有理由这样做。 难以置信。

    至少不会发生在客户的机器上。

        3
  •  2
  •   Brian Sadler    17 年前

    您发布的代码并不是导致错误的原因,因为它都是服务器端代码——其中的客户机上没有发生任何事情。

    我将打开CF调试(包括数据库活动),并在结束标记之后和任何重定向回产品视图页面之前粘贴一个标记。运行代码并查看SQL调试输出。

    我的猜测是,当使用Firefox时,包含查询的代码块不会被调用。

        4
  •  2
  •   ale    17 年前

    这可能是浏览器缓存问题。直接的CF代码不可能受到正在使用的浏览器的影响。如果刷新显示产品的页面,会发生什么情况?您还需要直接查看数据库,以查看值是否正在更改。

    在一点切线上,你可以用一点简单的数学来消除对if语句的需求。

    <cfquery name="qChangeStatus" datasource="#Request.sDSN#">
        UPDATE  tblProductAttributes
        SET
             bActive = <cfqueryparam value="#val(1 - Arguments.qGetProductAttribute.bActive)#" cfsqltype="CF_SQL_INTEGER" maxlength="1" />
        WHERE   
            iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
    </cfquery>
    
        5
  •  0
  •   user22708    17 年前

    尝试删除SQL代码中WHERE子句末尾的分号。

    WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
    
        6
  •  0
  •   frank    17 年前

    所有这些不同的答案,没有一个对我有用。我不得不去另一个论坛,有人说它是火狐中的Skype扩展插件,它会导致ColdFusion数据库疯狂或无法运行。我卸载了Skype扩展(谢谢,Skype),一切都恢复正常。希望这对其他人也有用。

    推荐文章