Announcement

Collapse
No announcement yet.

Dynamische Entscheidung über Felder

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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:

    PHP Code:
    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:


    HTML Code:
    +------------+---------------------------------+--------------+---------------+
    | 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:

    HTML Code:
    +---------------+------------+------------+-------------+
    | 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...

  • #2
    Hallo jimmyone,
    Originally posted by jimmyone View Post
    ...Was mache ich hier falsch?
    Naja, deine Abfrage passt nicht ganz zu deiner Problemstellung und aus deiner Where-Bedingung werde ich auch nicht schlau.

    Eine mögliche Lsg. wäre:[highlight=sql]
    select
    nav.anzeige,
    nav.url,
    ifnull(cnt.contentname, ext.extralnk_name) linkname
    FROM
    navigation nav
    INNER JOIN nav_content ncnt ON (nav.id_navigation = ncnt.navigation_id)
    LEFT JOIN content cnt ON (cnt.id_content = ncnt.content_id)
    LEFT JOIN nav_extralnk ext ON (ext.id_extralnk = ncnt.extralnk_id)
    where
    ncnt.bereich_id = ?
    ORDER BY nav.anzeige
    [/highlight]

    Gruß Falk

    P.S.: Das ungeprüfte Einbinden von externen Variablen ($_GET) in den SQL-Code ist gefährlich und bietet einem potenziellen Angreifer die Möglichkeit von SQL-Injection!
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment

    Working...
    X