Hallo dedlfix!
Danke für die ausführliche Antwort!
Wenn du Kategorien so aufteilst, dann kommst du bei mehr Ebenen gleich mal auf (mindestens) drei Tabellen. Hauptkategorien mit Kindern, Unterkategorien mit Eltern und Kindern (in beliebiger Anzahl an Ebenen - oder noch extremer für jede Ebene eine Tabelle), und Endkategorien nur mit Eltern ohne Kinder. Wenn sich nicht gravierende Unterschiede in Daten, die noch zu einer Kategorie dieser "Arten" abgelegt werden sollen, ergeben, so ist das Ergebnis eigentlich nur eine unnötig hohe Zahl an Tabellen und eine ziemliche Verzettelung. Das wäre dann totnormalisiert.
Also in meinem speziellen Fall gibt es nie mehr als die 2 schon bekanntenen Ebenen. Ein Link gehört zu einer Unterkategorie und diese Unterkategorie gehört zu einer Kategorie. Eine weitere Verschachtelung bzw. Unterteilung kommt nicht in Frage für mich. Ist es dann noch immer eine "Totnormalisierung", wenn ich Kategorien und Unterkategorien in 2 seperate Tabellen stecke? Mit den Links habe ich dann _insgesamt_ genau 3 Tabellen. Das finde ich jetzt noich keine "Verzettelung". Siehst Du das anders?
Nur verstehe ich Dein PHP nicht. Wo kommt das "
$category['subcategories']" plötzlich her?
Das korrespondiert mit dem Array, das ich vorgeschlagen habe.
Aaaaahhhh, natürlich. Jetzt ist es mir klarer.
Ich verwende generell englische Bezeichner, da hat man es (bis auf Ausnahmen) leichter mit der Pluralbildung. Im Deutschen unterscheiden sich die Formen manchmal nicht. Und oftmals sind die Wörter auch kürzer.
Das finde ich eine sehr gute Idee! Ich werde das ab jetzt auch so handhaben! Danke für den Input!
Definiere "logisch richtig angeordnet"!
Ich meinte damit nur, dass die Unterkategorien zur jeweils dazugehörenden Hauptkategorie geschrieben werden bei der Ausgabe. Aber die Ausgabe aller Kategorien und Unterkategorien als Liste mit nur 1 Tabelle für die Kategorien ist ja zwischenzeitlich schon gelöst.
Die Kategorien sind in der Reihenfolge, wie du sie sortiert ausgegeben hast, oder wie das DBMS denkt, wenn du nicht sortieren lässt (zweites Sortierkriterium nach dem 0-oder-nicht-0).
Da kommt jetzt etwas dazu, was ich bis jetzt nicht geschrieben habe, weil es für die gepostete Fragenstellung irrelevant gewesen ist: Meine Linksammlung ist so programmiert, dass der Klick auf ein Lesezeichen zunächst immer auf die Ressource 'goto_link.php' verweist. Zum Beispiel in der Form 'http://goto_link.php?id=435'.
Dann passiert Folgendes: Jede Kategorie, jede Unterkategorie und jeder Link hat in der Tabelle auch eine Spalte 'Aufrufe' (INT-Felder). Die Ressource 'goto_link.php' erhöht nun via PDO den aktuellen Wert von 'Aufrufe' in allen 3 Tabellen. Ich weiß somit genau, wie oft ich einen bstimmten Link aufgerufen habe und wie oft Links aus jeder Kategorie sowie jeder Unterkategorie aufgerufen worden sind. Somit kann ich mir bei der Ausgabe zB. aller Links der Unterkategorie 'Kulinarisches' die Seitenverweise nicht nur alphabetisch, sondern auch nach Häufigkeit des Aufrufs ausgeben lassen. Und danach erfolgt mittels header('Location: ... ') eine Weiterleitung zur entsprechenden Adresse.
(Das war übrigens die Hauptmotivation, wieso alle meine Lesezeichen jetzt in Kürze in einer DB landen. Nicht nur, dass ich dann von jedem PC dieser Welt darauf zugreifen kann, mir geht bei geschätzten zig1000 Links die Sucherei oft sehr auf die Nerven. Und das Verwenden der 'Lesezeichen verwalten'-Funktion von Firefox ist da zwar etwas hilfreich, mir aber genauso unsympathisch.)
Die Unterkategorien stehen bei der jeweiligen Hauptkategorie, weil beim Durchlaufen der Hauptkategorien zu jeder davon die Unterkategorien durchlaufen werden, bevor die nächste Hauptkategorie an die Reihe kommt.
Du läufst einfach durch die jeweilige List der Unterkategorien anstatt durch alle Unterkategorien und dabei zu testen, ob sie dazugehört oder nicht.
OK, ich habe mich damit jetzt lange auseinendergesetzt und das nach dem von Dir vorgeschlagenen Schema gelöst. Es funktioniert und nach 2 Tagen habe ich auch verstanden, wie Du das gemeint hast. Entstanden ist dabei allerdings eine neue Frage: Wenn ich die Kategorien so wie von Dir vorgeschlagen mit dem if($category['subcategories']) ausgebe, dann erhalte ich bei jeder Kategorie, die keine Unterkategorien besitzt, ein "Notice: Undefined index: subcategories in G:\XAMPP\htdocs\test\index.php on line...". Erst, wenn ich das ändere in if(isset($category['subcategories'])), kommen keine Notices mehr.
Wieso ist das so? Und das nehme ich gleich zum Anlass, zu fragen, was genau der Unterschied ist, ob ich jetzt if($foo), if(empty($foo)) oder if(isset($foo)) schreibe?
Schon bei einem Miniaturbeispiel ist doch
auf den ersten Blick viel schneller und einfacher zu erfassen als würde man das Ganze als
schreiben.
Ansichtssache.
Genau das ist es! Wie ich auch schon bei Matthias geantwortet habe: Ich denke, wir sind uns darüber einig, dass es jeder so handhaben soll, wie er den Codezusammenhang am leichtesten mental verarbeiten kann.
Würdest Du da _trotzdem_ mit
htmlspecialchars()arbeiten und wenn ja, wieso?
Ja, weil es ohne nicht richtig ist.
Das verstehe ich nicht so recht.
Oder kannst du garantieren, dass du niemals ein < im kopierten (Beschreibungs-)Text stehen hast?
Ja, das kann ich. Siehe auch der letzte Absatz meine Antwort an Matthias.
Jetzt habe ich, wenn ich wie von Dir vorgeschlagen und zwischnzeitlich auch schon erfolgreich getestet, allerdings ein Problem: Nehmen wir an, die URL zur Seite "Blaue Frösche mit roten Augen" lautet www.example.com/funnyredfrogs und gehört in meiner DB zur Kategorie 'Natur' mit der ID '5' und der Natur-Unterkategorie 'Kurioses' mit der ID '29'. Dann würden ja bei Deiner Lösung die entsprechenden Teile meiner 2 Tabellen so aussehen:
Tabelle Kategorien:
ID | name | parent_id
-------------------------
5 | Natur | 0
29 | Kurioses | 5
Tabelle Links:
ID | name | URL | Unterkategorie
--------------------------------------------------------------------
687 | Blaue Frösche | www.example.com/funnyredfrogs | 29
Jetzt müsste ich ja theoretisch nicht auch noch die Hauptkategorie speichern weil ja durch die erste Tabelle hervorgeht, zu welcher Kategorie die Unterkategorie 29 gehört. Aber wie mache ich es dann, die Links _inclusive_ dem ausgeschriebenen Namen von Unterkategorie _und_ Kategorie auf den Bildschirm zu bekommen? Also eine Ausgabe wie:
Kategorie | Unterkategorie | Link
------------------------------------------
Natur | Kurioses | Blaue Frösche
Ich überlege jetzt schon seit Stunden, wie ich da für meine DB-Interaktion das SELECT-Query formulieren soll, wenn Kategorie- und Unterkategorienamen in einer Tabelle stehen. Prinzipiell natürlich mit einem JOIN, damit ich zur Nummer aus Tabelle 2 auch einen Namen aus Tabelle 1 habe. ABer wie kommt dann noch der Name der Hauptkategorie dazu? Kannst Du mir da auf die Sprünge helfen bitte? (Heißt es eigentlich 'der', 'die' oder 'das' Query??)
Mit lieben Grüßen
Melvin Cowznofski

What – me worry?