Login mit Ajax und PHP - Statuscode: 0
Hallo,
ich bin grade am Ajax lernen und wollte einen Login erstellen. Ich kriege aber immer den Statuscode 0, funktioniert also nicht. Ich finde den Fehler nicht, könnt ihr mir helfen?
Ajax Code:
Fornular:
login.php:
dermainzer
ich bin grade am Ajax lernen und wollte einen Login erstellen. Ich kriege aber immer den Statuscode 0, funktioniert also nicht. Ich finde den Fehler nicht, könnt ihr mir helfen?
Ajax Code:
|
|
Javascript-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
function login(user, pass) { var email = user; var pw = hex_md5(pass); // pw mit md5 hashen var req = null; try { req = new XMLHttpRequest(); } catch(ms) { try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(nonms) { try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(failed) { req = null; } } } if(req == null) { alert("error"); } req.open("POST", 'http://localhost/login.php?do=login', true); req.onreadystatechange = function() { switch(req.readyState) { case 4: if(req.status != 200) { alert("req.status: " + req.status); } else { alert("req.responsetext: " + req.responseText); } break; default: return false; break; } }; req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); req.send("username=" + email + "&userpw=" + pw); //" } // login [end] |
Fornular:
|
|
HTML |
1 2 3 4 5 |
<form action="#" onsubmit="login(document.getElementsByName('email').item(0).value, document.getElementsByName('pw').item(0).value);" method="post"> <label for="email">eMail:</label><input type="text" class="textfield" name="email" /><br /> <label for="pw">Passwort:</label><input type="password" class="passwordfield" name="pw" /><br /> <input type="submit" name="submitbutton" value="Login" id="submit" /> </form> |
login.php:
|
|
PHP-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
// session
session_start();
// includes
include('connect.php');
if(!defined(DIRECTLY))
die('Access denied');
switch($_GET['do']) {
/*** login ***/
case "login":
$username = mysql_real_escape_string($_REQUEST['username']);
$userpw = mysql_real_escape_string($_REQUEST['userpw']); //
$query = mysql_query("SELECT * FROM login WHERE username = '{$username}' AND pw = '{$userpw}'");
while($row = mysql_fetch_assoc($query)) {
if($username == $row['username'] && $userpw == $row['userpw']) {
// sessions setzen
$_SESSION['isLogin'] = true;
}
else {
if($_SESSION['isLogin'] == true) {
echo('you are already logged in');
}
else {
echo('incorrect password or username <br /> try again');
}
}
}
break;
/*** logout ***/
case "logout":
session_unset();
session_destroy();
header("Location: index.php");
break;
}
|
dermainzer
Ich kenne mich mit Ajax nicht so aus, aber solltest du nicht in der login.php auch den entsprechenden Status zurückgeben?
Über mich: www.heinervdm.de
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
Hallo,
ich hab die login.php geändert und jetzt geht es, ich kriege aber immer noch den Statuscode 0:
dermainzer
ich hab die login.php geändert und jetzt geht es, ich kriege aber immer noch den Statuscode 0:
|
|
PHP-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$username = mysql_real_escape_string($_REQUEST['username']);
$userpw = mysql_real_escape_string($_REQUEST['userpw']); //
$query = mysql_query("SELECT * FROM login WHERE email = '{$username}' AND pw = '{$userpw}'");
$row = mysql_num_rows($query);
if($row < 1) {
$_SESSION['isLogin'] = true;
}
elseif($row > 0) {
echo('incorrect password or username <br /> try again');
}
|
dermainzer
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dermainzer« (13. April 2009, 12:04)
Mal generell, die Zeile "req.send("username=" + email + "&userpw=" + pw); //"" ist kein AJAX, weil es nicht im XML-Format ist. Um genau zu sein machst du eine trickreiche abart von Lazy Loading. Du kannst das von mir aus aber gerne AJAX nennen, es fehlen ja eh' nur ein paar buchstaben.
Du könntest aber die Zeile "open" umschreiben, dann müsste es gehen.
req.open("POST", 'http://localhost/login.php?do=login&username=xxx&userpw=xxx', true);
PS: ab und zu verweigert er die verbindung weil es ein anderer Server ist. Versuch anstelle von localhost mal local, host oder 127.0.0.1.

Also ich verwende Prototype-JS für AJAX-Aufgaben.
Da kannst du sagen:
Möglich das dir meine Antwort nicht gefällt, aber denk mal an den Vorteil der Standartisierung.
Du könntest aber die Zeile "open" umschreiben, dann müsste es gehen.
req.open("POST", 'http://localhost/login.php?do=login&username=xxx&userpw=xxx', true);
PS: ab und zu verweigert er die verbindung weil es ein anderer Server ist. Versuch anstelle von localhost mal local, host oder 127.0.0.1.

Also ich verwende Prototype-JS für AJAX-Aufgaben.
Da kannst du sagen:
Möglich das dir meine Antwort nicht gefällt, aber denk mal an den Vorteil der Standartisierung.
der Fehler müßte in deinem JavaSript - Code liegen.
genaugenommen hier im switch:
Weil in den unterschiedlichen Stadien des Requests unterschiedliche Statuscodes geliefert werden.
Bei jeder Änderung des Statuses wird die Funktion ausgeführt, weil Event feuert.
Der erste Status ist nunmal aber immer Status: 0 = uninitialized --> der Request wurde noch nicht durch die Methode open() ausgelöst / wurde also noch nicht abgesendet.
Dieser Code wird also immer erzeugt, sobald ein XMLHttpRequest - Objekt instanziert wird.
In deiner Funktion läuft er damit automatisch als erstes in den default-Zweig des switches.
Lösung -> nimm mal dort das "return false" heraus.
@ nocturne: Er verwendet zwar kein xml, aber das "X" in Ajax ist aus den Anfanngszeiten der Technologie. Der Namensgeber selbst sagt heute, dass der Name eigentlich unzutreffend ist (durch das enthaltene 'x' in Ajax), da es eben nicht nur auf xml-Daten beschränkt ist. Unter Ajax werden jegliche Übertragungen subsimiert, die über das XMLHttpRequest - Object abgewickelt werden. Auch Prototype und viele andere Frameworks übermitteln intern eher selten XML-Daten.
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
...
req.onreadystatechange = function() {
switch(req.readyState) {
case 4:
if(req.status != 200) {
alert("req.status: " + req.status);
}
else {
alert("req.responsetext: " + req.responseText);
}
break;
default:
return false;
break;
}
...
|
genaugenommen hier im switch:
|
|
Quellcode |
1 2 3 4 5 |
...
default:
return false;
break;
...
|
Weil in den unterschiedlichen Stadien des Requests unterschiedliche Statuscodes geliefert werden.
Bei jeder Änderung des Statuses wird die Funktion ausgeführt, weil Event feuert.
Der erste Status ist nunmal aber immer Status: 0 = uninitialized --> der Request wurde noch nicht durch die Methode open() ausgelöst / wurde also noch nicht abgesendet.
Dieser Code wird also immer erzeugt, sobald ein XMLHttpRequest - Objekt instanziert wird.
In deiner Funktion läuft er damit automatisch als erstes in den default-Zweig des switches.
Lösung -> nimm mal dort das "return false" heraus.
@ nocturne: Er verwendet zwar kein xml, aber das "X" in Ajax ist aus den Anfanngszeiten der Technologie. Der Namensgeber selbst sagt heute, dass der Name eigentlich unzutreffend ist (durch das enthaltene 'x' in Ajax), da es eben nicht nur auf xml-Daten beschränkt ist. Unter Ajax werden jegliche Übertragungen subsimiert, die über das XMLHttpRequest - Object abgewickelt werden. Auch Prototype und viele andere Frameworks übermitteln intern eher selten XML-Daten.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (13. April 2009, 14:51)
Hi Leute,
ich hab das gemacht, was ihr mit gesagt habt, leider hat nichts etwas gebracht. Deswegen habe ich das Script neu geschrieben, nach diesem Tutorial. Leider funktioniert es jetzt auch nicht, aber vielleicht könnt ihr den Fehler besser sehen, ich kann es jedenfalls nicht...
Formular:
ist das selbe geblieben
JS-Code:
login.php:
Könnt ihr mir bitte nochmal helfen?
Danke schonmal,
dermainzer
ich hab das gemacht, was ihr mit gesagt habt, leider hat nichts etwas gebracht. Deswegen habe ich das Script neu geschrieben, nach diesem Tutorial. Leider funktioniert es jetzt auch nicht, aber vielleicht könnt ihr den Fehler besser sehen, ich kann es jedenfalls nicht...
Formular:
ist das selbe geblieben
JS-Code:
|
|
Javascript-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
var request = false; function login(user, pass) { var email = user; var pw = hex_md5(pass); // diese function ist in einer externen js datei enthalten setRequest(email, pw); } function setRequest(email, pw) { if(window.XMLHttpRequest) { request = new XMLHttpRequest(); } else if(window.ActiveXObject) { try { request = new ActiveXObject("Msxml2.XMLHTTP"); } catch(ex) { try { request = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { alert(e); } } } // else if [end] if(!request) { alert("Fehler beim XMLHTTP-Instanz erzeugen"); } else { alert("asdasd"); var url = "http://127.0.0.1/codesnippetmanageronline/login.php?email=" + email + "&pw=" + pw; //?; //alert(email + pw); request.open('GET', url, true); request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); request.send(null); request.onreadystatechange = interpretRequest; } // if !request [end] } // setRequest [end] function interpretRequest() { alert("interpretRequest()"); switch(request.readyState) { case 4: if(request.status != 200) { alert("Fehler: " + request.status); } else { var xml = request.responseXML; var login = xml.getElementsByTagName('eingeloggt')[0].firstChild.nodeValue; } alert(login); break; } } // interpretRequest [end] |
login.php:
|
|
PHP-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
session_start();
include('connect.php');
if(isset($_REQUEST['email']) && isset($_REQUEST['pw'])) {
header('Content-Type: text/xml; charset=utf-8');
echo("<?xml version="1.0\" encoding=\"utf-8\"?>\n");
echo("<login>\n");
$email = mysql_real_escape_string($_REQUEST['email']);
$pw = $_REQUEST['pw']; // wird schon md5 gehahst übertragen
$query = mysql_query("SELECT * FROM login WHERE email = '".$email."' AND pw = '".$pw."'");
$rows = mysql_num_rows($query);
if($rows == 1) {
echo("\t<eingeloggt>true</eingeloggt>");
$_SESSION['isLogin'] = true;
}
elseif($rows == 0) {
echo("\t<eingeloggt>false</eingeloggt>");
$_SESSION['isLogin'] = false;
}
echo("</login>");
}
else {
echo('access denied');
}
|
Könnt ihr mir bitte nochmal helfen?
Danke schonmal,
dermainzer
setz mal 'request.onreadystatechange' vor 'request.send(null)'
Kommt auf php-Seite etwas an? Vielleicht mal mit
die eingehenden header mitschreiben oder etwas ähnliches...
|
|
Quellcode |
1 2 |
request.onreadystatechange = interpretRequest; request.send(null); |
Kommt auf php-Seite etwas an? Vielleicht mal mit
|
|
PHP-Quelltext |
1 |
file_put_contents("ajax.log", var_export(getallheaders(),true));
|
die eingehenden header mitschreiben oder etwas ähnliches...
Hi ospx,
vielen Dank, du hast mir sehr geholfen
Ich hab nochmal die Pfadangaben in der PHP und JS Datei getauscht/von absolut in relativ geändert und siehe da, es geht
vielen Dank an euch
dermainzer
edit: der Statuscode wird immer noch mit 0 zurückgegeben, aber der eigentliche Login funktioniert. Kann das mit dem Statuscode Sicherheitslücken mit sich bringen?
vielen Dank, du hast mir sehr geholfen
Ich hab nochmal die Pfadangaben in der PHP und JS Datei getauscht/von absolut in relativ geändert und siehe da, es geht
vielen Dank an euch

dermainzer
edit: der Statuscode wird immer noch mit 0 zurückgegeben, aber der eigentliche Login funktioniert. Kann das mit dem Statuscode Sicherheitslücken mit sich bringen?
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dermainzer« (13. April 2009, 22:29)
Wann, wo und wie wird Status = 0 zurückgegeben? über ein alert? wo hast du das wie eingebaut? Oder wie sonst?
Du hast vorhin schon verstanden, dass
request.onreadystatechange
ein Eventhandler ist, der mehrfach während der Ausführung eines Requests feuert und somit in den unterschiedlichen Stadien eines Requests am Anfang ein Status =0 normal ist? Wenn du eine Antwort empfängst und auf deiner Seite darstellen kannst, hast du irgendwann auch den status= 4, den du ja haben willst.
Du hast vorhin schon verstanden, dass
request.onreadystatechange
ein Eventhandler ist, der mehrfach während der Ausführung eines Requests feuert und somit in den unterschiedlichen Stadien eines Requests am Anfang ein Status =0 normal ist? Wenn du eine Antwort empfängst und auf deiner Seite darstellen kannst, hast du irgendwann auch den status= 4, den du ja haben willst.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (13. April 2009, 23:10)
Ähnliche Themen
-
PHP »-
function sichern
(24. Oktober 2008, 09:30)
-
(X)HTML & CSS & DHTML & Javascript »-
styles und ajax
(28. April 2008, 15:10)
-
(X)HTML & CSS & DHTML & Javascript »-
Brauche Hilfe: body onload ....
(16. Dezember 2007, 18:51)
-
PHP »-
PHP/Ajax.. was ist das?
(3. Oktober 2007, 15:59)


