[Ajax, PHP, JavaScript] Selbe Daten. Unterschiedlicher Empfang
kobold
- javascript
0 Felix Riesterer0 wahsaga0 kobold
Hallo,
ich habe zur Zeit ein seltsames Problem in Verbindung mit Ajax und PHP. Und zwar gebe ich auf einer Seite Benutzername und Passwort ein. Dann werden beim Klick auf "Einloggen" die Daten zuerst per JavaScript (Ajax) an eine PHP Datei gesendet und danach nochmal ganz normal per POST, wenn das Ziel des Formulars geladen wird.
Die PHP Datei speichert dabei immer die empfangenen Daten in eine Datei. Es werden zusätzlich die Länge des Passworts und die MD5-Summe gespeichert.
Das ist der Code:
[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" language="javascript">
<!--
var http_request = false;
function checkInput() {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.open('POST', 'test.php?ajax', false);
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
http_request.send("user="+encodeURIComponent(document.login.user.value)+"&pw="+encodeURIComponent(document.login.pw.value));
alert(encodeURIComponent(document.login.user.value));
alert(escape(document.login.user.value));
while(http_request.status!=200 && http_request.readyState != 4) { }
if(http_request.responseText!="") {
alert(unescape(http_request.responseText));
}
//return (http_request.responseText=="");
return true;
}
//-->
</script>
</head>
<body>
<form name="login" onsubmit="return checkInput();" method="post" action="test.php">
<label for="user">Benutzername: <input id="user" type="text" name="user" maxlength="40" /></label>
<label for="pw">Passwort: <input id="pw" type="text" name="pw" maxlength="25" /></label>
<input type="submit" value="Einloggen!" />
</form>
</body>
</html>[/html]
[b]test.php[/b]
[php]<?php
function demaskieren($string) {
return (get_magic_quotes_gpc()) ? stripslashes($string) : $string;
}
$user = (demaskieren($_POST['user']));
$user .= "\r\n".demaskieren($_POST['pw']);
$user .= "\r\n".md5(demaskieren($_POST['pw']));
$user .= "\r\n".strlen(demaskieren($_POST['pw']));
$user .= "\r\n".print_r($_POST, true);
$fp = false;
if(isset($_GET['ajax']))
$fp=fopen("userlogin_ajax.txt","w");
else
$fp=fopen("userlogin_post.txt","w");
fwrite($fp,$user);
fclose($fp);
?>[/php]
Ich benutze zum Testen folgende Werte: http://parastudios.de/quidoff/test/user.txt
Die entstehenden Dateien sehen so aus:
[u]userlogin_post.txt[/u]
http://parastudios.de/quidoff/test/userlogin_post.txt
[U]userlogin_ajax.txt[/U]
http://parastudios.de/quidoff/test/userlogin_ajax.txt
Wie zu sehen ist, ist das Array $_POST in beiden Fällen gleich. Trotzdem wird die Passwortlänge bei Ajax 4 Zeichen zu viel und auch die MD5 Summe falsch berechnet.
Woran liegt das?
Mir ist aufgefallen, dass die hochgeladenen Dateien unterschiedlich aussehen. Bei mir im Notepad sehen sie gleich aus. Sieht so aus, als hätte die Datei, die per Ajax erstellt wird, einen anderen Zeichensatz. Wie kann ich das ändern?
Lieber kobold,
Sieht so aus, als hätte die Datei, die per Ajax erstellt wird, einen anderen Zeichensatz. Wie kann ich das ändern?
AJAX kommuniziert in der Regel mit UTF-8. Das ist gut so. Deine Scripte arbeiten aber mit ISO-8859-1. Das ist auch gut so. Du kannst Strings in PHP zwischen diesen Kodierungen umwandeln:
utf8_encode()
utf8_decode()
Liebe Grüße aus Ellwangen,
Felix Riesterer.
hi,
Die entstehenden Dateien sehen so aus:
[u]userlogin_post.txt[/u]
http://parastudios.de/quidoff/test/userlogin_post.txt[U]userlogin_ajax.txt[/U]
http://parastudios.de/quidoff/test/userlogin_ajax.txtWie zu sehen ist, ist das Array $_POST in beiden Fällen gleich. Trotzdem wird die Passwortlänge bei Ajax 4 Zeichen zu viel und auch die MD5 Summe falsch berechnet.
Vergleiche mal beide Ressourcen mit dem web-sniffer:
http://web-sniffer.net/?url=http%3A%2F%2Fparastudios.de%2Fquidoff%2Ftest%2Fuserlogin_ajax.txt
http://web-sniffer.net/?url=http%3A%2F%2Fparastudios.de%2Fquidoff%2Ftest%2Fuserlogin_post.txt
Bei den per AJAX übermittelten Daten siehst du des öfteren ein  auftauchen - die Daten werden nicht in ISO-8859-1 kodiert übermittelt.
Das müsste UTF-8 sein - AFAIK arbeitet Javascript _immer_ mit UTF-8.
gruß,
wahsaga
Danke euch beiden. Jetzt funktioniert es bestens.
Aber kann ich nicht JavaScript auch auf ISO-8859-1 umstellen?
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
So scheint es nicht zu funktionieren.
hi,
Aber kann ich nicht JavaScript auch auf ISO-8859-1 umstellen?
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
So scheint es nicht zu funktionieren.
Natürlich nicht - deine Daten sind immer noch in UTF-8 kodiert - du "lügst" jetzt nur in der Angabe, die du dem verarbeitenden Script gegenüber machst.
Wenn du wirklich ISO-8859-1 liefern willst, müsstest du in diese Kodierung umwandeln - per Javascript machbar, aber vermutlich nicht trivial.
Wenn du ISO-8859-1 haben willst, dann solltest du eher serverseitig die Daten von UTF-8 in diese Kodierung umwandeln - utf8_decode().
Sei dir aber im Klaren, dass dabei Zeichen auf der Strecke bleiben können, die ISO-8859-1 nicht abbildet.
Gleich überall mit UTF-8 zu arbeiten, könnte die bessere Wahl sein.
gruß,
wahsaga
Dann werd ich alles auf UTF-8 umstellen.
Danke für die Hilfe.