Hauke Hammerich: Mehrere Checkboxwerte in MySQL-DB schreiben?

Hallo!

Ich habe folgendes Problem.
Ich habe ein Formular für eine HP einer Freiwilligen Feuerwehr. Dieses soll ein Formula rzur Einsatzeigabe sein.
Dort sind nun alle möglichen Einsatzfzg. aufgeführt, so daß man diese nur auswählen brauch und dann sollen diese in einer DB gespeichert werden.

Dies sieht dann so aus:

<input type="checkbox" value="Fzg.1" name="einsatz_fahrzeuge[]">
<input type="checkbox" value="Fzg.2" name="einsatz_fahrzeuge[]">
<input type="checkbox" value="Fzg.3" name="einsatz_fahrzeuge[]">

Es ist möglich alle 3 zu markieren. In der DB habe ich nun in einer Tabelle eine Spalte "einsatz_fahrzeuge" in die ich die Daten dann speichern möchte.
Ich weiß das es sich hierbei um ein Array handelt ich bloß jetzt nicht weiterkomm wie ich das mit dem speichern löse. Da ich das Array ja nicht mit einem Mal auslesen kann und somit alle 3 Werte speichern kann.
Ich habe mir überlegt dann eventuell eine extra Tabelle einzurichten und die Werte dann dort zu speichern. Das heißt der Erste Wert in die Erste Spalte usw.. Eine Zuweisung dieser Daten wäre über ein Datum + Uhrzeit ja eindeutig möglich.
Ist das die einzige Variante und Lösung?
Denn ich habe ca. 30 Checkboxen, so daß die Tabelle ziemlich groß wird.

Gruß
Hauke

  1. Hi,

    schaue dir mal die Spaltentypen Enum und Set an, die sollten dir weiterhelfen.

    Viele Grüße, Chrisi ...

  2. Da ich das Array ja nicht mit einem Mal auslesen kann und somit alle 3 Werte speichern kann.

    Doch, doch. implode(',', $ein_array) liefert einen String mit den Werten des Arrays und jeweils mit dem angegebenen "Leim"-String dazwischen.

    1. Hallo!

      Da ich das Array ja nicht mit einem Mal auslesen kann und somit alle 3 Werte speichern kann.

      Doch, doch. implode(',', $ein_array) liefert einen String mit den Werten des Arrays und jeweils mit dem angegebenen "Leim"-String dazwischen.

      Das würde dann ja so aussehen
      $einsatzfzg = implode(",", $einsatz_fahrzeuge)
      oder?
      Das heißt also das dann in der Spalte steht Fzg.1,Fzg.2,...
      Gibt er das dann nachher auch so aus?
      Weil dann habe ihc das Problem das ich teilweise Kommas gesetzt haben möchte aber teilweise auch nicht.

      Gruß
      hauke

      1. Das würde dann ja so aussehen
        $einsatzfzg = implode(",", $einsatz_fahrzeuge)
        oder?

        ja, so kann man das machen.

        Das heißt also das dann in der Spalte steht Fzg.1,Fzg.2,...
        Gibt er das dann nachher auch so aus?

        Wer "er"? :-)

        Du musst schon selber wissen, ob du das so oder anders in der DB stehen haben möchtest.

        Mal angenommen du schreibst das so in die DB. Da gibt es auch diverse Möglichkeiten zur String-Ersetzung oder auch die Umkehrfunktion zu implode: explode

        Ich kann dir leider nur zu diesem Teilaspekt was sagen, da ich weder die gesamte Aufgabenstellung noch dein Datenmodell kenne.

        Vielleicht gibt es da ja noch eine Tabelle, in der für jedes Fahrzeug ein Datensatz enthalten ist. Dann würde sich eventuell auch eine extra Verknüpfungstabelle eignen, die die Verbindung zwischen den Einsatzfahrzeugen und den Einsätzen herstellt. Das wäre dann das Prinzip wie hier beschrieben: </archiv/2005/2/t101281/>

        1. Hallo!
          Erstmal danke für Deine Antworten!

          Das würde dann ja so aussehen
          $einsatzfzg = implode(",", $einsatz_fahrzeuge)
          oder?

          ja, so kann man das machen.

          Das heißt also das dann in der Spalte steht Fzg.1,Fzg.2,...
          Gibt er das dann nachher auch so aus?

          Wer "er"? :-)

          Du musst schon selber wissen, ob du das so oder anders in der DB stehen haben möchtest.

          Mal angenommen du schreibst das so in die DB. Da gibt es auch diverse Möglichkeiten zur String-Ersetzung oder auch die Umkehrfunktion zu implode: explode

          Das hatte ich mir auch schon ausgedacht das ich dann bestimmte Werte bei der Ausgabe ersetze.
          Ich kann doch den String auf bestimmte Inhalte überprüfen und diese dann ersetzen?

          Ich kann dir leider nur zu diesem Teilaspekt was sagen, da ich weder die gesamte Aufgabenstellung noch dein Datenmodell kenne.

          Vielleicht gibt es da ja noch eine Tabelle, in der für jedes Fahrzeug ein Datensatz enthalten ist. Dann würde sich eventuell auch eine extra Verknüpfungstabelle eignen, die die Verbindung zwischen den Einsatzfahrzeugen und den Einsätzen herstellt. Das wäre dann das Prinzip wie hier beschrieben: </archiv/2005/2/t101281/>

          Das wäre dann die andere Alternative. Das ich dann eine Tabelle erstelle in der Alle Fzg. aufgeführt sind und dann eine Verknüpfung erstelle von Einsatz und Fzg.. Dann brauch ich kein Array mehr sondern übergebe dann einfach den nromalen Wert wie z.B. ausgewählt und schreibe diesen in die DB mit Datum+Uhrzeit und Ordne diesen dann in der Verknüpfungstabellen zu.
          Aber ist das nicht zu umständlich?

          Gruß
          Hauke

          1. Ich kann doch den String auf bestimmte Inhalte überprüfen und diese dann ersetzen?

            ja, das geht beispielsweise mit strtr()

            [...Verknüpfungstabelle...]

            Aber ist das nicht zu umständlich?

            Das kommt ganz drauf an...™ Beantworte dir folgende Fragen:

            (1) Lohnt es sich, eine Fahrzeugtabelle anzulegen? Sollen für jedes Fahrzeug weitere Daten in der DB gehalten werden? (Kennzeichen, Typ, Farbe ;-), ...)

            (2) Sollen für jedes am Einsatz beteiligte Fahrzeug weitere Daten festgehalten werden? (Kommentare zu diesem Fahrzeug (vielleicht weil was beschädigt wurde), Verbrauch von Materialien, ...)

            Wenn (2) nicht notwendig ist, du aber gern (1) hättest, können beispielsweise die IDs von (1) trennzeichensepariert in ein Feld der Einsatz-Tabelle geschrieben werden. Das ist aber nur bedingt zu empfehlen, weil du dann erst an diesem Trennzeichen explodieren musst und dann die Fahrzeugnamen einzeln abfragen musst. Vielleicht hast du die Fahrzeugnamen aber schon in einem Array drinstehen, weil du sie an anderer Stelle des Script auflisten möchtest. Dann würde ja ein Array-Zugriff reichen.

            Mit der Verknüpfungstabelle kannst verschiedene Daten von der DB ein _einer_ Abfrage ermitteln lassen, z.B. so:

            SELECT e.Grund, e.Zeit, f.Name, f.Typ, fe.Kommentar, ...
            FROM Einsatz e
            LEFT JOIN FahrzeugeProEinsatz fe ON e.ID = fe.ID_Einsatz
            LEFT JOIN Fahrzeuge f ON fe.ID_Fahrzeug = f.ID
            ORDER BY e.Zeit
            WHERE...
            LIMIT...

            Das ergibt dann pro am Ensatz beteiligtem Fahrzeug ein Ergebniszeile.