Простой скрипт ColdFusion работает в IE, но не в Firefox?

У меня есть очень простой скрипт, который изменяет статус элемента в базе данных MySql — он отлично работает в IE7, но если я попробую его в Firefox, похоже, что он сработал, но нет... Что чрезвычайно странный.

Код очень прост — сначала я получаю информацию о записи, которую ищу:

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

Это работает нормально, если я сброшу результаты, это будет просто содержимое записи, как и ожидалось. Затем я использую оператор if, чтобы изменить «активное» поле с единицы на ноль или наоборот.

<!--- 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», будет отображаться слово «Активно», а если установлено «ноль», будет отображаться «Отключено». Достаточно просто.

Если я запускаю скрипт для отключения записи, Firefox фактически отображает слово «отключено», как и ожидалось, но запись в базе данных не меняется!

Я в недоумении... как серверный код может нормально работать в одном браузере, а не в другом?!


person Gary Stanton    schedule 26.09.2008    source источник


Ответы (6)


Вы на 100% уверены, что запись в базе данных не изменится? Вы можете получить этот эффект, если Firefox дважды вызовет ваш скрипт, один раз до отображения страницы и один раз после.

Таким образом, продукт отключается, затем после отправки страницы в браузер он снова обновляется (и, поскольку он уже отключен, он снова включается).

Если вы добавили поле последнего обновления в базу данных и обновляете его каждый раз, когда в ваш продукт вносятся изменения, вы сможете определить, так ли это.

РЕДАКТИРОВАТЬ: отвечая на комментарии ниже, быстрое + грязное исправление будет состоять в том, чтобы сначала проверить отметку времени последнего обновления, и если оно будет через n секунд текущего времени, отклонить обновление.

У вас есть какие-нибудь плагины в firefox, которые могут перезвонить страницу? возможно, для целей разработки? простой тест, чтобы увидеть, является ли это вашим сценарием или причудой в firefox, состоит в том, чтобы изменить ваш URL-адрес получения на форму с методом публикации, поскольку браузер/плагин не должен повторно вызывать запрос на публикацию.

person Re0sless    schedule 26.09.2008
comment
Вы правы... Я добавил последнее обновленное поле, и оно действительно внесло изменения... но я не знаю, чтобы FF дважды нажимал на скрипт, и не понимаю, почему это... какие-либо идеи, как остановить это происходит? - person Gary Stanton; 26.09.2008
comment
Я видел неясную проблему в FF раньше, когда он натыкался на символ, который он не распознал, и ему нужно было повторно отобразить страницу в другом наборе символов, и для этого он повторно отправляет страницу. У вас нет никаких странных символов, которые сильно отличаются от вашего объявленного типа документа? - person ConroyP; 26.09.2008
comment
Хммммммммм..... не то, чтобы я знал об этом... Я использую символ £ на результирующей странице, с которой у меня были проблемы в прошлом... но не на странице, которая фактически вызывает вызовы базы данных ... даже если он повторно отобразит страницу результатов, это не должно вызвать проблемы. - person Gary Stanton; 26.09.2008
comment
Является ли запрос к скрипту, меняющему статус, GET или POST? если это GET, попробуйте изменить его на POST и посмотрите, поможет ли это. Раньше у меня были проблемы с отображением £, поэтому я использую £ (&)#163; сейчас. - person Re0sless; 26.09.2008
comment
Это не форма, это просто страница... (так получить, верно?) страница берет идентификатор записи из URL-адреса, вызывает функцию CF для изменения записи, затем использует CFLOCATION, чтобы вернуться на страницу списка записей . - person Gary Stanton; 26.09.2008

Я нашел причину проблемы... Firebug.

Я не имею ни малейшего представления о том, что думает Firebug, если я уберу тег cflocation из скрипта (тот, который возвращает пользователя на страницу сводки), тогда он будет работать нормально. Но если я оставлю это, Firebug, похоже, снова запустит функцию, прежде чем перенаправить браузер на страницу сводки.

Нет причин для этого. Чертовски правдоподобно.

По крайней мере, на клиентских машинах этого не будет.

person Gary Stanton    schedule 29.09.2008

Код, который вы разместили, не является причиной ошибки, потому что это весь код на стороне сервера - там ничего не происходит на клиенте.

Я бы включил отладку CF (включая активность базы данных) и вставил тег сразу после закрывающего тега и перед любым перенаправлением обратно на страницу просмотра продукта. Запустите код и посмотрите на вывод отладки SQL.

Я предполагаю, что при использовании Firefox блок кода, содержащий запросы, просто не вызывается.

person Brian Sadler    schedule 26.09.2008
comment
Запросы определенно вызываются, просто кажется, что они вызываются дважды. Поле «последнее обновление» базы данных обновляется. - person Gary Stanton; 29.09.2008

Это может быть проблема с кэшированием браузера. Используемый браузер никак не может повлиять на прямой код 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>
person ale    schedule 26.09.2008
comment
Я должен согласиться - в H-E-Double Hockey Sticks браузер никак не влияет на код на стороне сервера. У вас либо проблема с кэшированием, либо что-то связанное с формой или ссылками, которые запускают этот процесс. - person Adam Tuttle; 26.09.2008
comment
Я тоже согласен. Если бы это была проблема на стороне сервера, я уверен, что мог бы понять это. Я не понимаю, что делает FireFox, чтобы запустить этот код дважды. Тангенс - отличная идея, спасибо... однако код, который вы разместили, не совсем работает - следует читать: #val(1 - Arguments.qGetProductAttribute.bActive)# - person Gary Stanton; 29.09.2008

Попробуйте удалить точку с запятой в конце предложений WHERE в коде SQL.

WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
person Community    schedule 26.09.2008

все эти разные ответы, и ни один из них не работал для меня. Мне пришлось перейти на другой форум, где кто-то сказал, что это расширение Skype Extension Addon в Firefox, из-за которого базы данных ColdFusion сходят с ума или не работают. Я удалил расширение Skype (спасибо, Skype), и все вернулось в норму. Надеюсь, это сработает и для кого-то еще.

person Community    schedule 26.10.2008