Mehrere Werte in einer Spalte


BartM

Grünschnabel
#1
Hallo

Habe mir da ein kleines Script erstellt, welches aus einem Formular mit 2 Textfeldern und 4 Checkboxen besteht.
die Werte werden auch in der Datenbank gespeichert und auf einer extra seite angezeigt.

In der Datenbank werden die Werte der Checkboxen in einer Spalte (fahrzeuge ) gespeichert.

so stehen in der Spalte dann die Werte hintereinandere
ELW , MTW , TSF-W , TLF

Wenn ich die Daten dann wieder ausgebe auf einen anderen Seite, dann stehen dort auch diese Werte von der Spalte Fahrzeuge
intereinander.

Jedoch wollte ich die in einer Tabelle haben.


ELW | MTW
-----------------
TSF-W | TLF


Kann ich irgendwie die Werte aus einer Spalte der Datenbank einzeln in einer Tabelle anzeigen lassen ?
 

BartM

Grünschnabel
#3
So lasse ich alle Werte aus der Datenbank anzeigen.



PHP:
 <?php
header("Refresh:10");   
require 'inc/db.php';
echo "<h1>Alamierung</h1>";

 

    
 $daten = array();
if ($erg = $db->query("SELECT * FROM alarm safeshare ORDER BY id DESC LIMIT 1 "))  {
    if ($erg->num_rows) {
        while($datensatz = $erg->fetch_object()) {
            $daten[] = $datensatz;
        }
        $erg->free();
    
    }   
}
if (!count($daten)) {
    echo "<p>Es liegen keine Daten vor :(</p>";
} else {
include ('template/tpl.php');
}
?>

Damit ich das Design einfacher ändern kann habe ich den Html code extra in eine Datei als template gemacht.
hier ist die tpl.php


PHP:
<html>
<head>
</head>
<body>
<table style="width: 516px; height: 144px;" border="1" cellpadding="1"
cellspacing="1">
<thead> <tr>
<th>Datum</th>
<th>Einsatz</th>
<th>Einsatzort</th>
</tr>
</thead> <tbody>
<?php foreach ($daten as $inhalt) {
?> <tr>
<td style=" text-align: center;"><?php echo $inhalt->datum; ?><br>
</td>
<td style=" text-align: center;"><?php echo $inhalt->einsatz; ?><br>
</td>
<td style=" text-align: center;"><?php echo $inhalt->einsatzort; ?><br>
</td>
</tr>
<?php }
?>
</tbody>
</table>
<br>
<br>
<table style="text-align: left; width: 514px; height: 100px;" border="1"
cellpadding="2" cellspacing="2">
<tbody>
<tr style="font-weight: bold;" align="center">
<td style="vertical-align: top;">Fahrzeuge</td>
</tr>
<tr>
<td style=" text-align: center;"><?php echo $inhalt->fahrzeuge; ?><br>
</td>
</tr>
</tbody>
</table>
<br>
</body>
</html>
 

Sempervivum

Erfahrenes Mitglied
#4
Denke, ich verstehe: Die Fahrzeuge stehen als ein String in einer Spalte der Datenbank durch Komma getrennt. In dem Fall kannst Du den String mit explode() zerlegen und die einzelnen Komponenten so anzeigen, wie Du möchtest.
Was ich noch nicht verstehe, ist, warum es zwei Tabellen gibt. Es gibt doch in jeder Zeile der Datenbank einen Satz Fahrzeuge, die jeweils einem Einsatz zugeordnet sind. Dann müssten diese doch innerhalb der Schleife ausgegeben und jeweils dem Einsatz zugeordnet werden?
 

BartM

Grünschnabel
#5
Denke, ich verstehe: Die Fahrzeuge stehen als ein String in einer Spalte der Datenbank durch Komma getrennt. In dem Fall kannst Du den String mit explode() zerlegen und die einzelnen Komponenten so anzeigen, wie Du möchtest.
Was ich noch nicht verstehe, ist, warum es zwei Tabellen gibt. Es gibt doch in jeder Zeile der Datenbank einen Satz Fahrzeuge, die jeweils einem Einsatz zugeordnet sind. Dann müssten diese doch innerhalb der Schleife ausgegeben und jeweils dem Einsatz zugeordnet werden?
Danke
Wie würde das den mit explode() aussehen?

Wieso 2 Tabellen ?

In der Datenbank ist eine Tabelle
Mit folgenden Spalten

Id
Einsatz
Einsatzort
Fahrzeuge
Datum


Das ganze soll für eine Berufsfeuerwehr Tag der Jugendfeuerwehr sein.
 

BartM

Grünschnabel
#7
Siehe
PHP: explode - Manual


In dem Fall meinte ich nicht Tabellen in der Datenbank sondern Tabellen im HTML in deinem Template.

Hatte schon vermutet, dass es für die Feuerwehr ist :)
Achso im Template.

in der eine Tabelle sollen ja nur die Info zu dem „Einsatz „ stehen.

Die Fahrzeuge soll extra in einer Tabelle sein, da ich die eventuell noch etwas größer Anzeigen lassen will.



Wo müsste ich den das mit dem explode() einbauen ?
Es wird ja eine komplette Zeile aus der Datenbank abgefragt und nicht die einzelen spalten.

müsste ich da die Datenbank abfrage auch noch ändern ?
 
Zuletzt bearbeitet:

Sempervivum

Erfahrenes Mitglied
#8
Ich denke, eher weniger die Datenbankabfrage ändern, sondern die Art, wie die gelieferten Daten verarbeitet werden.
Die Fahrzeuge werden ja offenbar so ermittelt:
$inhalt->fahrzeuge
Dann kannst Du daraus ein Array machen:
$fahrzeuge_array = [B]explode[/B] (',', $inhalt->fahrzeuge);
und auf jedes der Fahrzeuge zugreifen.

Was ich immer noch nicht verstehe, ist folgendes: Jede Zeile in deiner Datenbank enthält ein Feld mit den Fahrzeugen. Daher hatte ich bisher angenommen, dass zu jedem Einsatz ein bestimmter Satz von Fahrzeugen gehört. Dem widerspricht jedoch, dass Du für die Fahrzeuge eine eigene Tabelle anlegst; dies würde bedeuten, dass die Fahrzeuge von den Einsätzen unabhängig sind?
 

BartM

Grünschnabel
#9
Ich denke, eher weniger die Datenbankabfrage ändern, sondern die Art, wie die gelieferten Daten verarbeitet werden.
Die Fahrzeuge werden ja offenbar so ermittelt:
$inhalt->fahrzeuge
Dann kannst Du daraus ein Array machen:
$fahrzeuge_array = [B]explode[/B] (',', $inhalt->fahrzeuge);
und auf jedes der Fahrzeuge zugreifen.

Was ich immer noch nicht verstehe, ist folgendes: Jede Zeile in deiner Datenbank enthält ein Feld mit den Fahrzeugen. Daher hatte ich bisher angenommen, dass zu jedem Einsatz ein bestimmter Satz von Fahrzeugen gehört. Dem widerspricht jedoch, dass Du für die Fahrzeuge eine eigene Tabelle anlegst; dies würde bedeuten, dass die Fahrzeuge von den Einsätzen unabhängig sind?

Genau zu jedem Einsatz gibt es ein bestimmter Satz von Fahrzeugen.

Mit der eigenen Tabelle meinte ich, eigentlich das Template.

so das ich dort einmal die infos zum Einsatz habe und darunter dann die Fahrzeuge.


So sollte es später mal aus sehen.
1547669035279.png
 

Sempervivum

Erfahrenes Mitglied
#10
Wenn ich das richtig verstehe, würde das dann bedeuten, dass es zu jedem Einsatz eine Tabelle Fahrzeuge gibt, etwa so:
Code:
Datum    Einsatz  Einsatzort
06.01.19 Test1    Baum
Fahrzeuge
ELW Kater 12    MTW 1-19-1
TSF-W 1-48-1

Datum    Einsatz  Einsatzort
08.01.19 Test2    Wohnungsbrand
Fahrzeuge
ELW Kater 9    MTW 1-19-3
TSF-W 1-48-3
usw.
Gefällt mir gar nicht, aber die einzige Alternative, die ich nahe liegend finde, ist, die Fahrzeuge in der selben Zeile wie z. B. 06.01.19 Test1 Baum anzuordnen, aber dann würde die Tabelle u. U. zu breit. Es sei denn man ordnet die Fahrzeuge untereinander in nur einer Spalte an.
 
#11
Im moment sieht die Tabelle der Datenbank so aus

1547670198476.png


Jeder Einsatz hat seine Eigene ID, Datum wird automatisch gespeichert.
ebenso auch Einsatzort, Einsatz und Fahrzeuge.

Es wird aber immer nur 1 Einsatz und zwar der letzte angezeigt.


Muss ich das dann im Template einfügen oder in der Datei wo die Daten abgefragt werden ?


PHP:
$fahrzeuge_array = [B]explode[/B] (',', $inhalt->fahrzeuge);

Wie kann ich dann auf die Fahrzeuge zu greifen ?
 

Anhänge

Sempervivum

Erfahrenes Mitglied
#12
Es wird aber immer nur 1 Einsatz und zwar der letzte angezeigt.
Wenn sich das auf die Fahrzeuge bezieht, ist es vollkommen plausibel, denn die Tabelle mit den Fahrzeugen gibst Du außerhalb und nach der Schleife über die Datenbankeinträge aus. Dann hat $inhalt den letzten Wert bzw. die letzte Zeile aus der Datenbanktabelle.
Nimm die Generierung der Tabelle mit den Fahrzeugen in die foreach-Schleife mit hinein.
Benutze den Modulo-Operator, um eine neue Zeile anzulegen.
Code:
<?php foreach ($daten as $inhalt) {
?>
<!-- Hier wird zunaechst die Tabelle mit dem Einsatz angelegt
        so wie Du es schon hast -->

<!-- Anschliessend wird die Tabelle mit den Fahrzeugen
     des Einsatzes angelegt -->
<table>
    <caption>Fahrzeuge</caption>
    <tbody>
    <tr>
<?php
$fahrzeuge_array = explode (',', $inhalt->fahrzeuge);
for ($i = 0; $i < count($fahrzeuge_array); $i++) {
    if ($i % 2 == 0 && $i > 0) echo '</tr><tr>';
    $fahrzeug = $fahrzeuge_array[i];
    echo '<td>' . $fahrzeug . '</td>';
}
?>
        </tr>
    </tbody>
</table>
<?php } // Abschluss fuer aeussere Schleife
?>
Ungetestet, ich hoffe, ich habe mich bei den Klammern und öffnenden und schließenden HTML-Tags nicht verlaufen.
 
Zuletzt bearbeitet:
#13
Das müsste ja dann so sein.

Bekomme dann aber nur die Überschrift Fahrzeuge angezeigt, aber keine Fahrzeuge.



HTML:
<html>
<head>
</head>
<body>
<table style="width: 516px; height: 144px;" border="1" cellpadding="1"
cellspacing="1">
<thead> <tr>
<th>Datum</th>
<th>Einsatz</th>
<th>Einsatzort</th>
</tr>
</thead> <tbody>
<?php foreach ($daten as $inhalt) { 
?> <tr>
<td style=" text-align: center;"><?php echo $inhalt->datum; ?><br>
</td>
<td style=" text-align: center;"><?php echo $inhalt->einsatz; ?><br>
</td>
<td style=" text-align: center;"><?php echo $inhalt->einsatzort; ?><br>
</td>
</tr>
  <!-- Anschliessend wird die Tabelle mit den Fahrzeugen
     des Einsatzes angelegt -->
<table>
    <caption>Fahrzeuge</caption>
    <tbody>
    <tr>
<?php
$fahrzeuge_array = explode (',', $inhalt->fahrzeuge);
for ($i = 0; $i < count($fahrzeuge_array); $i++) {
    if ($i % 2 == 0 && $i > 0) echo '</tr><tr>';
    $fahrzeug = $fahrzeuge_array[i];
    echo '<td>' . $fahrzeug . '</td>';
}
?>
        </tr>
    </tbody>
</table>
<?php } // Abschluss fuer aeussere Schleife
?>   
</body>
</html>
 

Sempervivum

Erfahrenes Mitglied
#14
Wie gesagt, ungetestet. Schaltet man die Fehleranzeige ein, erkennt man, dass der Fehler hier liegt:
$fahrzeug = $fahrzeuge_array[i];
Dollarzeichen vor dem i fehlt.
 
#15
Danke.

es funktioniert.
genau so wollte ich es an zeigen lassen.

jetzt muss ich nur noch bisschen das Design anpassen.

Bin noch am überlegen ob ich bei dem Alamieren formular eine button mit alarm Zurücksetzen machen.

so das dann bei der ausgabe steht :

Kein einsatz vorhanden.