MiSo: AJAX / PHP /SQL Formulare in die Datenbank packen.

Ich hab mir was ausgedacht, wie ich die Inhalte aus einem Formular per JavaScript hole und sie in eine MySQL Datenbank eintrage per PHP. Dazu würd ich gern mal eure Meinung hören und Hinweise auf Probleme die dabei evtl. auftauchen könnten.

Man nehme ein beliebiges Formular...
<form name="beliebig">
<input type=text name="feld1">
<input type=text name="feld2">
<input type=text name="feld3">
<input type=button value="submit" onclick="eintragen(this.form.name);">
</form

Dazu das passende Script:

<script type="text/javascript">
function eintragen(formname)
{
var eingabefelder = document.forms[formname].getElementsByTagName('input');
              var queue='';
              for (var i=0; eingabefelder[i]!=null; i++)
              {
                  if (eingabefelder[i].type=='text')
                  {
                      queue = queue + eingabefelder[i].name + '=' + escape(eingabefelder[i].value) + '&';
                  }
              }

if (window.XMLHttpRequest)
    { // Mozilla, Safari, ...
      http_request = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    { // IE
      http_request = new ActiveXObject("Microsoft.XMLHTTP");
    }

http_request = new XMLHttpRequest();
    http_request.overrideMimeType('text/xml');

http_request.open('POST', 'eintragen.php', true);
    http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    http_request.setRequestHeader("Connection", "close");

http_request.send(queue);

http_request.onreadystatechange = function()
    {
      if (http_request.readyState == 4)
      {
         alert(http_request.responseText);
         window.setTimeout("location.reload();", 3000);
      }
    }

}
</script>

Und ein Paar zeilen in der eintragen.php:

foreach ($_POST as $key => $value)
    {
        $keys.= $key . ",";
        $values.= "'$value',";
    }
    $keys = substr($keys,0,-1);
    $values = substr($values,0,-1);

$sql = "INSERT INTO Beispieltabelle($keys) VALUES ($values)";

mysql_query($sql) or die (mysql_error());

echo "eingetragen!";

Was haltet ihr von der Methode, abgesehen von "Abstand"?

mfg
Micha

  1. Wozu willst Du das denn überhaupt mit Ajax eintragen? Was machst Du bei deaktiviertem JS? Selbst, wenn Du die Eingaben mit JS validierst, musst Du es mit PHP eh wiederholen (solltest Du zumindest)...

    1. Ich wills per AJAX machen, da es sich um eine Datenbankinterface handelt und der Seitenaufbau eine ziemlich... verstörende Dauer hat.
      So kann ich (vorausgesetzt ich lass das refreshen sein ^^) viele Eintagungen in kurzer Zeit vornehmen ohne die Seite ständig neu laden zu müssen.

      that much of an example...

      Daten validieren brauch ich an der Stelle nicht großartig. Was kann man da schon an Unsinn bauen bei den Eingaben?

      1. Moin,

        Ich wills per AJAX machen,

        wow, die Stellung kenne ich gar nicht.

        Daten validieren brauch ich an der Stelle nicht großartig. Was kann man da schon an Unsinn bauen bei den Eingaben?

        Nein, Schutzkleidung brauche ich auf einem Motorrad nicht.

        tschö

        1. Nein, Schutzkleidung brauche ich auf einem Motorrad nicht.

          Gegenfrage: und wenn ich das Motorrad in ein Schienenfahrzeug umbau?

          mfg
          Micha

          --
          viel Spass: ie:{ fl:) br:> va:( ls:[ fo:) rl:? n4:{ ss:{ de:> js:} ch:? sh:( mo:) zu:]
          1. Hey,

            Gegenfrage: und wenn ich das Motorrad in ein Schienenfahrzeug umbau?

            und dieser Umbau bedeutet für PHP?

            tschö

            1. Hey,

              Gegenfrage: und wenn ich das Motorrad in ein Schienenfahrzeug umbau?

              und dieser Umbau bedeutet für PHP?

              tschö

              der Bedeutet, dass es mir ziemlich am A**** vorbeigeht, was die Leute denn nun eingeben. Es ist ne kleine private Verwaltungssache für einen Kreis von ca. 6-7 _Programmierern_. Bei solchen Leuten kann man davon ausgehen, dass sie wissen was sie eingeben [1] ;)

              [1] Es sei denn...
              "Programmierer sind sehr schlaue Menschen, die sehr dumme Sachen produzieren."

              mfg
              Micha

              --
              viel Spass: ie:{ fl:) br:> va:( ls:[ fo:) rl:? n4:{ ss:{ de:> js:} ch:? sh:( mo:) zu:]
  2. Tagchen,

    Nicht jeder hat Javascript, das solltest du vorher abfragen! <noscript-variante!>

    Um eine post-version in herkömmlichen html-Format (o. Javascript)kommst du nicht drumrum!

    Ich sehe keinen Vorteil! Ein Vorteil wäre, wenn beim Verlassen eines Feldes dieses gleich abgespeichert wird. Das kann das Script so noch nicht!

    Daten mit Ajax zu holen ist sinniger als daten mit Ajax zu schreiben. Ohne javascript passiert nix, das kann zu Irritationen führen!

    Bin gespannt was du jetzt vor hast!

    Guma

    1. echo $begrüßung;

      Daten mit Ajax zu holen ist sinniger als daten mit Ajax zu schreiben. Ohne javascript passiert nix, das kann zu Irritationen führen!

      Das muss ja nicht so einseitig gemacht werden. Wie wäre es, erst mal vorzusehen, das Formular ganz normal zum Server zu schicken? Wenn Javascript aktiviert ist, fängt man das Absenden ab und ajaxt es stattdessen zum Server. Als Antwort erhält man dann die geändeten Daten, die man in die Seite einbaut, oder ohne Javascript eben eine komplette Seite.

      echo "$verabschiedung $name";

    2. Ich hol ungern Daten über AJAX... die haben immer so ne ekelhafte UTF-8-Kodierung.

      Aber danke für die Anregung. Du hast recht, ne Lösung für Leute ohne JS sollte man einbauen. Dasselbe Formular kann man ja genausogut direkt mit POST an das PHP-Script übergeben. Alle Namen etc. bleiben erhalten...

      mfg
      Micha

      --
      viel Spass: ie:{ fl:) br:> va:( ls:[ fo:) rl:? n4:{ ss:{ de:> js:} ch:? sh:( mo:) zu:]
  3. echo $begrüßung;

    Ich picke mir mal nur den PHP/MySQL-Teil heraus.

    foreach ($_POST as $key => $value)
        {
            $keys.= $key . ",";
            $values.= "'$value',";
        }
        $keys = substr($keys,0,-1);
        $values = substr($values,0,-1);

    $sql = "INSERT INTO Beispieltabelle($keys) VALUES ($values)";

    mysql_query($sql) or die (mysql_error());

    echo "eingetragen!";

    Auch wenn es sich nur um ein privates Projekt handeln sollte, ist eine für die Befehlsschnittstelle der verwendeten Datenbank geeignete Maskierung der Eingabedaten erforderlich. Wenn du auf die Magic Quotes baust, dann mag dieses Feature die größten Gefahren entschärfen, ist aber im Prinzip nicht ausreichend. Ausschalten oder deren Auswirkungen rückgängig machen und für MySQL mysql_real_escape_string() verwenden ist die bessere Wahl.

    Desweiteren kann man ja als Client POST-Daten beliebig fälschen, und z.B. neue hinzufügen. Eine Überprüfung auf die erlaubten Felder wäre sinnvoll.

    // Feldnamen und Default-Werte, falls die $_POST keine Daten für das Feld liefert  
    $data = array('feld1' => 'foo', 'feld2' => 'bar', 'feld3' => 'baz');  
    foreach ($data as $key => $dummy)  
      if (isset($_POST[$key]))  
        $data[$key] = $_POST[$key];
    

    Somit werden nur für die Felder, die $_POST-Daten übernommen, die auch in $data vordefiniert waren.
    Um alle Werte im Array $data mit mysql_real_escape_string() zu behandeln, eignet sich array_map().

    $values = array_map('mysql_real_escape_string', $data);

    Nun sind Daten entschärft, und da wir die Feldnamen selbst bereitgestellt haben, sind diese auch "clean". Um beide Teile für den Befehlsstring aufzubereiten, kann das Array implodiert werden. Das spart die foreach-Schleife und das Entfernen des überflüssigen Trennzeichens. Die Feldnamen werden mittels array_keys() aus dem $data-Array extrahiert.

    $keys = implode(',', array_keys($data));  
    $values = "'" . implode("','", $values) . "'";  
    $sql = "INSERT INTO Beispieltabelle ($keys) VALUES ($values)";
    

    echo "$verabschiedung $name";