Domanda

Ho un po 'di script molto semplice che cambia lo stato di un elemento in un database MySql - funziona bene in IE7, ma se lo provo in Firefox, sembra che abbia funzionato, ma non ha ... Il che è estremamente strano.

Il codice è molto semplice: per prima cosa ottengo i dettagli del record che sto cercando:

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

Funziona benissimo, se scarico i risultati, è solo il contenuto del record come previsto. Quindi uso un'istruzione if per cambiare il campo "attivo" da uno a zero 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>

Non vedo alcun motivo per cui questo non funzioni ... e in effetti, in IE7 funziona perfettamente ...

Quello che succede è dopo l'esecuzione di questo script, il browser torna alla pagina che mostra tutti questi record. Per ogni record se il campo "bActive" è impostato su "1", verrà visualizzata la parola "Attivo" e se è impostato su "zero", verrà visualizzato "Disabilitato". Abbastanza semplice.

Se eseguo lo script per disabilitare un record, Firefox visualizza effettivamente la parola "disabilitato" come previsto, ma il record del database non cambia!

Sono in perdita ... come può il codice lato server funzionare bene in un browser e non in un altro ?!

È stato utile?

Soluzione 2

Ho trovato la causa del problema ... Firebug.

Non ho la minima idea di cosa pensi stia facendo Firebug, se rimuovo il tag 'cflocation' dallo script (quello che riporta l'utente alla pagina di riepilogo), allora funziona benissimo. Ma se lo tengo dentro, Firebug sembra eseguire nuovamente la funzione prima di inoltrare il browser alla pagina di riepilogo.

Non c'è motivo per farlo. Un-bloody-belivable.

Almeno non accadrà sui computer dei client.

Altri suggerimenti

Sei sicuro al 100% che il record del database non cambi? Potresti ottenere questo effetto se firefox ti chiama script due volte, una volta prima del rendering della pagina e una volta dopo.

Quindi il prodotto viene impostato su disabilitato, quindi dopo che la pagina viene inviata al browser viene nuovamente aggiornata (e poiché è già disabilitata, viene riattivata).

Se hai aggiunto un ultimo campo di aggiornamento al database e lo aggiorni ogni volta che il tuo prodotto viene modificato, sarai in grado di dire se questo è il caso.

EDIT: rispondendo ai commenti qui sotto, una soluzione rapida + sporca sarebbe quella di controllare prima il timestamp dell'ultimo aggiornamento e se è entro n secondi dell'ora corrente, chiudere l'aggiornamento.

Hai dei plug-in in Firefox che potrebbero richiamare la pagina? forse per scopi di sviluppo? un semplice test per vedere se è il tuo script o una stranezza in Firefox sarebbe quello di cambiare il tuo get url in un modulo con un metodo post, poiché il browser / plug-in non dovrebbe richiamare una richiesta post.

Il codice che hai pubblicato non è la causa dell'errore perché è tutto il codice lato server - non sta succedendo nulla sul client lì dentro

Attivo il debug di CF (inclusa l'attività del database) e inserisco un tag subito dopo il tag di chiusura e prima di qualsiasi reindirizzamento alla pagina di visualizzazione del prodotto. Esegui il codice e osserva l'output di debug di SQL.

La mia ipotesi è che quando si utilizza Firefox il blocco di codice contenente le query non viene chiamato.

Potrebbe trattarsi di un problema di memorizzazione nella cache del browser. Non è possibile che il codice CF diretto sia influenzato dal browser utilizzato. Cosa succede se aggiorni la pagina in cui stai visualizzando i prodotti? Devi anche guardare direttamente il database per vedere se il valore sta cambiando o meno.

Su un po 'di tangente, puoi eliminare la necessità di un'istruzione if con un po' di matematica semplice.

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

Prova a rimuovere i punti e virgola alla fine delle clausole WHERE nel tuo codice SQL.

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

tutte quelle risposte diverse e nessuna di queste ha funzionato per me. Ho dovuto andare in un altro forum in cui qualcuno ha detto che era il componente aggiuntivo di estensione di Skype in Firefox che fa impazzire o non funzionare i database ColdFusion. Ho disinstallato l'estensione di Skype (grazie, Skype) e tutto è tornato alla normalità. Spero che questo funzioni anche per qualcun altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top