4

MySql データベース内のアイテムのステータスを変更する非常に単純なスクリプトがあります。IE7 では正常に動作しますが、Firefox で試してみると、動作しているように見えますが、動作していません...これは非常に奇数。

コードは非常に単純です。最初に、探しているレコードの詳細を取得します。

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

これは正常に機能しています。結果をダンプすると、期待どおりのレコードの内容になります。次に、if ステートメントを使用して、「アクティブ」フィールドを 1 から 0 に、またはその逆に変更します。

<!--- 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 は実際には「無効」という単語を期待どおりに表示しますが、データベース レコードは変更されません!

私は途方に暮れています...サーバー側のコードが、あるブラウザーでは正常に機能し、別のブラウザーでは正常に機能しないのはどうしてでしょうか?!

4

6 に答える 6

3

データベース レコードが変更されないことを 100% 確信していますか? ページがレンダリングされる前に 1 回、レンダリングされた後に 1 回、Firefox がスクリプトを 2 回呼び出すと、この影響を受ける可能性があります。

そのため、製品が無効に設定され、ページがブラウザに送信された後、再び更新されます (すでに無効になっているため、再度有効にされます)。

データベースに最終更新フィールドを追加し、製品が修正されるたびに更新する場合、これが事実であるかどうかを知ることができます.

編集: 以下のコメントに対応して、クイック + ダーティな修正は、最後の更新のタイムスタンプを最初に確認し、現在の時刻の n 秒後に更新を却下することです。

おそらくページを再呼び出しするプラグインがFirefoxにありますか?おそらく開発目的ですか?ブラウザ/プラグインは投稿要求を再呼び出ししないため、取得 URL を post メソッドを使用してフォームに変更することで、自分のスクリプトまたは Firefox の特異性を確認する簡単なテストを行うことができます。

于 2008-09-26T10:34:47.907 に答える
3

問題の原因が見つかりました... Firebug.

スクリプト (ユーザーを概要ページに戻すタグ) から「cflocation」タグを削除すると、Firebug が何をしていると考えているのか、まったくわかりません。しかし、そのままにしておくと、Firebug はブラウザを概要ページに転送する前に関数を再度実行するようです。

これを行う理由はありません。血まみれの信じられない。

少なくとも、クライアントのマシンでは発生しません。

于 2008-09-29T17:39:39.423 に答える
2

投稿したコードはすべてサーバー側のコードであるため、エラーの原因ではありません。クライアントでは何も起きていません。

CF デバッグ (データベース アクティビティを含む) をオンにして、終了タグの直後、製品ビュー ページに戻るリダイレクトの前にタグを貼り付けます。コードを実行し、SQL デバッグ出力を確認します。

私の推測では、Firefox を使用すると、クエリを含むコード ブロックが呼び出されないだけです。

于 2008-09-26T17:12:00.560 に答える
2

これは、ブラウザのキャッシュの問題である可能性があります。使用されているブラウザによってストレート 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>
于 2008-09-26T16:34:07.627 に答える
0

SQL コードの WHERE 句の末尾にあるセミコロンを削除してみてください。

WHERE   iProductAttributeID = <cfqueryparam value="#Arguments.iProductAttributeID#" cfsqltype="CF_SQL_INTEGER" />;
于 2008-09-26T14:18:22.913 に答える
0

これらすべての異なる答えがあり、どれも私にとってはうまくいきませんでした。別のフォーラムに行く必要がありました。誰かが Firefox の Skype 拡張アドオンが原因で ColdFusion データベースがおかしくなったり、機能しなくなったりしたと言っていました。Skype 拡張機能 (ありがとう、Skype) をアンインストールしたところ、すべて正常に戻りました。これが他の誰かにとってもうまくいくことを願っています。

于 2008-10-26T20:27:12.843 に答える