我有一个非常简单的脚本可以改变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',如果它'设置为'0',它将显示'Disabled'。 很简单。
如果我运行脚本来禁用记录,Firefox实际上会按预期显示“禁用”一词,但数据库记录不会改变!
我很茫然......服务器端代码如何在一个浏览器中正常工作而在另一个浏览器中却无法正常工作?!
答案 0 :(得分:3)
您是否100%确定数据库记录没有变化?如果firefox调用脚本两次,一次在页面呈现之前和之后一次,则可能会产生这种影响。
因此,产品设置为禁用,然后在页面发送到浏览器后再次更新(并且已经禁用,它会重新启用)。
如果您已将最后一个更新字段添加到数据库并在每次修改产品时更新该字段,那么您将能够判断是否是这种情况。
编辑:回复下面的评论,快速+脏修复将首先检查上次更新时间戳,如果它在当前时间的n秒内解除更新。
您是否在Firefox中有任何可能重新调用该页面的插件?也许是出于开发目的?一个简单的测试,看看你的脚本或firefox中的怪癖是否会将你的获取URL更改为带有post方法的表单,因为浏览器/插件不应该重新调用post请求。
答案 1 :(得分:3)
我找到了问题的原因...... Firebug。
我一点也不知道Firebug认为它在做什么,如果我从脚本中移除'cflocation'标签(将用户带回摘要页面的那个),那么它工作正常。但如果我保留它,Firebug似乎再次运行该功能,然后将浏览器转发到摘要页面。
没有理由这样做。 未血性-belivable。
至少它不会发生在客户的机器上。
答案 2 :(得分: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>
答案 3 :(得分:2)
您发布的代码不是错误的原因,因为它是所有服务器端代码 - 客户端中没有任何内容发生。
我打开CF调试(包括数据库活动)并在结束标记之后,在重定向到产品视图页面之前粘贴标记。运行代码并查看SQL调试输出。
我的猜测是,在使用Firefox时,包含查询的代码块不会被调用。
答案 4 :(得分:0)
尝试删除SQL代码中WHERE子句末尾的分号。
WHERE iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
答案 5 :(得分:0)
所有这些不同的答案,并没有一个为我工作。我不得不去另一个论坛,有人说它是Firefox中的Skype Extension Addon导致ColdFusion数据库变得疯狂或无法正常运行。我卸载了Skype分机(谢谢你,Skype),一切都恢复正常了。希望这也适用于其他人。