Простой скрипт ColdFusion работает в IE, но не в Firefox? - PullRequest
4 голосов
/ 26 сентября 2008

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

Код очень прост - сначала я получаю детали нужной записи:

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

Это работает нормально, если я дам результаты, это просто содержимое записи, как и ожидалось. Тогда я использую оператор if, чтобы изменить поле 'active' с одного на ноль или наоборот.

<!--- 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 фактически отображает слово «отключено», как и ожидалось, но запись в базе данных не изменяется!

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

Ответы [ 6 ]

3 голосов
/ 29 сентября 2008

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

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

Нет причин для этого. Un-чертов-belivable.

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

3 голосов
/ 26 сентября 2008

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

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

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

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

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

2 голосов
/ 26 сентября 2008

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

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

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

2 голосов
/ 26 сентября 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>
0 голосов
/ 26 октября 2008

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

0 голосов
/ 26 сентября 2008

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

WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...