4

我有一个非常简单的脚本,可以更改 MySql 数据库中项目的状态 - 它在 IE7 中运行良好,但如果我在 Firefox 中尝试它,它看起来很有效,但没有......这是非常奇怪的。

代码非常简单 - 首先我得到了我正在寻找的记录的详细信息:

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

这工作正常,如果我转储结果,它只是预期的记录内容。因此,我使用 if 语句将“活动”字段从 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”,如果设置为“零”,它将显示“Disabled”。很简单。

如果我运行脚本来禁用记录,Firefox 实际上会按预期显示“禁用”一词,但数据库记录不会改变!

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

4

6 回答 6

3

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

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

如果您已将最后更新字段添加到数据库并在每次修改产品时更新,那么您将能够判断是否是这种情况。

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

Firefox 中是否有任何可能重新调用页面的插件?也许出于开发目的?一个简单的测试,看看它是你的脚本还是 Firefox 中的一个怪癖,是将你的 get url 更改为带有 post 方法的表单,因为浏览器/插件不应该重新调用 post 请求。

于 2008-09-26T10:34:47.907 回答
3

我找到了问题的原因...... Firebug。

我一点也不知道 Firebug 认为它在做什么,如果我从脚本中删除“cflocation”标签(将用户带回摘要页面的那个),那么它工作正常。但如果我保留它,Firebug 似乎会在将浏览器转发到摘要页面之前再次运行该功能。

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

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

于 2008-09-29T17:39:39.423 回答
2

这可能是浏览器缓存问题。直接的 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>
于 2008-09-26T16:34:07.627 回答
2

您发布的代码不是错误的原因,因为它都是服务器端代码 - 那里的客户端没有任何事情发生。

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

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

于 2008-09-26T17:12:00.560 回答
0

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

WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
于 2008-09-26T14:18:22.913 回答
0

所有这些不同的答案,但没有一个对我有用。我不得不去另一个论坛,那里有人说是 Firefox 中的 Skype 扩展插件导致 ColdFusion 数据库发疯或无法运行。我卸载了 Skype 扩展程序(谢谢你,Skype),一切恢复正常。希望这也适用于其他人。

于 2008-10-26T20:27:12.843 回答