Php mySQL Gruppenwechsel Gruppenbruch, bekomme es einfach nicht hin
Hallo zusammen,
ich habe mich gerade angemeldet, weil ich den php Gruppenwechsel einfach nicht hinbekomme und hoffe dass mir hier jemand helfen kann.
Ich habe eine Datenbanktabelle mit folgender Struktur:
Es geht um Personen (name) die an zu einem Zeitpunkt (created) einen Eintrag (text) machen.
Die Datensätze würde ich nun als Tabelle pro Person ausgeben, den letzten Datensatz pro Person oben.
Leider bekomme ich es nicht hin.
Bei der ersten Person kommt keine Datensatztabelle, bei der zweiten Person kommt die Datensatztabelle von der ersten Person usw.
Es wäre toll, wenn mir jemand sagen könnte, was ich ändern muss.
Vielen Dank und viele Grüße
Frank11
ich habe mich gerade angemeldet, weil ich den php Gruppenwechsel einfach nicht hinbekomme und hoffe dass mir hier jemand helfen kann.
Ich habe eine Datenbanktabelle mit folgender Struktur:
Name | Typ
-------------+------------
id | int(11)
created | datetime
name | text
text | text
Es geht um Personen (name) die an zu einem Zeitpunkt (created) einen Eintrag (text) machen.
Die Datensätze würde ich nun als Tabelle pro Person ausgeben, den letzten Datensatz pro Person oben.
Leider bekomme ich es nicht hin.
Bei der ersten Person kommt keine Datensatztabelle, bei der zweiten Person kommt die Datensatztabelle von der ersten Person usw.
<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
border: 1px solid;
border-collapse: collapse;
padding: 5px;
}
</style>
</head>
<body>
<?php
include('../db.php');
$sql = "SELECT id, created, name, text FROM beispieltabelle ORDER BY name ASC, id DESC;" ;
$erg = $db->query($sql);
$last_entry = null;
while ($row = $erg->fetch_object()) {
if ($last_entry != $row->name) {
echo '<h1>' . $row->name.'</h1>';
echo "<table>
<thead>
<tr>
<th>Datum</th>
<th>Text</th>
</tr>
</thead>
<tbody>";
$last_entry = $row->name;
}
echo "<tr>
<td>". date("d.m.Y", strtotime($row->created)) . "</td>
<td>". $row->text . "</td>
</tr>
</tbody>
</table>";
}
?>
</body>
</html>
Es wäre toll, wenn mir jemand sagen könnte, was ich ändern muss.
Vielen Dank und viele Grüße
Frank11
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4990385676
Url: https://administrator.de/contentid/4990385676
Ausgedruckt am: 21.11.2024 um 20:11 Uhr
13 Kommentare
Neuester Kommentar
Was ist ein "Gruppenwechsel"?
Zum Problem mit der Ausgabe:
Du hast einen "Off-by-one"-Fehler, aber ich kann jetzt nicht direkt drauf zeigen, wo er her kommt.
Statt mit While-Schleifen solltest du aber lieber mit foreach() arbeiten, das ist effizienter und deutlich handlicher.
Du benutzt scheinbar mysqli_query(), daher könntest du anstelle der While-Schleife benutzen:
Deine ganzen Abfragen auf $last_entry kannst du dann weglassen, da kümmert sich foreach() drum.
Zum Problem mit der Ausgabe:
Du hast einen "Off-by-one"-Fehler, aber ich kann jetzt nicht direkt drauf zeigen, wo er her kommt.
Statt mit While-Schleifen solltest du aber lieber mit foreach() arbeiten, das ist effizienter und deutlich handlicher.
Du benutzt scheinbar mysqli_query(), daher könntest du anstelle der While-Schleife benutzen:
foreach($erg as $row) {
echo '<h1>' . htmlentities($row->name) . '</h1>';
//... und dein weiterer Code
}
Deine ganzen Abfragen auf $last_entry kannst du dann weglassen, da kümmert sich foreach() drum.
Vielleicht solltest du erstmal die Datenbankstruktur in Ordnung bringen - es geht doch wohl noch um das gleiche Thema wie in dem Thread im Datenbankforum, oder?
Bei der ersten Person kommt keine Datensatztabelle, bei der zweiten Person kommt die Datensatztabelle von der ersten Person usw.
Das Problem dürfte das </tbody> und </table> sein was du nach jedem Datensatz mit ausgibst. Die jeweilige Tabelle darf nur geschlossen werden wenn eine Gruppe abgeschlossen ist - bzw. dann wenn eine neue Gruppe beginnt und das nicht die erste Gruppe ist ($last_entry ist dann nicht null) sowie nach der letzten Gruppe.
mysqli ist Richtig, meine db.php lautet:
Warum quälen sich alle mit MySQLi? PDO ist viel einfacher und dort gibt es auch so praktische Dinge wie die PDO::FETCH_*-Konstanten als Parameter von fetchAll, siehe z.B. Beispiel 4b.
<?php
$db = mysqli_connect(host, benutzer, passwort, name);
mysqli_query($db, "SET NAMES 'utf8'");
?>
Mal abgesehen davon dass man ?> quasi immer weglassen sollte ist das "SET NAMES" falsch, siehe Handbuch (es muss heißen utf8mb4 und über die Methode set_charset()).
Du benutzt scheinbar mysqli_query(), daher könntest du anstelle der While-Schleife benutzen:
while oder foreach ist ziemlich egal, aber …
echo '<h1>' . htmlentities($row->name) . '</h1>';
… sowohl h1 als auch htmlentities sind falsch: eine Überschrift erster Ebene kann das rein logisch nicht sein, es muss mindestens die zweite Ebene sein. Und den Kontextwechsel zu behandeln ist zwar grundsätzlich natürlich richtig, die richtige Funktion hierfür ist aber htmlspecialchars, htmlentities macht zu viel.
Zitat von @frank11:
Wenn ich </tbody> und </table> testweise komplett weglasse, ändert das leider nichts an dem Problem
"Bei der ersten Person kommt keine Datensatztabelle, bei der zweiten Person kommt die Datensatztabelle von der ersten Person usw."
Wenn ich </tbody> und </table> testweise komplett weglasse, ändert das leider nichts an dem Problem
"Bei der ersten Person kommt keine Datensatztabelle, bei der zweiten Person kommt die Datensatztabelle von der ersten Person usw."
Einfach weglassen darfst du </tbody> und </table> natürlich nicht einfach, das Ergebnis muss schon gültiges HTML sein. Wenn das Problem auch mit validem HTML nicht behoben ist solltest du mal Datenbankstruktur und Testdaten (als CREATE-TABLE- und INSERT-Querys!) posten damit sich das Problem nachstellen lässt.
Auch ist die Überschrift nun testweise h1, eigentlich soll das ja irgenwann mal ein Accordion werden.
Tipp: Bootstrap und besonders sowas überflüssiges wie jQuery braucht es da garnicht, <details> existiert.
Nein, so lässt sich die Tabelle nicht zum Testen einfach importieren - dafür braucht es einen CREATE-TABLE-Query wie er üblicherweise von Admin-Tools (z.B. Adminer oder phpMyadmin) erzeugt wird.
Ich könnte die Tabelle exportieren als sql-Datei hier zur Verfügung stellen, wäre das hilfreich?
Jein. Ein Export der Daten ist schon richtig und hilfreich - aber nicht einfach alles sondern nur eine handvoll Daten mit denen sich das Problem nachvollziehen lässt. Die hier natürlich als INSERT-Query hier posten (nicht als Datei anhängen soweit das hier überhaupt ginge) und nicht vergessen ggf. persönliche Daten zu entfernen.
Zitat von @frank11:
ich habe die Tabelle auf 50 Datensätze gekürzt und anonymisiert.
Ein Testimport in eine andere Datenbank hat funktioniert.
ich habe die Tabelle auf 50 Datensätze gekürzt und anonymisiert.
Ein Testimport in eine andere Datenbank hat funktioniert.
Nein, der Import funktioniert nicht fehlerfrei, beim Anlegen des primary-Keys kracht es da es mehrere Datensätze mit der gleichen ID gibt.
Ist aber egal, testen lässt es sich auch so und es ist genau wie ich schon schrieb: du musst valides HTML erzeugen. Wenn ich </tbody> und </table> korrekt einfüge so das jede Tabelle wieder geschlossen wird (siehe oben), wird auch jede Tabelle bei dem dazugehörigen Benutzer angezeigt.
Das hab ich doch oben bereits: vor <h2> (nur wenn $last_entry nicht null ist) sowie nach der while-Schleife - du musst dir einfach das anschauen was der Browser an Quelltext geliefert bekommt, da müssen die Elemente richtig verschachtelt sein (ob die Zeilenumbrüche im Quelltext "richtig" sind oder nicht ist egal).