Вопрос

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

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

Это было полезно?

Решение 2

Я нашел причину проблемы...Поджигатель.

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

У него нет причин это делать.Не-чертовски-правдоподобно.

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

Другие советы

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

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

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

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

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

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

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

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

Это может быть проблема с кешированием браузера.Используемый браузер не может повлиять на прямой код 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>

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top