kostenloser Webspace werbefrei: lima-city


Datensätze untereinander ausgeben

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    teamfake

    teamfake hat kostenlosen Webspace.

    Hallo zusammen,
    ich habe mal ne Frage:
    Also ich bin gerade dabei ein Forum zu programmieren, aber leider, wenn ich dieDatensätze ausgeben will dann werden die einfach nach und nach abwechselnd ausgegeben. Aber eigentlich wollte ich dass es Topics gibt und Untertopics, die darunter liegen, z.B. Topic = Programmieren, Untertopic = PHP/MYSQL. Ich habe es schon mit WHERE probiert, aber leider komme ich mit dieser Methode nicht ans Ziel. Das einzige was dann geschiet, ist dass man dann nur die gewünschte id ausgibt. Aber würde ich das so machen dann müsste ich ja jede Datenbank neu eintragen, aber das möchte ich ja nicht. Später soll alles über den
    Browser gemacht werden.

    Code (falls nötig):
    $sql_last_eintrag = \"SELECT * FROM Post ORDER BY id desc LIMIT 1\";
    $result_last_eintrag = mysql_query($sql_last_eintrag);
    $sql = \"SELECT * FROM Topic WHERE id = 1\";
    $result = mysql_query($sql);
    $sql_small = \"SELECT * FROM SmallTopics WHERE id = 1\";
    $result_small = mysql_query($sql_small);
    while ($row_last_eintrag = mysql_fetch_assoc($result_last_eintrag)) {
    while ($row_small = mysql_fetch_assoc($result_small)) {
    while ($row = mysql_fetch_assoc($result)) {
    
      echo \"<table cellspacing=\'0\' cellpadding=\'0\' class=\'Topic\'><tr><td>$row[Topic]</td>\";
      echo \"<tr><td class=\'SmallTopic\'>$row_small[SmallTopic]\";
      echo \"<a href=\'$_SERVER[PHP_SELF]?id=$row_last_eintrag[id]\'>$row_last_eintrag[Name], schrieb am $row_last_eintrag[Time]</a>\";
      }
      }
      }
       echo \"</td></tr>\";
      echo \"</table>\\n\";
      ?>


    Ich hoffe ihr könnt mir helfen!

    MfG,
    teamfake
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Also ich habe dein Vorhaben so verstanden, dass es dann so aussehen soll:

    Kategorie
    -Unterforum
    --Thread
    --Thread
    --Thread
    --Thread
    --Thread
    -Unterforum
    --Thread
    -Unterforum
    --Thread
    --Thread
    --Thread

    Wohlgemerkt, alles auf einer Seite.
    (Meiner Meinung nach keine gute Idee)

    Die Verschachtelung deiner while-Schleifen ist unlogisch.
    Es ist klar, dass die Sachen nacheinander ausgegeben werden, da die innerste Schleife die ganze Zeit Daten von Query liest, während die anderen Schleifen nichts tun.
    Ich glaube, du solltest dir noch einmal die Funktionsweise einer Schleife anschauen: http://tut.php-quake.net/schleifen.html#u2


    Also, wenn du es wirklich so lösen willst, wie ich es \"gezeichnet\" habe, dann sollte das etwa so aussehen(Code nicht getestet. Dient nur zu Orientierung!):
    query1=\"SELECT id,name,was_auch_immer FROM kategorie;\"
    
    Kategorie=mysql_query(query1);
    while(cat=mysql_fetch_assoc(Kategorie))
    {
    echo <tr class=\"Kategorie\"><td>$cat[\'name\']...
    $sub1=mysql_query(SELECT id, name, was_auch_immer FROM Unterforen WHERE kategorie=$cat[\'id\']);
    while($foren=mysql_fetch_assoc($sub1))
    {
    echo <tr class=\"Forum\"><td>$foren[\'name\']...
    $sub2=mysql_query(SELECT id,name, was_auch_immer FROM Threads WHERE forum=$foren[\'id\']);
    while(thread=mysql_fetch_assoc($sub2))
    {
    echo <tr class=\"thread\"><td>$thread[\'name\']...
    }
    }
    }



    Ich rate dir aber dringend davon ab, es so zu machen, da du eine cubische Laufzeit damit bekommst!
    Es ist günstiger, wenn du nur Kategorien und Foren anzeigst. Die ganzen Threads(oder was auch immer bei dir an der 3. Stelle kommt) solltest du erst anzeigen, wenn man wirklich in einem Unterforum drin ist.


    Falls das nicht das ist, was du machen willst, dann beschreibe bitte genauer, was dein Problem ist. Es ist nicht direkt erkennbar, was du eigentlich willst.

    Beitrag geändert: 3.2.2008 22:52:51 von bladehunter
  4. e********l

    Für solche Strukturen bieten sich Nested Trees/Sets sehr gut an. Da Boards meist nur selten geändert werden kann und das auslesen prinzipiell sehr schnell ist. Lediglich das ändern/einfügen ist ein relativ aufwendiger Akt.
  5. Autor dieses Themas

    teamfake

    teamfake hat kostenlosen Webspace.

    @bladehunter: Ich will halt mein Forum von dem Prinzip her genauso wie das hier von LC machen. Aber eigentlich wollte ich dass wie du auch schon geasgt hast einen Übertopic machen und dann die ganzen Untertopics. Aber das muss ja zu schaffen sein, wenn ihr das auch hinbekommen habt, oder? Und ihr ändert die Topics ja auch nicht per Programmieren oder?

    @evil-devil: Geht das nicht auch mit einem anderen Kontzept, das das ganze gut ausliest und dann auch noch gut zum ändern der Daten ist? Mit dem phpbb Forum geht das doch auch ganz schnell zum umändern und es wird auch sehr schnell ausgelesen oder?

    MfG,
    Teamfake

    Beitrag geändert: 4.2.2008 10:48:28 von teamfake
  6. e********l

    Wie PhpBB das macht weiß ich gerade nicht. Kann sein das sie Nested Trees/Sets nutzen oder das klassisches ID/Parent Konzept. Aber gerade bei sehr großen Foren mit vielen Themenbereichen sind Sets wesentlich effektiver, du brauchst halt nicht in PHP viele Schleifen. Eine reicht und dann nur noch ein paar IF Abfragen zur Einrückung und gut ist. ID/Parent erzeugt bei großen Boards leider viel Rekursion und die Sache mit dem ändern kann man denke ich außen vor lassen.

    Wann ändert man schon mal die festgelegte Forenstruktur? Selten.
  7. Autor dieses Themas

    teamfake

    teamfake hat kostenlosen Webspace.

    Kannst du mir vielleicht noch erklären wie das Script funktioniert, weil ich hab grad keine Ahnung wo und wie ich des einsetzten soll und auch wie es funktioniert...

    MfG,
    TF


    Beitrag geändert: 4.2.2008 13:45:11 von teamfake

  8. @bladehunter: Ich will halt mein Forum von dem Prinzip her genauso wie das hier von LC machen.

    Also wie hier: http://www.lima-city.de/boards/index ?

    Du verwendest aber 3 Schleifen, während lima sich auf 2 Ebenen beschränkt:
    -Kategorien
    -Foren

    Wenn du dann auf ein Forum klickst, kannst du alle Threads in dem Forum anzeigen.
    Und wenn du dann auf eine Thread klickst, kannst du alle Posts in dem Thread anzeigen.

    Das sind dann halt ein paar Klicks mehr für den Besucher, aber es ist übersichtlicher.

    Deswegen solltest du es wie lima machen.

    Und wie evil-devil gesagt hat, ist es eine gute Idee die Forenstruktur zu cachen, da verschachtelte Schleifen sehr viel Rechenzeit benötigen und im Prinzip immer die gleiche Anordnung von Kategorien und Foren angezeigt wird.
    Nur wenn du mal Änderungen vornimmst, musst du diese Anordnung aktualisieren lassen.


    Kannst du mir vielleicht noch erklären wie das Script funktioniert, weil ich hab grad keine Ahnung wo und wie ich des einsetzten soll und auch wie es funktioniert...

    Welches Script?
    Wenn du mein Script nicht verstehst, dann solltest du wirklich nochmal dein PHP verbessern, da es eigentlich schon recht simpel gehalten ist.

    Sorry, ist einfach so. Wenn du den Code nicht verstehst, dann könnte es wirklich schwierig werden ein ganzes Forum zu proggen.

    Aber falls du konkrete Fragen hast, kannst du sie natürlich hier posten.

    Außerdem habe ich an einigen Stellen Dinge abgekürzt, so dass der Code eh nicht lauffähig ist.

    Außerdem ist die Methode von evil-devil gut und spart Rechenzeit.
  9. Autor dieses Themas

    teamfake

    teamfake hat kostenlosen Webspace.

    @bladehunter: Dein Script habe ich schon verstanden, aber das von evil-devil nicht ganz. Ich schaue im Moment auch gerade nach Nested Trees/Sets, doch was ich finde funktioniert bei mir nicht und das Script passt auch nicht zu den vorgegebenen Datensätzen.

    Zum Beispiel von http://www.php-resource.de/tutorials/read/21/4/:
    SELECT node1.payload,
             COUNT(*) AS level
    
        FROM node AS node1,
             node AS node2
     
       WHERE node1.root_id = 1
         AND node2.root_id = 1
    
         AND node1.lft BETWEEN node2.lft AND node2.rgt
    
    GROUP BY node1.LFT;


    Weil das node1.payload ist in meiner Datenbank gar nicht enthalten. Und da kommt dann immer der Fehler:

    Parse error: syntax error, unexpected T_STRING in /usr/export/www/hosting/teamfake/forum/forum/test/test.php on line 10


    Und diese Zeile wäre diese:
    SELECT node1.payload,


    Grüße,
    TF
  10. e********l


    Kannst du mir vielleicht noch erklären wie das Script funktioniert, weil ich hab grad keine Ahnung wo und wie ich des einsetzten soll und auch wie es funktioniert...


    Script wäre zu umfangreich das hier mal eben zu posten. Stattdessen musst du dich mit einem Tech-Artikel begnügen ;)
    http://www.klempert.de/nested_sets/artikel/
  11. e********l

    So, Doppelpost ;D

    Hab noch nen wenig Code angehängt aus einem älteren Projekt. Vielleicht hilft es dir...
    Auf jeden Fall ist da noch Platz für Optimierungen in der Version.

    <?php
    // read urls
    $mode = urlFetch(\'mode\');
    $lft = urlFetch(\'lft\');
    $rgt = urlFetch(\'rgt\');
    $id = urlFetch(\'id\');
    $lastId = urlFetch(\'lastId\');
    $deep = urlFetch(\'deep\');
    $parentleague = urlFetch(\'parentleague\');
    
    // read only parts of the tree
    // start with the top of all
    if ( $deep == null && ($mode != \"move\" && $mode != \"movesave\") ) {
            $queryString = \"SELECT l1.id, l1.name, count(*)-1 AS level, l1.lft, l1.rgt, l1.isroot
                                            FROM league AS l1, league AS l2
                                            WHERE l1.lft BETWEEN l2.lft AND l2.rgt
                                            AND     l1.id <= 38
                                            GROUP BY l1.lft
                                            HAVING level < 3
                                            ORDER BY l1.lft\";
    } else if ($deep != null && $id != null && ($mode != \"up\" && $mode != \"down\" && $mode != \"move\" && $mode != \"movesave\")) {
            $queryString = \"SELECT l1.id, l1.name, count(*)-1 AS level, l1.lft, l1.rgt, l1.isroot
                                    FROM league AS l1, league AS l2, league AS l3
                                    WHERE l1.lft BETWEEN l3.lft AND l3.rgt
                                    AND       l1.lft BETWEEN l2.lft AND l2.rgt\";
                                    if ($id == null) {
                                            $queryString .= \" AND   l3.id = \".$parentleague;
                                    } else {
                                            $queryString .= \" AND   l3.id = \".$id;
                                    }
                                    
                                    $queryString .= \" GROUP BY l1.lft\";
                                    if ($deep != null) {
                                            $queryString .= \" HAVING level < \".$deep;
                                    }
                                    $queryString .= \" ORDER BY l1.lft\";
    }       
    //echo $queryString.\"<br>\";
    $leagueTreeQuery = $sql->select($queryString);
    
    
    
    function moveMenuElementDown($id, $lft, $rgt) {
            global $sql;
                    
            // get the neighboor element
            $queryString = \"SELECT     lft, rgt, id
                                            FROM    fussi_league
                                            WHERE   lft - 1 = \".$sql->queryParam($rgt).\" LIMIT 1\";
            $neighboor = mysql_fetch_assoc($sql->select($queryString));
            
            // get IDs of element and his childs
            $queryString = \"SELECT     id
                                            FROM    league
                                            WHERE   lft BETWEEN \".$sql->queryParam($lft).\" AND \".$sql->queryParam($rgt).\"                                 
                                            ORDER BY        lft\";
            $result = $sql->select($queryString);
            
            $elements = array();
            while ($row = mysql_fetch_row($result)) {
                    $elements[] = $row[0];  
            }
                                    
            // update neighboor elements and move it to our origin position
            $queryString = \"UPDATE     league
                                            SET             lft = lft - \".($rgt-$lft+1).\",
                                                            rgt = rgt - \".($rgt-$lft+1).\"
                                            WHERE   lft > \".$rgt.\"
                                            AND             rgt <= \".$neighboor[\'rgt\'];
            $sql->update($queryString);
            
            // update element childs
            $queryString = \"UPDATE     league
                                            SET             lft = lft + \".($neighboor[\'rgt\']-$neighboor[\'lft\']+1).\",
                                                            rgt = rgt + \".($neighboor[\'rgt\']-$neighboor[\'lft\']+1).\"
                                            WHERE   id IN (\".implode(\',\',$elements).\")\";
            $sql->update($queryString);  
    }
    
    function moveMenuElementUp($id, $lft, $rgt) {   
            global $sql;
            // get the neighboor element
            $queryString = \"SELECT     lft, rgt, id
                                            FROM    league
                                            WHERE   rgt + 1 = \".$sql->queryParam($lft).\" LIMIT 1\";
            $neighboor = mysql_fetch_assoc($sql->select($queryString));
            
            // get IDs of element and his childs
            $queryString = \"SELECT     id
                                            FROM    league
                                            WHERE   lft BETWEEN \".$sql->queryParam($lft).\" AND \".$sql->queryParam($rgt).\"                                 
                                            ORDER BY        lft\";      
            $result = $sql->select($queryString);
            
            $elements = array();
            while ($row = mysql_fetch_row($result)) {
                    $elements[] = $row[0];  
            }
            
            // update neighboor elements and move it to our origin position
            $queryString = \"UPDATE     league
                                            SET             lft = lft + \".($rgt-$lft+1).\",
                                                            rgt = rgt + \".($rgt-$lft+1).\"
                                            WHERE   rgt < \".$lft.\"
                                            AND             lft >= \".$neighboor[\'lft\'];     
            $sql->update($queryString);
            
            // update element childs
            $queryString = \"UPDATE     league
                                            SET             lft = lft - \".($neighboor[\'rgt\']-$neighboor[\'lft\']+1).\",
                                                            rgt = rgt - \".($neighboor[\'rgt\']-$neighboor[\'lft\']+1).\"
                                            WHERE   id IN (\".implode(\',\',$elements).\")\";     
            $sql->update($queryString);
    }
    
    
    function moveElementToSave($sourceID, $sourceLft, $sourceRgt, $targetID, $deep) {       
            global $sql;
            
            $targetRgt = 0;
            $targetLft = 0;
                    
            // get the IDs of the element and its childs
            $queryString = \"SELECT     id
                                            FROM    league
                                            WHERE   lft     BETWEEN \".$sql->queryParam($sourceLft).\" AND \".$sql->queryParam($sourceRgt).\"
                                            ORDER BY        lft\";
            $result = $sql->select($queryString);
            $elements = array();
            while ($row = mysql_fetch_row($result)) {
                    $elements[] = $row[0];
            }
            
            $elementsToMove = sizeof($elements);
            
            // remove elements from the tree (virtual)      
            $queryString = \"UPDATE     league
                                            SET             lft = lft - \".$sql->queryParam($elementsToMove*2).\"                                                        
                                            WHERE   lft > \".$sql->queryParam($sourceRgt);
            $sql->update($queryString);
            
            $queryString = \"UPDATE     league
                                            SET             rgt = rgt - \".$sql->queryParam($elementsToMove*2).\"
                                            WHERE   rgt > \".$sql->queryParam($sourceRgt);
            $sql->update($queryString);  
            
            
            // get the lft and right of our target element (after the elements were removed)
            $queryString = \"SELECT     lft, rgt
                                            FROM    league
                                            WHERE   id = \".$sql->queryParam($targetID).\"
                                            LIMIT   1\";
            $result = $sql->select($queryString);
            $rst = mysql_fetch_row($result);
            
            $targetLft = $rst[0];
            $targetRgt =  $rst[1];
            
            // calculate source and target difference
            $difference = $targetRgt - $sourceLft;
            
            // create some free room, where we can place our elements
            $queryString = \"UPDATE     league
                                            SET             lft = lft + \".$sql->queryParam($elementsToMove*2).\"
                                            WHERE   lft > \".$sql->queryParam($targetRgt).\"
                                            AND             id NOT IN (\".implode(\',\',$elements).\")\";
            $sql->update($queryString);
    
            $queryString = \"UPDATE     league
                                            SET             rgt = rgt + \".$sql->queryParam($elementsToMove*2).\"
                                            WHERE   rgt >= \".$sql->queryParam($targetRgt).\"
                                            AND             id NOT IN (\".implode(\',\',$elements).\")\";
            $sql->update($queryString);
            
            // place our elements into their target position        
            $queryString = \"UPDATE league
                                            SET             lft = lft + (\".$sql->queryParam($difference).\"),
                                                            rgt = rgt + (\".$sql->queryParam($difference).\")
                                            WHERE   id IN (\".implode(\',\',$elements).\")\";
            $sql->update($queryString);
    }
    ?>



    Beitrag geändert: 4.2.2008 15:43:29 von evil-devil
  12. Autor dieses Themas

    teamfake

    teamfake hat kostenlosen Webspace.

    Aber wo ist dann das mysql_connect? Das muss doch von der db abgerufen werden oder?

    Das Tutorial von http://www.klempert.de/nested_sets/artikel/ habe ich schon gesehen, aber das hat auch nicht funktioniert. Schon beim eintragen in die db gab es Probleme. Aber ein Problem kann auch sein, dass ich da das @mysql_connect davor hingeschrieben habe, oder hat das gepasst?

    @bladehunter: Ich habe deinen Code mal ausprobiert, aber da kommt der Fehler:
    Parse error: syntax error, unexpected \'=\' in /usr/export/www/hosting/teamfake/forum/forum/test/test.php on line 10


    MfG,
    TF





    Beitrag geändert: 4.2.2008 17:06:37 von teamfake
  13. e********l

    Das mysql_connect liegt natürlich in der MySQL Klasse die da genutzt wird. Alles vorgekaut bekommst halt nicht. Zumal die MySQL Klasse aus mehr wie einer besteht und entsprechend viel Code dahinter steckt den ich hier nicht posten will. Und wenn ich die SQL Klassen posten würde, müsste ich den Rattenschwanz zur Konfiguration des verwendeten Frameworks auch gleich mitposten und damit summiert sich der Code ganz schnell auf 1.000 Zeilen Code und mehr ;)
  14. Autor dieses Themas

    teamfake

    teamfake hat kostenlosen Webspace.

    Habe jetzt eine andere Lösung gefunden, die für mich einfacher ist :smile:

    Danke an euch alle! ;)

    MfG,
    TF

    PS: Kann zu! Danke ;)


    Beitrag geändert: 5.2.2008 15:55:24 von teamfake
  15. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!