Xmlhttp.responseText gibt nur einen Teil zurück

Hallo zusammen,
ich starte auf ein Event hin einen htmlrequest:

xmlhttp.open(„GET“, „http://localhost/cystore/scripts/php/tblRows.php?source="+source+"&id="+id+"&term="+term+"&status=“+status,true);

xmlhttp.send();

Prüfe auf readystate und status und gebe responseText an betreffendes Element zurück:

if (xmlhttp.readyState==4 && xmlhttp.status==200){ document.getElementById(id).innerHTML=xmlhttp.responseText;
}

Der responseText wird folgendermaßen in tblRows.php generiert:
while ($arr = mysql_fetch_array($result)) {
echo „“;

for( $i = 0 ; $i " . $arr[$i] . „“;
}
echo „“;
}

Der Inhalt aus „echo „“ . $arr[$i] . „“;“ wird korrekt zurück gegeben, aber die -Tags außerhalb der For-Schleife werden nicht mit zurück gegeben.

Habe hier auf den restlichen Code verzichtet, um es übersichtlich zu halten. Folgend könnt ihr euch den AJAX und PHP-Code auf pastebin anschauen:

ajax http://pastebin.com/05Cv0zue
php http://pastebin.com/AfgRrgQk

viele grüße

friendly

für mich sieht das korrekt aus. wenn die TD zurückgegeben werden, dann kommt auch das TR mit. du solltest die den respons text mal genau ansehen.
was ich nicht gefunden habe: wo generierst du ?
und ich würde auf ein framework (z.B. jquery) umstellen. das erspart ne menge zeilen. gerade bei ajax.
die for schleife würde ich durch foreach ersetzen:
foreach ($arr as &$value) {
echo „“ . $value . „“;
}
dann brauchst du vorher nicht zählen wie viele felder zurückgegeben wurden.
ein projekt ist erst perfekt, wenn man nichts mehr weglassen kann.
genug gemeckert.
roland dreix
dreix webdesign

Da kann ich leider auch nicht helfen.
Hoffe, du findest die Lösung.
Viel Erfolg.
Viele Grüße
sendet
Herbert

Hey Roland,
ich danke dir für deine Antwort. Ich möchte es erstmal mit JS und AJAX lösen und dann auf jQuery zurückgreifen. Bin noch ein Anfänger was JS/AJAX betrifft.

Habe mir jetzt den responesText per alert() angeschaut und der wird korrekt angezeigt. Ich habe ihn nur nicht korrekt weitergegeben.

Ich habe das Ergebnis an die ID einer Zeile (eine Zeile unter der Kopfzeile) weitergegeben. Das heißt, das Ergebis wurde natürlich in die Zeile geschrieben und die weiteren 's wurden unterschlagen da man Tabellen nicht kaskadieren kann.

Jetzt hatte ich aber das Problem, dass wenn ich die Daten an die Tabelle übergebe die bestehenden Zeilen gelöscht werden. Also baue ich jetzt noch einen Ablauf in die Funktion ein der eine Kopfzeile erstellen soll.

hi friendly,
ganz habe ich nicht verstanden was du geantwortet hast.
zitat: Habe mir jetzt den responesText per alert()
antwort: ich hoffe du arbeitest mit dem Firefox und hast das plugin firebug installiert. damit kannst du die ajax rückmeldungen ohne programmierung verfolgen.

zitat: da man Tabellen nicht kaskadieren
antwort: kaskadieren nicht. aber verschachteln, wenn du das brauchst. wird zwar nicht gern gesehen, muss aber manchmal sein.

zitat: eine Kopfzeile erstellen soll
antwort: das könntest du auch mit der foreach schleife erledigen. allerdngs weiß ich nicht wie deine datenfelder in der db benamst sind und ob das für den user dann lesbar ist
foreach ($arr as $key => $value) {
echo „“ . $key . „“;
}
alles liebe
roland dreix
dreix webdesign

Hallo friendly,

so wie ich das sehe, musst Du entweder Deinen HTMLresponse so anpassen, das die TR vom JAVASCRIPT eingetragen werden oder Du musst Deiner PHP-FOR-Schleife eine Chance geben :smile:

So wie die Schleife aufgebaut ist, durchläuft sie den gesamten SQL-Response … ohne Fallunterscheidung. So hast Du also nur den TR aus dem WHILE, dann $i * TD und zum Schluss ein beendendes TR.

Du gehst auf eine fest bestimmte Anzahl von Spalten (7) und das macht es einfach … ändere Deine Schleife mal wie folgt:

 $j=1; //Spaltenzaehler
 echo ""; //1. Zeile beginnen
 while ($arr = mysql\_fetch\_array($result)) 
 {
 for( $i = 0 ; $i "; //$j=8, also neue Zeile initieren
 $j=1; //$j wieder auf 1 setzen
 $i=$i-1; //damit dieser Schleifendurchgang kein Arrayfeld verliert
 }else{
 echo "" . $arr[$i] . "";
 $j==$j+1;
 }
 }
 }
 echo ""; //Letzte Zeile beenden

So sollte es funktionieren.

So long,
Burkhard

hallo,
eins gleich vorab: ich tu mir das direkte Gerödel auf dem xmlhttp Objekt schon lange nicht mehr an, sondern verwende jquery. Vorteile: schlankerer eigener Code, Egalisierung von browserspezifischen Implementierungen. Nachteil natürlich, dass man im Client eine inzwischen nicht mehr kleine Bibliothek laden muss.
Auch die innerHTML Funktion ist ein kritischer Kandidat mit gelegentlichem Sonderverhalten im einen oder anderen Browser.

Das sind keine zwingenden Gründe für den Fehler in deiner Anwendung, nur Empfehlungen.
Ansonsten sieht in deinem Code nichts falsch aus.

Emfpehlungen zur Diagnose:

  1. serverseitig (PHP) den gesamten response String erstmal zusammenbauen, dann in eine Logdatei schreiben und erst dann zurückpusten. Nur um sicherzustellen, dass der Fehler nicht an dieser Stelle auftritt - auch wenn es bei den paar Zeilen und der kleinen Schleife trivial erscheint.
  2. clientseitig (Javascript) die gesamte empfangene Response ohne besondere Konvertierung in einer alert() Box ausgeben.

Beides ist unabhängig davon, ob du auf jquery umsteigst. Wenn du aber bei 2. noch eine vollständige response siehst, geht die erst beim Einfügen mit innerHTML verloren - dann spätestens wäre jquery ganz dringend zu empfehlen.

Mir kommt auch kritisch vor, ein Konstrukt „…“ mit innerHTML [oder bei jquery: .html()] in ein anderes Element einzufügen. Das müsste ja dann ein bzw. Element sein.
Entweder ist diese Table leer oder du tauschst damit den Inhalt aus. In beiden Fällen sollte es kein großer Mehraufwand oder schwierig sein, die ganze Table neu zu rendern, und das innerHTML dann auf einem umgebenden aufzurufen.

Hallo Friendly,

d.h. wenn ich dich richtig verstehe geht es dir eigentlich nur um den PHP-Teil mit der Datenbankabfrage? Der Rest scheint ja zu klappen.

$result = mysql_query($query);
$num = mysql_num_fields($result); //count cols for rows
while ($arr = mysql_fetch_array($result)) {
echo „“;
for( $i = 0 ; $i " . $arr[$i] . „“;
}
echo „“;
}

Einen Fehler erkenne ich hier beim besten Willen nicht, da meine Schleifen ähnlich aussehen. Interessant ist es mal zu wissen, was bei dir so alles herauskommt.

Lass dir bitte mal den $num und auch print_r($arr); ausgeben.

Verwirrend ist es nur, dass Teile außerhalb der Schleife nicht und Teile innerhalb der Schleife ausgegeben werden, weil das echt keiner Logik entspricht.

Sorry, dass ich hier nochmal nachfrage, aber du bist dir sicher, dass bei dem xmlhttp.responseText keine TR-Tags dabei sind. Was ergibt denn alert(xmlhttp.responseText);

Grüße
Ingo

Hallo,

auf den ersten Blick kann ich keinen Fehler entdecken. Was wird denn eigentlich von Javascript zurückgegeben, das wäre noch interessant zu sehen.

Grüße
Alex

Hallo friendly,

leider kann ich nicht einsehen in welches element du die daten mit .innerHTML schreiben willst. Ich könnte mir vorstellen wenn du eine Tabelle mit .innerHTML befüllen willst das dies nicht get.

Probiere daher einmal ein div-Container zu befüllen und die komplette Table im Ajax auszugeben also mit usw.

und natürlich schaue auch im Quelltext nach wie die Daten ankommen denn der Browser schluckt ja einiges sonst weg.

Grüße