2012-04-02 10 views
1

Ich verwende Coldfusion MX 8. Ich hatte kürzlich eine Situation, in der Variablen zwischen den Sitzungen zu "wechseln" scheinen. Ich habe einige Informationen über den Austausch von ganzen Sitzungen gefunden, aber das war nicht der Fall. Es wurde nur eine Variable ausgetauscht, nicht die gesamte Sitzung. Mein Code-Schnipsel folgen:Wie global sind Coldfusion-Variablen, die nicht mit "var" deklarieren?

var idArray = ListToArray(arguments.event.getArg("itemIDs")); 
var oItemDetail = 0; 
var oItem = 0; //Inserting this line seems to have fixed the error. 
var i = 0; 

for (i=1;i lte ArrayLen(idArray);i=i+1) { 

    //Log Spot #1 – cflog idArray[i] and arguments.event.getArg("statusNotes") 

    oItem = getItemService().getItem(idArray[i]); 
    oItemDetail = getItemService().getItemDetail(); 
    oItemDetail.setItemID(oItem.getItemID()); 

    oItemDetail.setStatusNotes(arguments.event.getArg("statusNotes")); 

    getItemService().saveItem(oItem); 
    getItemService().saveItemDetail(oItemDetail); 
} 

//getItem and getItemDetail just call getTransfer().get() 
//saveItem and saveItemDetail just call getTransfer().save() 

Zum Beispiel bei Log Punkt # 1, idArray [i] gewesen „1“ haben könnte, und das StatusNotes Ereignis arg könnte „abc“ sein.

Aber sollte eine andere Person, in einer anderen Sitzung, ein anderes Login verwenden, an einem anderen Ort, einem anderen Browser usw.etc. Verwenden Sie die Funktion genau zur gleichen Zeit, indem Sie idArray [i] = "2" und statusNotes = "def" verwenden, dann kann "Details" "abc" stattdessen an "2" angehängt werden und "Details" an Artikel angehängt " 1 ".

Die Tatsache, dass bei Log Spot # 1 die protokollierten Variablen korrekt sind, aber in der Datenbank vertauscht sind, verweist auf diese Codezeilen als Verdächtige.

Dieses Problem ist verschwunden, indem oben "Var oItem" deklariert.

Also ich denke, ich bin ein wenig schockiert von dieser Offenbarung. Ich würde annehmen, dass das Nicht-Deklarieren meiner lokalen Variablen eine andere Variable mit dem gleichen Namen in einer anderen Funktion bedeuten würde, aber in derselben Sitzung überschrieben werden könnte. Aber das scheint eine Art internes Speicherproblem zu sein. Die Variablen werden nicht einmal zwischen den Sitzungen überschrieben, sondern ausgetauscht!

Ich frage mich, ob jemand ähnliche Erfahrungen gemacht hat und könnte etwas Licht dazu bringen?

Antwort

4

Unvar'd Variablen werden private Variablen innerhalb des Objekts gemacht, dass sie in enthalten sind. Welche zwei Probleme verursacht,

  1. Sie gemeinsam genutzt werden (zugegriffen und geschrieben) durch Funktionen (innerhalb derselben Komponente)
  2. Sie leben über das Leben der Funktionsaufruf

Wenn Sie eine Variable var es es sich um eine lokale Variable für diese Funktion nur macht. Nur diese Funktion kann sie verwenden und sie lebt nur so lange wie diese Funktion.

In Ihrem Fall hat dieses Problem nicht wirklich etwas mit Sitzungen zu tun, abgesehen davon ist der persistente Bereich, in dem Sie gerade die Daten von diesen Funktionen speichern.

sagtest Sie

Ich würde davon ausgehen, dass nicht meine lokalen Variablen deklariert eine andere Variable würde bedeuten, mit dem gleichen Namen, in einer anderen Funktion, aber in der gleichen Sitzung könnte überschrieben.

Aber es wäre genauer

zu sagen, ich annehmen würde, dass nicht meine lokalen Variablen deklariert eine andere Variable würde bedeuten, mit dem gleichen Namen, in einer anderen Funktion, aber in demselben Objekt könnte erhalten überschrieben

+0

Ihre Antwort war hilfreich, danke. Das liegt daran, dass das cfc von allen Sitzungen gemeinsam genutzt wird und die Variable nicht als einzelne Funktionsaufrufe, sondern als Ganzes in der cfc gespeichert wurde. Ich bin immer noch ein wenig verwirrt, warum die Variablen tatsächlich tauschen würden. Ich würde verstehen, wenn sie einfach überschrieben würden, aber beide Variablen blieben intakt und wurden jeweils von der anderen Sitzung referenziert. Aber es ist jetzt ein kleines Detail, dass ich verstehe, wo das Shared Memory Problem aufgetreten ist. –

+2

Der CFC kann nur gemeinsam von allen Sitzungen verwendet werden, wenn er in einem persistenten Bereich geteilt wird, der von allen Sitzungen (z. B. Anwendung oder Server) gemeinsam genutzt wird. Es ist wahrscheinlich, dass Sie eine so genannte "Race Condition" erstellt haben. Sie haben zwei Benutzer gleichzeitig auf ein gemeinsam genutztes Objekt geklickt und aufgrund der Objektbereichsvariable die Daten des jeweils anderen statt ihrer eigenen abgerufen. –

Verwandte Themen