kobold: [Ajax, PHP, JavaScript] Selbe Daten. Unterschiedlicher Empfang

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

  1. 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.

  2. 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.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.

    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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Lieber wahsaga,

      ätsch, ich war schneller! ;-)

      Liebe Grüße aus Ellwangen,

      Felix Riesterer.

  3. 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.

    1. 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

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Dann werd ich alles auf UTF-8 umstellen.

        Danke für die Hilfe.