Datenbankeinträge sollen sich aufeinander beziehen

rernanded

Erfahrenes Mitglied
Hallo,
eine bestehende Datenbank-Tabelle mit fünf Spalten (ID, eins, zwei, drei, timestamp) soll um ein Feld erweitert werden.
id wird per auto-increment erzeugt.
eins, zwei,drei werden per Formular händisch eingegeben.
Die neue Spalte heisst ref und darin kann man(man muß nicht) nun auch mit dem selben Formular eine id eingeben auf die sich der neue Eintrag bezieht.

Bei der Wiedergabe aller Werte aus der Tabelle möchte ich nun in allen Fällen in denen bei ref eine id eingeben wurde dies auch optisch per Anordnung sichtbar machen.

Wiedergabebeispiel:

3 - maikl - schmitz - essen - 20230727_184613

2 - theodor - willsch - oberhausen - 20230621_184408

1 - ella - schulz - karlsruhe - 20221231_102401


Der nächste Eintrag mit der id = 4 soll sich auf den Eintrag mit der id = 2 beziehen.

Die Wiedergabe sieht bisher so aus:

4 - willi - peters - kiel - 20230727_190313 - ref2

3 - maikl - schmitz - essen - 20230727_184613 - ref

2 - theodor - willsch - oberhausen - 20230621_184408 - ref

1 - ella - schulz - karlsruhe - 20221231_102401 - ref

PHP:
$connection = new mysqli($servername, $username, $password, $dbname);

if ($connection->connect_error) {
     die("Connection failed: " . $connection->connect_error);
}

$sql = " SELECT * FROM tabelle ORDER BY id DESC";

$result = $connection->query($sql);

if ($result->num_rows > 0) {
     
     while($row = $result->fetch_assoc()) {
    
    echo $row["id"];
    echo " - ";
    echo $row["eins"];
    echo " - ";
    echo $row["zwei"];
    echo " - ";
    echo $row["drei"];
    echo " - ";
    echo $row["ts"];
    echo "<hr></hr>";



Soll aber optisch so aussehen:

3 - maikl - schmitz - essen - 20230727_184613 - ref

2 - theodor - willsch - oberhausen - 20230621_184408 - ref
4 - willi - peters - kiel - 20230727_190313 - ref2

1 - ella - schulz - karlsruhe - 20221231_102401 - ref



MONI
 
Zuletzt bearbeitet:
Guten Morgen Moni,
ich habe da Mal zwei Lösungen ausgearbeitet:

1. Aus den Daten baue ich ein neues Array auf und stelle dort, wo ich eine Referenz finde, die referenzierte Zeile voran:
Code:
    <?php
    // Um die Querverweise leichter auflösen zu können,
    // legen wir die Daten als assoz. Array
    // mit der ID als Schlüssel an:
    // $result = $connection->query($sql);
    // if ($result->num_rows > 0) {
    //     while ($row = $result->fetch_assoc()) {
    //         $data[$row[$id]] = $row;
    //     }
    // }

    //Testdaten:
    $data = [
        1 => ['id' => 1, 'name' => 'ulli', 'ref' => 3],
        2 => ['id' => 2, 'name' => 'moni'],
        3 => ['id' => 3, 'name' => 'gitta'],
        4 => ['id' => 4, 'name' => 'sweta'],
        5 => ['id' => 5, 'name' => 'ela', 'ref' => 2]
    ];
    $output = [];
    foreach ($data as $id => $row) {
        // Hat der Datensatz eine Referenz?
        if (isset($row['ref'])) {
            // Wir geben beide Reihen aus,
            // zunächst die referenzierte
            // und dann die aktuelle.
            // Die ID der referenzierten Reihe:
            $refId = $row['ref'];
            // Die referenzierte Reihe:
            $refRow = $data[$refId];
            // Beide Reihen der Ausgabe hinzu fügen:
            $output[] = $refRow;
            $output[] = $row;
            // In den Daten vermerken,
            // dass diese Reihen bearbeitet wurden:
            $data[$refId]['done'] = true;
            $data[$id]['done'] = true;
        }
    }
    var_dump($data);
    var_dump($output);
    // Jetzt können Reihen übrig geblieben sein,
    // die keine Referenz haben und auf die
    // auch keine Referenz zeigt.
    // Wir müssen diese der Ausgabe hinzu fügen:
    foreach ($data as $id => $row) {
        if (!isset($row['done'])) {
            $output[] = $row;
        }
    }
    var_dump($output);
    ?>

2. Ich bearbeite die Daten direkt und verschiebe die Reihe mit dem referenzierten Element direkt vor das aktuelle Element. Dabei verwende ich zwei Funktionen, die ich bei Stackoverflow gefunden habe:
Code:
    //Testdaten:
    $data = [
        ['id' => 1, 'name' => 'ulli', 'ref' => 3],
        ['id' => 2, 'name' => 'moni'],
        ['id' => 3, 'name' => 'gitta'],
        ['id' => 4, 'name' => 'sweta'],
        ['id' => 5, 'name' => 'ela', 'ref' => 2]
    ];
    var_dump($data);
    function searchForId($id, $array)
    {
        foreach ($array as $key => $val) {
            if ($val['id'] == $id) {
                return $key;
            }
        }
        return null;
    }
    function moveElement(&$array, $a, $b)
    {
        $out = array_splice($array, $a, 1);
        array_splice($array, $b, 0, $out);
    }
    function shiftRef(&$data)
    {
        foreach ($data as $idx => &$row) {
            // Hat die Reihe eine Referenz und wurde sie noch nicht bearbeitet?
            if (isset($row['ref']) && !isset($row['done'])) {
                // Die ID der referenzierten Reihe bereit stellen:
                $refId = $row['ref'];
                // Wir ermitteln zunächst den Index
                // des referenzierten Elementes:
                $idxRef = searchForId($refId, $data);
                // Jetzt verschieben wir die referenzierte Reihe
                // vor die aktuelle:
                $idxDest = $idx == 0 ? 0 : $idx - 1;
                moveElement($data, $idxRef, $idxDest);
                $row['done'] = true;
                return true;
            }
        }
        return false;
    }
    while (shiftRef($data) !== false) {
    }
    var_dump($data);
Ich hoffe, damit kannst Du deine Aufgabe lösen.
 
@Sempervium Leider werden nur die jüngsten Werte aus der Tabelle angezeigt = der letzte eingegebene Datensatz = der mit der höchsten id.

MONI
 
Ich hatte beide Versionen getestet und sie hatten funktioniert. Poste doch mal den Code wie Du nach dem Lesen aus der Datenbank das Array $data füllst. Und lass dieses Array mit var_dump ausgeben und poste das Ergebnis.
 
Also in dem Fall zeigt er nur den ersten Datensatz an (id=1). Ich teste an meiner Original-Tabelle! Die Spaltennamen sind andere als im Beispiel oben.
PHP:
$sql = " SELECT * FROM tabelle ORDER BY id DESC";

$result = $connection->query($sql);

if ($result->num_rows > 0) {
  
     while($row = $result->fetch_assoc()) {
 
     $data[$row[$id]] = $row;
      }
     }

//$data = [];
//$output = [];

foreach ($data as $id => $row) {
               // Hat der Datensatz eine Referenz?
        if (isset($row['ref'])) {
            // Wir geben beide Reihen aus, zunächst die referenzierte und dann die aktuelle.
            // Die ID der referenzierten Reihe:
            $refId = $row['ref'];
            // Die referenzierte Reihe:
            $refRow = $data[$refId];
            // Beide Reihen der Ausgabe hinzufügen:
            $output[] = $refRow;
            $output[] = $row;
            // In den Daten vermerken, dass diese Reihen bearbeitet wurden:
            $data[$refId]['done'] = true;
            $data[$id]['done'] = true;
        }
    }

    //var_dump($data);
    //var_dump($output);

    // Jetzt können Reihen übrig geblieben sein, die keine Referenz haben und auf die auch keine Referenz verweist.
    // Wir müssen diese der Ausgabe hinzufügen:
    foreach ($data as $id => $row) {
        if (!isset($row['done'])) {
            $output[] = $row;
        }
    }
    //var_dump($output);

foreach($row as $element) {
      echo '<br />'.$element;
}

?>
Result:

(bildpfad,haupttext,bildzeile,name,mail,ip,ts,id)

1


uploadedimages/bild1.jpg
123456789äääöööüüüÄÄÄÖÖÖÜÜÜßßß000
123abc
M. Walter
mail@testmail.xxx
56.88.142.24
2022-02-06 12:04:09
1
 
Das Auskommentierte hatte ich leider nicht getestet weil ich die Datenbank nicht hatte und es ist auch tatsächlich noch ein Fehler drin:
Code:
$data[$row[$id]] = $row;
An der Stelle ist $id nicht definiert, es muss so lauten:
Code:
$data[$row['id']] = $row;
 
Hatte ich bereits selbst geändert und probiert, dann wird nur noch die id angezeigt, wahrscheinlich die in meinem Result in #7 die ganz oben steht.

Neues result:

1 wird angezeigt, was aber alles unlogisch ist da ich im SQL ein DESC stehen habe. Bei ASC übrigens geht gar nichts.

Das alles fehlt:

uploadedimages/bild1.jpg
123456789äääöööüüüÄÄÄÖÖÖÜÜÜßßß000
123abc
M. Walter
mail@testmail.xxx
56.88.142.24
2022-02-06 12:04:09
1



MONI
 
Damit wir da klarer sehen lass doch mal das $data mit var_dump ausgeben und poste das Ergebnis.

Allerdings sehe ich schon, dass dieses nicht funktionieren kann:
Code:
foreach($row as $element) {
      echo '<br />'.$element;
}
In $row steht das, was als letztes aus der Datenbank ausgelesen wurde. Du musst statt dessen das generierte Array $output ausgeben:
Code:
foreach ($output as $item) {
    echo "{$item['id']} {$item['name']} usw. <br>";
}
 

Neue Beiträge

Zurück