Dynamische Entscheidung über Felder

Hallo zusammen,

ich habe hier eine etwas komplizierte Angelegenheit…
Es geht um die Erweiterung einer Website Navigation.

Momentan kann man die Navigation nur auf einen bestehenden Inhalt verlinken. Sprich man hat die Auswahl aus einem bestehenden Content einen Link zu bilden.

Dazu werden Infos aus zwei Tabellen geholt…
Einmal für die Anzeige des Namens, also das was der User als Link zu sehen bekommt, bestehend auf der Content Tabelle und den URL kommend aus der Navigationstabelle…

Die Erweiterung soll so aussehen, das man auch eigene Links dieser Navigation hinzufügen kann…
Der größte Teil der Umsetzung ist schon passiert, da gibt es keine besonderen Probleme.

Aber ich stoße trotzdem auf eins… Ich kann an der Stelle die Namensinfo nicht aus der Content Tabelle holen, weil es für diesen „extra“ Link keinen Content gibt. Ich habe jetzt also eine weitere Tabelle, welche eben diese Namen erfasst… Der URL dazu wird aber weiterhin in der Navigationtabelle eingetragen.

Mein Problem ist zur Zeit folgendes:

Die Namen für die Links kämen jetzt aus zwei Tabellen, einmal der Content und einmal der Extra Link Tabelle…

Die Schleife bzw. der SQL String, welcher läuft um im Administrationsbereich die verfügbaren Navigatiosnpunkte anzuzeigen müsste also seine Infos aus beiden Tabellen holen…

Zur Zeit sieht es so aus, der String aus der Contenttabelle den Namen holt.
Wenn jetzt aber ein Extralink existiert, muss er sich den Namen eben aus der Extralink Tabelle holen…

Die Frage ist, wie baue ich das auf…

Eventuell ist meine Denke aber hier auch falsch. Dann korrigiert mich bitte.

Das Problem ist, ich kann den Namen nicht in die Contenttabelle eintragen, weil sonst in der Bearbeitungsview für den Benutzer, welcher den Content bearbeitet eben ein leerer Inhalt wäre, welcher nur den Link zeigt…
Das würde Verwirrung stiften

Der SQL String sieht so aus:

SELECT
navigation.anzeige,
navigation.url,
content.contentname,
nav_extralnk.extralnk_name
FROM
navigation
INNER JOIN nav_content ON (navigation.id_navigation=nav_content.navigation_id)
INNER JOIN nav_content AS cnt ON (content.id_content=cnt.content_id)
INNER JOIN content ON (content.id_content=cnt.content_id)
LEFT JOIN nav_extralnk ON (nav_extralnk.id_extralnk=nav_content.extralnk_id)
WHERE
content.id_content=nav_content.content_id
OR
nav_extralnk.id_extralnk=nav_content.extralnk_id
AND
navigation.id_navigation=nav_content.navigation_id
AND
nav_content.bereich_id=".(int)$_GET[„bereich“]." ORDER BY navigation.anzeige

Das Ergebnis daraus ist folgendes:

+------------+---------------------------------+--------------+---------------+
| anzeige | url | contentname | extralnk\_name |
+------------+---------------------------------+--------------+---------------+
| 1 | content.php?bereich=1&content=1 | Infos | NULL |
| 2 | content.php?bereich=1&content=2 | Dies und Das | NULL |
| 3 | content.php?bereich=1&content=3 | Test | NULL |
| 4 | http://www.google.de | Infos | Test Eintrag |
| 4 | http://www.google.de | Dies und Das | Test Eintrag |
| 4 | http://www.google.de | Test | Test Eintrag |
+------------+---------------------------------+--------------+---------------+

Wie man sieht, von Anzeige 1 - 3 stimmt alles…
Aber ab 4 stimmts nicht mehr… Zum einen dürfte das Ergebnis mit Anzeige 4 nur einmal auftauchen und das Feld contentname müsste an der Stelle leer bzw. NULL sein. Er müsste hier den extralnk_name Name verwenden.

Die Tabelle nav_content, welche m:n Beziehungen auflöst, ist diese:

+---------------+------------+------------+-------------+
| navigation\_id | bereich\_id | content\_id | extralnk\_id |
+---------------+------------+------------+-------------+
| 128 | 1 | 1 | NULL |
| 127 | 1 | 2 | NULL |
| 132 | 1 | 3 | NULL |
| 135 | 1 | NULL | 3 |
+---------------+------------+------------+-------------+

Was mache ich hier falsch?

Danke für Rückantworten…

Hallo Sebastin,

erste Empfehlung: Vereinfache das Datenmodell und beseitige dann direkt die typischen Programmierfallen aus dem Teil. (okay ist nicht sehr hilfreich, aber das musste sein).
zweite Empfehlung: ohne Tabelleninhalte -besonders der Tabelle nav_content und nav_extralnk- geht garnichts
Dann der Tipp in den Nebel hinein:

FROM
 navigation
 INNER JOIN nav\_content ON (navigation.id\_navigation=nav\_content.navigation\_id)
 INNER JOIN nav\_content AS cnt ON (content.id\_content=cnt.content\_id)
 INNER JOIN content ON (content.id\_content=cnt.content\_id)
 LEFT JOIN nav\_extralnk ON (nav\_extralnk.id\_extralnk=nav\_content.extralnk\_id)
WHERE

müsste das nicht

FROM
 navigation
 INNER JOIN nav\_content ON (navigation.id\_navigation=nav\_content.navigation\_id)
 INNER JOIN nav\_content AS cnt ON (content.id\_content=cnt.content\_id)
 LEFT JOIN content ON (content.id\_content=cnt.content\_id)
 LEFT JOIN nav\_extralnk ON (nav\_extralnk.id\_extralnk=nav\_content.extralnk\_id)
WHERE

da die Tabelle content -wenn ich Dich richtig verstanden habe- für den Testeintrag ja keinen Inhalt hat.

MfG Georg V.

Hallo Georg,

danke für Deine Antwort…
Ich habe das Problem inzwischen schon lösen können, habe es nur noch nicht geschafft, das hier mitzuteilen. Entschuldige daher, das du dir jetzt Arbeit gemacht hast.

Damit das LEFT JOIN an dieser Stelle funktioniert, musste ich die rechte und linke Tabelle rum drehen, OK ich hätte auch ein RIGHT JOIN machen können, aber ich habe statt:

FROM navigation

jetzt

FROM nav_content

stehen. Aus der nav_content bildet sich leztlich die gesamte Navigation. Diese ist eine Zwischentabelle, welche nur IDs enthält, also quasi sämtliche m:n Beziehung auflöst.

Natürlich mussten auch zwei LEFT JOIN und nicht blos einer her.

Ich hab mir einfach ein A4 Blatt genommen und das Modell mal aufgemalt. Da ist dann der Groschen gefallen, wie man so schön sagt.

Du sagst, mein Datenmodell sein zu kompliziert und ich hätte Programmierfallen drin… Kannst Du das etwas näher erötern?
Ich persönlich finde, das dass Datenmodell genau so sein muss…
Dahinter steckt ja ein Konzept, welches ich mir vorher überlegt habe…

Beste Grüße
Sebastian