Pregunta

Tengo una secuencia de comandos muy simple que cambia el estado de un elemento en una base de datos MySql: funciona bien en IE7, pero si lo intento en Firefox, parece que ha funcionado, pero no ha ... Lo que es extremadamente extraño.

El código es muy simple: primero obtengo los detalles del registro que estoy buscando:

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

Esto funciona bien, si vuelco los resultados, es solo el contenido del registro como se esperaba. Entonces, utilizo una instrucción if para cambiar el campo 'activo' de uno a cero o viceversa.

<!--- 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>

No puedo ver ninguna razón para que esto no funcione ... y de hecho, en IE7 funciona perfectamente ...

Lo que sucede es después de ejecutar este script, el navegador vuelve a la página que muestra todos estos registros. Para cada registro, si el campo 'bActive' está establecido en '1', mostrará la palabra 'Activo' y si está configurado en 'cero', mostrará 'Deshabilitado'. Bastante simple.

Si ejecuto el script para deshabilitar un registro, Firefox realmente muestra la palabra 'deshabilitado' como se esperaba, ¡pero el registro de la base de datos no cambia!

Estoy perdido ... ¡¿cómo puede funcionar bien el código del lado del servidor en un navegador y no en otro ?!

¿Fue útil?

Solución 2

Encontré la causa del problema ... Firebug.

No tengo la menor idea de lo que Firebug cree que está haciendo, si elimino la etiqueta 'cflocation' del script (la que lleva al usuario a la página de resumen), entonces funciona bien. Pero si lo mantengo, Firebug parece ejecutar la función nuevamente antes de enviar el navegador a la página de resumen.

No hay razón para que esté haciendo esto. Un-bloody-belivable.

Al menos no ocurrirá en las máquinas de los clientes.

Otros consejos

¿Está 100% seguro de que el registro de la base de datos no cambia? Podría obtener este efecto si firefox le llama a su secuencia de comandos dos veces, una vez antes de que se represente la página y una vez después.

Por lo tanto, el producto se configura como deshabilitado, luego, una vez que la página se envía al navegador, se actualiza nuevamente (y, como ya está deshabilitado, se vuelve a habilitar).

Si ha agregado un campo de última actualización a la base de datos y actualiza que cada vez que se modifique su producto, entonces podrá saber si este es el caso.

EDITAR: respondiendo a los comentarios a continuación, una solución rápida + sucia sería verificar primero la marca de tiempo de la última actualización y, en n segundos de la hora actual, descartar la actualización.

¿Tiene algún complemento en Firefox que quizás esté volviendo a llamar a la página? Tal vez para propósitos de desarrollo? Una prueba fácil para ver si es su script o una peculiaridad en Firefox sería cambiar su URL de obtención a un formulario con un método de publicación, ya que el navegador / complemento no debería volver a llamar una solicitud de publicación.

El código que publicaste no es la causa del error porque es todo el código del lado del servidor, no ocurre nada en el cliente allí.

Activaría la depuración de CF (incluida la actividad de la base de datos) y pegaría una etiqueta justo después de la etiqueta de cierre, y antes de cualquier redirección a la página de vista del producto. Ejecute el código y observe la salida de depuración de SQL.

Mi conjetura es que cuando se usa Firefox, el bloque de código que contiene las consultas simplemente no se llama.

Esto puede ser un problema de almacenamiento en caché del navegador. No hay forma de que el código CF directo pueda verse afectado por el navegador que se utiliza. ¿Qué sucede si actualiza la página donde está mostrando los productos? También debe consultar la base de datos directamente para ver si el valor está cambiando o no.

En un poco de tangente, puedes eliminar la necesidad de una instrucción if con un poco de matemática simple.

<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>

Intente eliminar el punto y coma al final de sus cláusulas WHERE en su código SQL.

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

todas esas respuestas diferentes, y ninguna de ellas funcionó para mí. Tuve que ir a otro foro donde alguien dijo que era el complemento de extensión de Skype en Firefox lo que hace que las bases de datos de ColdFusion se vuelvan locas o no funcionen. Desinstalé la extensión de Skype (gracias, Skype) y todo volvió a la normalidad. Espero que esto funcione para alguien más también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top