Grundlagen: Formulare, Hashes, Optionen

Im meinem Umfeld lernt gerade jemand PHP, vielleicht Grund genug das eine oder andere Gesprächsthema hier mal niederzuschreiben.

Ich benutze gern Hashes zum Aufnehmen von Formulardaten, da man diese dann nett und bequem beieinander hat um sie bspw. an eine Funktion durchzureichen, zu serialieren oder was auch immer.

<input type="text" name="fdata[name]" />
<input type="text" name="fdata[strasse]" />
<input type="text" name="fdata[stadt]" />
<select name="fdata[doenerzutaten][]" multiple="multiple">...</select>
<select name="fdata[lieferart]">...</select>

Die Ergnisse liegen nach dem Versenden im Hash $_POST[„fdata“] oder $_GET[„fdata“], je nach Methode.
So lassen sich zumindest INPUT und TEXTAREA Formularelemente schnell für das Einfügen in eine DB aufbereiten:

<?php
foreach( $_POST["fdata"] as $key => $val ) {
  if (!is_array($val)) $$key = mysql_escape_string( $val );
}
$sql = "INSERT INTO bestellungen
        SET
          name='$name',
          strasse='$strasse',
          stadt='$stadt',
          lieferart='$lieferart'";
mach_sql_query( $sql );
?>

Die Daten eines multiplen SELECT füge ich in einer separaten Tabelle (bestellungen_zutaten) ein, die zwei Datenmengen miteinander verknüpft. In diesem Fall die Tabelle der gesamten Dönerzutaten (zutaten) und die Tabelle der Dönerbestellungen (bestellungen). Die Tabelle hat dann neben dem Primärschlüssel zwei Datenfelder, die den Primärschlüssel der zuvor genannten Tabellen aufnehmen. Ich lege soviele Datensätze an wie es Zutaten bei einer einzelnen Bestellung gibt. Mit dem Bestellungsprimärschlüssel und dem der jeweiligen Zutat.

<?php
foreach( $_POST["fdata"]["doenerzutaten"] as $val ) {
  $val = mysql_escape_string( $val );
  $sql = "INSERT INTO bestellungen_zutaten
          SET
            bestellung_id='$id_der_bestellung',
            zutaten_id='$val'";
  mach_sql_query( $sql );
}
?>

Diese Vorgehensweise hat den Vorteil, daß man beliebige Zutaten hinzufügen kann und bereits vorhandene Zutaten umbenennen kann. Vielleicht wird es einem irgendwann zu blöd die weiße Joghurtsoße Zaziki zu nennen.
Allerdings sollte man auf jeden Fall vermeiden Gurken aus der Bestellliste zu löschen, nur weil die Ernte mal schlecht war, da ältere Bestellungen (mit Gurken) nicht mehr konsistent wären. Vielmehr macht es Sinn Gurken bei der Bestellung zu deaktivieren, vielleicht ist die Ernte im nächsten Jahr wieder OK. So gebe ich jedem Table, wo sowas interesant sein könnte ein kleines Feld „deleted“ mit, worüber ich solche temporären Löschungen vornehemen kann.

Recht einfach auch das Vorselektieren multipler Auswahlmöglichkeiten in einem SELECT. Wir nehmen an im Hash $zutaten liegen die Zutaten, wobei der Key des Hashs dem Primärschlüssel der Daten entspricht. In $zutaten_selected haben wir ein Hash mit den Primärschlüsseln der selektierten Zutaten aus $options.

<?php
foreach( $zutaten as $key => $val ) {
  $form_select_option .= sprintf(
    '<option value="%s"%s>%s</option>',
    $key,
    (in_array( $key, $zutaten_selected ) ) ? ' selected="selected"' : '',
    $val
  );
}
?>