Jonas: Asynchrone DB-Abfrage

Hallo,

ich sitze nun schon seit Stunden über einem eigentlich kleinen Problem aber finde einfach keine zufridenstellende Lösung. Folgendes Szenario:

Ich verwende innerhalb einer html-Datei ein Javascript-DropDown-Menü. Ein Button wird zB. mit folgender Zeile generiert:
<a href="#" onMouseover="showmenu(event,linkset[0])" onMouseout="delayhidemenu()">TEXT</a>

Die Methode "showmenu" ist unwichtig für die Fragestellung.
Das übergebene Array "linkset" enthält mherere Strings, ursprünglich wurden diese zB. so initialisiert:

linkset[0]='<a href="#">Link1</a>'  
linkset[0]+='<a href="#">Link2</a>'

Nun ist es meine Aufgabe, diese Links nichtmehr manuell anzugeben, sondern durch eine AJAX-Anfrage aus einer SQL-Datenbank zu holen. Dafür habe ich eine eigene Methode in der Datei getSites.js geschrieben.
Aufgerufen wird sie in der html-Datei wiefolgt:

<script type="text/javascript" src="../javascript/getSites.js"></script>  
<script type="text/javascript">  
var linkset=new Array()  
getSites("String", 0);  
</script>

Es wird wieder das Array "linkset" generiert und mit der übergebenen 0 teile ich der Methode getSites mit, dass das Ergebnis in das erste Element, also "linkset[0]" geschrieben werden soll. Der übergebene String ist unwichtig, er wird nur für die SQL-Abfrage benötigt.

Die Datei getsites.js:

  
// AJAX Abfrage  
// Uebergibt swName an ajaxq_sites.php, belegt linkset[lsNr] mit den entsprechenden Sites  
function getSites (swName, lsNr) {  
	  
	var sw = swName;  
	var ls = lsNr;  
	var url = "http://wsw03425/LD/php/ajaxq_sites.php?swName=" + escape(sw);  
	erzeugeAnfrage();  
	anfrage.open("GET", url, true);  
	anfrage.onreadystatechange = updateData;  
	anfrage.send(null);  
	  
	function updateData() {  
		if (anfrage.readyState == 4) {  
			var sites = anfrage.responseText;  
			var siteArray = new Array();  
			siteArray = sites.split('|');  
			linkset[ls]='<a href="#">' + siteArray[0] + '</a>';  
			i=1;  
			while (siteArray[i]) {  
				linkset[ls]+='<a href="#">' + siteArray[i] + '</a>';  
				i++;  
			}  
		}  
	}  
}  
  
// Erzeugt ein Object anfrage  
function erzeugeAnfrage() {  
  try {  
    anfrage = new XMLHttpRequest();  
  } catch (versuchmicrosoft) {  
    try {  
      anfrage = new ActiveXObject("Msxml2.XMLHTTP");  
    } catch (anderesmicrosoft) {  
      try {  
        anfrage = new ActiveXObject("Microsoft.XMLHTTP");  
      } catch (fehlschlag) {  
        anfrage = null;  
      }  
    }  
  }  
  if (anfrage == null)  
    alert("Fehler beim Erzeugen des Anfrage-Objekts!");  
}

Das alles funktioniert... allerdings nur solange ich nur einen Button habe. Will ich einen zweiten Button im DropDown-Menü, muss ich die Methode getSites ein zweites mal aufrufen und zB eine 1, statt einer 0 mitgeben, damit das Ergebnis in linkset[1] gespeichert wird.
Dann habe ich zwar das richtige Ergebnis in linkset[1], aber linkset[0] bleibt leer. Irgendwie wird immer nur der letzte Aufruf durchgeführt.
Am Geltungsbereich der Variable "linkset" kann es nicht liegen, da das letzte Ergebnis ja korrekt eingetragen wird. Eigentlich sollte es doch kein Problem sein diese getSites Methode x-mal hintereinander mit verschiedenen Paramtern aufzurufen und die Ergenisse dann in linkset[0] -linkset[x] einzutragen?!

  1. Hallo Jonas,

    nur eine Vermutung:

    die Variable "anfrage" ist eine globale Variable, die bei jedem Aufruf von "erzeugeAnfrage" überschrieben wird. Daher überschreibt der zweite Aufruf das HTTP-Objekt des ersten Aufrufs.

    Du musst auf lokale Variablen umstellen, z.B. indem du "anfrage" in "erzeugeAnfrage" als lokale Variable anlegst und an die aufrufende Funktion per 'return' übergibst. Hier mal eine ungetestete Änderung deiner Version:

    function getSites (swName, lsNr) {  
      
            var sw = swName;  
            var ls = lsNr;  
            var url = "http://wsw03425/LD/php/ajaxq_sites.php?swName=" + escape(sw);  
      
      
            var anfrage = erzeugeAnfrage();  
      
      
            anfrage.open("GET", url, true);  
            anfrage.onreadystatechange = updateData;  
            anfrage.send(null);  
      
            function updateData() {  
                    if (anfrage.readyState == 4) {  
                            var sites = anfrage.responseText;  
                            var siteArray = new Array();  
                            siteArray = sites.split('|');  
                            linkset[ls]='<a href="#">' + siteArray[0] + '</a>';  
                            i=1;  
                            while (siteArray[i]) {  
                                    linkset[ls]+='<a href="#">' + siteArray[i] + '</a>';  
                                    i++;  
                            }  
                    }  
            }  
    }  
      
    // Erzeugt ein Object anfrage  
    function erzeugeAnfrage() {  
      
      
      var anfrage;  
      
      
      try {  
        anfrage = new XMLHttpRequest();  
      } catch (versuchmicrosoft) {  
        try {  
          anfrage = new ActiveXObject("Msxml2.XMLHTTP");  
        } catch (anderesmicrosoft) {  
          try {  
            anfrage = new ActiveXObject("Microsoft.XMLHTTP");  
          } catch (fehlschlag) {  
            anfrage = null;  
          }  
        }  
      }  
      if (anfrage == null)  
        alert("Fehler beim Erzeugen des Anfrage-Objekts!");  
      
      
      return anfrage;  
      
      
    }
    

    Gruß, Jürgen

    1. Hey wow, du hast vollkommen recht! Ich hab die ganze Zeit in der getSites-Methode nach dem Fehler gesucht. Vielen Dank, das ging schnell! :D