AJAX: Firefox liefert auf einmal eine Fehlermeldung
ingobar
- php
Guten Morgen zusammen,
einen Funktion von mir funktioniert nicht mehr. Das liegt wahrscheinlich daran, dass ich inzwischen einen Kontruktion habe, die nicht mehr läuft.
Folgenden Gedanken habe ich dabei gehabt: In einem Formular lassen sich die Namen von allen Schüler einer Klasse eingeben und speichern. Es lässt sich aber auch nur ein einzelner Schüler in einer Klasse einfügen.
Um das umzusetzen, habe ich zwei verschieden js-Funktionen:
function schuelernamen_speichern() {
editklasse_ajax_db_anfrage = null;
editklasse_ajax_db_anfrage = erzeugeDB_Anfrage();
if (editklasse_ajax_db_anfrage!=null) {
var sAnzahl = document.getElementById("schuleranzahl").options[document.getElementById("schuleranzahl").options.selectedIndex].value;
var url = "add_schuler_to_klasse.php";
var data2send = "";
for (var i=1;i<=sAnzahl;i++) {
data2send = "s_name="+escape(document.getElementById("name_"+i).value);
data2send += "&s_vname="+escape(document.getElementById("vname_"+i).value);
data2send += "&kl_id="+escape(document.getElementById("kl_id").value);
editklasse_ajax_db_anfrage.open("POST", url, true);
editklasse_ajax_db_anfrage.onreadystatechange = zeigeBestaetigung_schuler;
editklasse_ajax_db_anfrage.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
editklasse_ajax_db_anfrage.send(data2send);
}
} else {
document.getElementById("feedback_data").innerHTML = "Es konnte keine Verbindung zum Server aufgebaut werden.";
document.getElementById("feedback").style.visibility = "visible";
document.getElementById("speichern").focus();
}
}
function single_schueler_speichern() {
editklasse_ajax_db_anfrage = null;
editklasse_ajax_db_anfrage = erzeugeDB_Anfrage();
if (editklasse_ajax_db_anfrage!=null) {
var url = "add_schuler_to_klasse.php";
data2send = "s_name="+escape(document.getElementById("single_name").value);
data2send += "&s_vname="+escape(document.getElementById("single_vname").value);
data2send += "&kl_id="+escape(document.getElementById("kl_id").value);
editklasse_ajax_db_anfrage.open("POST", url, true);
editklasse_ajax_db_anfrage.onreadystatechange = zeigeBestaetigung_schuler;
editklasse_ajax_db_anfrage.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
editklasse_ajax_db_anfrage.send(data2send);
} else {
document.getElementById("feedback_data").innerHTML = "Es konnte keine Verbindung zum Server aufgebaut werden.";
document.getElementById("feedback").style.visibility = "visible";
document.getElementById("speichern").focus();
}
}
Beide rufen die gleiche php-Datei mit folgendem Code auf:
include 'inc/inc_config.php';
$db = @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die(mysql_error());
@mysql_select_db(MYSQL_DATABASE,$db) or die(mysql_error());
$s_name = mysql_escape_string($_POST['s_name']);
$s_vname = mysql_escape_string($_POST['s_vname']);
$kl_id = mysql_escape_string($_POST['kl_id']);
$schuler_schon_drin_test = @mysql_query("SELECT * FROM schuler WHERE name='$s_name' AND vname='$s_vname'");
$jawoll = mysql_num_rows($schuler_schon_drin_test);
if ($jawoll>0) {
echo "Den Schüler <i>".$s_vname." ".$s_name."</i> gibt es in der Klasse bereits.<br>Korrigieren Sie eventuelle Tippfehler oder geben Sie mehrere Vornamen ein.";
} else {
$myglobals = mysql_fetch_row(@mysql_query("SELECT schueler_id FROM globals"));
$schulerId = $myglobals[0]+1;
$update_globals = @mysql_query("UPDATE globals SET schueler_id='$schulerId'");
$insertSchuler = @mysql_query("INSERT INTO schuler (id,name,vname,kl_id) VALUES ('$schulerId','$s_name','$s_vname','$kl_id')");
echo "Schüler neu angelegt";
}
Einen einzelnen Schüler einzufügen klappt. Aber viele klappt leider nicht. Ich bekomme folgende Fehlermeldung:
Fehler: uncaught exception: [Exception... "Component returned failure code: 0x804b000f [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x804b000f (<unknown>)" location: "JS frame :: http://127.0.0.1/~username/js/dateiname_ajax.js :: schuelernamen_speichern :: line 64" data: no]
function zeigeBestaetigung_schuler(){
if (editklasse_ajax_db_anfrage.readyState == 4) {
if (editklasse_ajax_db_anfrage.status == 200) {
usw.
Die Meldung wird durch die Status-Abfrage ausgelöst. Ich hatte gedacht, dass der Fehler durch
editklasse_ajax_db_anfrage.onreadystatechange = zeigeBestaetigung_schuler;
ausgelöst wird, da es durch die Schleife mehrfach durchlaufen wird. Also hatte ich rausgenommen. Ohne Erfolg.
Hat hier jemand eine Idee woran es liegt und eventuell einen Lösung?
hi,
Einen einzelnen Schüler einzufügen klappt. Aber viele klappt leider nicht. Ich bekomme folgende Fehlermeldung:
Fehler: uncaught exception: [Exception... "Component returned failure code: 0x804b000f [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x804b000f (<unknown>)" location: "JS frame :: http://127.0.0.1/~username/js/dateiname_ajax.js :: schuelernamen_speichern :: line 64" data: no]
Die Meldung wird durch die Status-Abfrage ausgelöst.
Wie kommst du darauf?
Die Meldung bezieht sich doch auf den setRequestHeader-Aufruf.
Ich hatte gedacht, dass der Fehler durch
editklasse_ajax_db_anfrage.onreadystatechange = zeigeBestaetigung_schuler;
ausgelöst wird, da es durch die Schleife mehrfach durchlaufen wird. Also hatte ich rausgenommen. Ohne Erfolg.
Die Schleife ist Schuld - aber auf andere Weise.
Du versuchst mit ein und demselben XMLHttpRequest-Objekt mehrmals Daten zu senden.
Das funktioniert nicht - nach dem ersten senden kannst du nicht einfach neue Requestheader auslösen, weil du bereits Inhalte geschickt hast.
FÜr jeden Request ein "frisches" XMLHttpRequest-Objekt zu nutzen, sollte das Problem lösen.
gruß,
wahsaga
Wie kommst du darauf?
Die Meldung bezieht sich doch auf den setRequestHeader-Aufruf.
Genau genommen bekomme ich auch zwei Meldungen. Die erstere nennt
Fehler: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://127.0.0.1/~ingobartling/classmanager/js/editklasse_ajax.js :: zeigeBestaetigung_schuler :: line 79" data: no]
Quelldatei: http://127.0.0.1/~username/js/editklasse_ajax.js
Zeile: 79
als Fehler. Da der Fehler ab durch setRequestHeader-Aufruf ausgelöst wird, hatte ich nur den genannt.
FÜr jeden Request ein "frisches" XMLHttpRequest-Objekt zu nutzen, sollte das Problem lösen.
Ist das denn sinnvoll so zu machen. Damit erzeuge ich doch einen Menge "hin und her", oder? Wie wird so etwas denn sonst gelöst. Also wenn man viele Einzeldaten per POST durch die Gegend schickt. Sollte ich nicht besser versuchen alle Daten auf einmal zu schicken? Oder ist meine Lösung auch okay?
hi,
Ist das denn sinnvoll so zu machen. Damit erzeuge ich doch einen Menge "hin und her", oder?
Ja, irgendwie schon.
Also wenn man viele Einzeldaten per POST durch die Gegend schickt.
Ja, allein die HTTP-Header dürften einen nicht unerheblichen Overhead darstellen.
Sollte ich nicht besser versuchen alle Daten auf einmal zu schicken?
Ja, könnte man machen.
Oder ist meine Lösung auch okay?
Wenn sie "funktioniert" und bei den zu erwartenden Datenmengen keine Probleme verursacht (Peformance, Dauer) - dann könntest du natürlich dabei bleiben. (Und ich denke, beim Ändern von ein paar Personendaten wird das Datenaufkommen wohl eher gering sein.)
Wie wird so etwas denn sonst gelöst.
Wenn du das ganze per "normalem" Formularversand machen würdest, könntest du bspw. die Eingabefelder so benennen, dass du in PHP ein Array bekommst, welches du dann durchläufst.
Das kannst du per AJAX natürlich analog machen.
gruß,
wahsaga
Wenn du das ganze per "normalem" Formularversand machen würdest, könntest du bspw. die Eingabefelder so benennen, dass du in PHP ein Array bekommst, welches du dann durchläufst.
Kurz zum Ablauf:
Der User muss erst die Anzahl der Schüler angeben. Dann wird mit JS eine Tabelle nach den Muster
<input id="name_1"><input id="vname_1">
<input id="name_2"><input id="vname_2">
etc.
in ein bislang leeres <div> geschrieben.
Der User gibt seine Daten ein und klickt auf speichern.
In der aufgerufenen "AJAX"-Funktion (1. Posting) werden dann die Schüler einzeln in die DB eingetragen.
Das kannst du per AJAX natürlich analog machen.
Wie? Ich baue in JS eine 2-dim Array für die Schüler und schicke das einfach an die php-Datei? Die php-Datei versteht das dann als Array?
Dein anderer Vorschlag wäre dann folgendes gewesen, oder?
<form action="schuler_in_db_eintragen.php" method="post">
<input id="name_1"><input id="vname_1">
<input id="name_2"><input id="vname_2">
etc.
<input type="submit">
</form>
Richtig?
hi,
Dein anderer Vorschlag wäre dann folgendes gewesen, oder?
<form action="schuler_in_db_eintragen.php" method="post">
<input id="name_1"><input id="vname_1">
<input id="name_2"><input id="vname_2">
etc.
<input type="submit">
</form>
Nein, nicht ganz - die Formularfelder mit name="feldname[fortlaufender index]" benennen. Das ergibt dann in PHP ein Array in den übergebenen Daten.
Wie? Ich baue in JS eine 2-dim Array für die Schüler und schicke das einfach an die php-Datei? Die php-Datei versteht das dann als Array?
Per AJAX erzeugst du dann einfach eine Datenstring für POST mit analoger Struktur.
Wenn die Struktur noch unklar ist, teste es mit einem Minimalbeispiel mit ein paar Feldern mit Benennung wie oben beschrieben, und Methode GET - und schau dir dann den Querystring der beim Abschicken aufgerufenen Ressource an.
gruß,
wahsaga
Per AJAX erzeugst du dann einfach eine Datenstring für POST mit analoger Struktur.
Wenn die Struktur noch unklar ist, teste es mit einem Minimalbeispiel mit ein paar Feldern mit Benennung wie oben beschrieben, und Methode GET - und schau dir dann den Querystring der beim Abschicken aufgerufenen Ressource an.
Okay. Ich habe jetzt ein Formular zusammengebaut und die Daten per POST an die php-Datei geschickt. Mit print_r($_POST) habe ich mir die Struktur anzeigen lassen:
Array ( [name] => Array ( [1] => Mustermann [2] => Mustermann ) [vname] => Array ( [1] => Max [2] => Max ) )
Wenn ich das Ganze jetzt über AJAX machen möchte, muss der String, den ich in JS zusammensetze und per POST verschicke haargenau so aussehen?
hi,
Array ( [name] => Array ( [1] => Mustermann [2] => Mustermann ) [vname] => Array ( [1] => Max [2] => Max ) )
Wenn ich das Ganze jetzt über AJAX machen möchte, muss der String, den ich in JS zusammensetze und per POST verschicke haargenau so aussehen?
Wie diese Kontrollausgabe per print_r?
Nein, natürlich nicht - die hat PHP aus seiner internen Datenstruktur erzeugt.
Ich sagte doch schon, _was_ du dir zum Nachvollziehen anschauen solltest - den Querystring eines solchen, per GET versendeten Formulars.
gruß,
wahsaga
Array ( [name] => Array ( [1] => Mustermann [2] => Mustermann ) [vname] => Array ( [1] => Max [2] => Max ) )
Ich sagte doch schon, _was_ du dir zum Nachvollziehen anschauen solltest - den Querystring eines solchen, per GET versendeten Formulars.
Okay, anscheinend habe ich keine Ahnung, was der Querystring genau ist. Ich habe einmal mit GET und einmal mit POST die Daten verschickt und beide Male mir mit print_r() das Array anzeigen lassen. Das meintest du wohl nicht. Was meintest du denn genau?
hi,
Okay, anscheinend habe ich keine Ahnung, was der Querystring genau ist.
http://de.wikipedia.org/wiki/URL#Query-String
gruß,
wahsaga
Na ja, das wusste ich schon. Allerdings wusste ich nicht, wie an den ran kommen sollte. Dann habe ich aber diesen "Befehl" gefunden
print_r($_SERVER);
Und damit habe ich es rausgefunden. Danke für deine Hilfe. Jetzt läuft alles prima.
hi,
Na ja, das wusste ich schon. Allerdings wusste ich nicht, wie an den ran kommen sollte.
Deshalb schrieb ich doch: Per GET verschicken, und in Adresszeile schauen ...
Dann habe ich aber diesen "Befehl" gefunden
print_r($_SERVER);
Und damit habe ich es rausgefunden.
Das ist eine weitere Möglichkeit.
gruß,
wahsaga