[Ajax, PHP, JavaScript] Selbe Daten werden bei Ajax und POST unterschiedlich gesendet

Quidoff

Lieutenant
Dabei seit
Feb. 2005
Beiträge
893
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>&nbsp;&nbsp;
	<label for="pw">Passwort: <input id="pw" type="text" name="pw" maxlength="25" /></label>
	<input type="submit" value="Einloggen!" />                 
</form>
</body>

</html>
test.php
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);
?>
Ich benutze zum Testen folgende Werte: Link
(Das Forum zeigt & #180; als das Zeichen an, nicht aber als reinen Text)


Die entstehenden Dateien sehen so aus:
userlogin_post.txt
Link

userlogin_ajax.txt
Link

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?

//edit
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?

//edit2
Also JavaScript benutzt den UTF-8 Zeichensatz und PHP benutzt ISO-8859-1. Ich kann mithilfe der Funktion utf8_decode() den von JavaScript kommenden String in einen PHP String umwandeln. Aber gibt es eine Möglichkeit, die Daten gleich in ISO-8859-1 per JavaScript zu schicken?
HTML:
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
Das funktioniert so nicht.
 
Zuletzt bearbeitet:
Top