简单的 ColdFusion 脚本在 IE 中有效,但在 Firefox 中无效?

Posted

技术标签:

【中文标题】简单的 ColdFusion 脚本在 IE 中有效,但在 Firefox 中无效?【英文标题】:Simple ColdFusion script works in IE but not Firefox? 【发布时间】:2010-09-13 09:48:24 【问题描述】:

我有一个非常简单的脚本,可以更改 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 实际上会按预期显示“禁用”一词,但数据库记录不会改变!

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

对,你是...我添加了一个最后更新的字段,它确实做出了改变...但我不知道 FF 两次点击脚本,并且不明白为什么它会...任何想法如何阻止这种情况发生? 我之前在 FF 中看到一个晦涩的问题,当它偶然发现一个它无法识别的字符并需要以不同的字符集重新显示页面,并将页面重新提交给这样做。您没有任何与您声明的文档类型大不相同的奇怪字符吗? Hmmmmmmmmmm .....我不知道...我在结果页面上使用了 £ 符号,我过去遇到过问题...但不是实际调用数据库的页面......即使它重新显示结果页面,也不应该导致问题。 对更改状态的脚本的请求是 GET 还是 POST?如果它是 GET 尝试将其更改为 POST,看看是否有帮助。我在过去显示 £ 时遇到问题,所以我使用 £ (&)#163;现在。 它不是一个表单,它只是一个页面......(所以是get,对吗?)页面从URL中获取记录ID,调用CF函数更改记录,然后使用CFLOCATION返回记录列表页面。【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

查询肯定会被调用,只是似乎它们被调用了两次。正在更新数据库的“上次更新”字段。【参考方案4】:

这可能是浏览器缓存问题。直接的 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>

【讨论】:

我必须同意——在 H-E-Double Hockey Sticks 中浏览器无法影响服务器端代码。您遇到了缓存问题,或者与启动此过程的表单或链接有关。 我也同意。如果这是服务器端问题,我很确定我可以解决这个问题。我不明白 FireFox 正在做什么来运行此代码两次。切线是个好主意,谢谢...但是您发布的代码不太有效-应该阅读:#val(1 - Arguments.qGetProductAttribute.bActive)#【参考方案5】:

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

WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于简单的 ColdFusion 脚本在 IE 中有效,但在 Firefox 中无效?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jquery 脚本中输出 Coldfusion 变量?

跨域脚本 ColdFusion 问题

为啥 ColdFusion 认为值“7+”是一个有效的整数值,我如何验证它不是?

cfsetting 的 ColdFusion 9 脚本语法是啥?

为什么不能在Coldfusion中顺序调用同一组件的两个方法?

ColdFusion 生成代码以创建数据库表