Themensortierung & (Un)gelesen Funktion

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Themensortierung & (Un)gelesen Funktion

    Hi erstmal,

    ich habe folgende Probleme:
    1. Problem: Themen sortieren
    Ich programmiere momentan eine Forensoftware und er soll nun die Themen nach dem Datum sortieren.
    Das ist ja nicht weiter schwer, aber nun kommt das Problem. Er soll zugleich gucken, ob ein Post zum
    Thema vorhanden ist und dann schauen, ob dieser ein "neueres" Datum hat, als das neuste Themen und
    dieses dann so anordnen.
    Hier meine aktuelle SQL Abfrage, die allerdings nicht funktioniert, bzw. nicht das tut was ich möchte:

    Quellcode

    1. $sql3 = "SELECT
    2. a.`thread_title`,
    3. a.`thread_date`,
    4. a.`thread_autor`,
    5. a.`thread_closed`,
    6. a.`thread_id`,
    7. b.`user_name`,
    8. b.`user_id`,
    9. (SELECT c.`post_date` FROM `".$praefix."_post` AS c WHERE c.`post_thread_id` = a.`thread_id` ORDER BY c.`post_date` DESC LIMIT 1) AS `date`
    10. FROM
    11. `".$praefix."_thread` AS a
    12. LEFT JOIN
    13. `".$praefix."_user` AS b
    14. ON
    15. a.`thread_autor` = b.`user_name`
    16. WHERE
    17. a.`thread_board_id` = '".mysql_real_escape_string($row2['board_id'])."'
    18. ORDER BY
    19. `date` DESC,
    20. a.`thread_date` DESC
    21. LIMIT
    22. 1";
    Alles anzeigen

    Und hier ein Link zu dem Problem "live":
    voltic-board.de/forum-1
    Man sieht ein Thema, das neuer ist als das erste, welches eine Antwort hat, die allerdings auch
    nicht neuer ist als das neue Thema.

    2. Problem: (Un)gelesen Funktion
    Zudem mache ich eine Thema ungelesen/gelesen Funktion.
    Nun ist mein Problem folgendes.
    Er zeigt immer nur ein ungelesenes Thema (in diesem Falle 1 vons 3) an.
    Hier mein Code:

    Quellcode

    1. <?php
    2. //...
    3. while($row2 = $result2->fetch()) {
    4. $sql3 = "SELECT
    5. a.`thread_title`,
    6. a.`thread_date`,
    7. a.`thread_autor`,
    8. a.`thread_closed`,
    9. a.`thread_id`,
    10. b.`user_name`,
    11. b.`user_id`,
    12. (SELECT c.`post_date` FROM `".$praefix."_post` AS c WHERE c.`post_thread_id` = a.`thread_id` ORDER BY c.`post_date` DESC LIMIT 1) AS `date`
    13. FROM
    14. `".$praefix."_thread` AS a
    15. LEFT JOIN
    16. `".$praefix."_user` AS b
    17. ON
    18. a.`thread_autor` = b.`user_name`
    19. WHERE
    20. a.`thread_board_id` = '".mysql_real_escape_string($row2['board_id'])."'
    21. ORDER BY
    22. `date` DESC,
    23. a.`thread_id` DESC
    24. LIMIT
    25. 1";
    26. $result3 = new Query($sql3);
    27. $row3 = $result3->fetch();
    28. $sql5 = "SELECT * FROM ".$praefix."_post WHERE post_thread_id = ".$row3['thread_id'];
    29. $result5 = new Query($sql5);
    30. $num5 = $result5->numRows();
    31. if ($num5 != 0) {
    32. if (strlen($row3['thread_title']) > 25) {
    33. $threadtitel = "Re: ".substr($row3['thread_title'],0,20)."...";
    34. }
    35. else {
    36. $sql6 = "SELECT * FROM ".$praefix."_thread WHERE thread_board_id = ".$row2['board_id'];
    37. $result6 = new Query($sql6) or die(mysql_error());
    38. $numRow6 = $result6->numRows();
    39. if ($numRow6 == 0) {
    40. $threadtitel = "";
    41. }
    42. else {
    43. $threadtitel = "Re: ".$row3['thread_title'];
    44. }
    45. }
    46. }
    47. else {
    48. if (strlen($row3['thread_title']) > 25) {
    49. $threadtitel = substr($row3['thread_title'],0,23)."...";
    50. }
    51. else {
    52. $threadtitel = $row3['thread_title'];
    53. }
    54. }
    55. if (!isset($_SESSION["user_id"])) {
    56. $smarty->assign("on_closed_off",'<img src="images/off.gif" alt="Nichts neues" />');
    57. }
    58. else {
    59. if ($row3['thread_closed'] == 1) {
    60. $smarty->assign("on_closed_off",'<img src="images/closed.gif" alt="Gesperrt" />');
    61. }
    62. else {
    63. $sql4 = "SELECT * FROM ".$praefix."_unread_topic WHERE unread_user_id = ".$_SESSION['user_id'];
    64. $result4 = new Query($sql4) or die(mysql_error());
    65. if ($result4->numRows() == 0) {
    66. $smarty->assign("on_closed_off",'<img src="images/off.gif" alt="Nichts neues" />');
    67. }
    68. else {
    69. while($row4 = $result4->fetch()) {
    70. if ($row4['unread_thread_id'] == $row3['thread_id'] or $row4['unread_post_thread'] == $row3['thread_id']) {
    71. $smarty->assign("on_closed_off",'<img src="images/on.gif" alt="Neu" />');
    72. }
    73. else {
    74. if ($row3['thread_closed'] == 1) {
    75. $smarty->assign("on_closed_off",'<img src="images/closed.gif" alt="Gesperrt" />');
    76. }
    77. else {
    78. $smarty->assign("on_closed_off",'<img src="images/off.gif" alt="Nichts neues" />');
    79. }
    80. }
    81. }
    82. }
    83. }
    84. }
    85. $smarty->assign("boardid",$row2["board_id"]);
    86. $smarty->assign("boardtitle",$row2["board_title"]);
    87. $smarty->assign("boarddescription",$row2["board_description"]);
    88. $smarty->assign("boardthread",$threadtitel);
    89. $smarty->assign("threadid",$row3["thread_id"]);
    90. $smarty->assign("userid",$row3["user_id"]);
    91. $smarty->assign("boardautor",$row3["user_name"]);
    92. $smarty->display('index_board.tpl');
    93. }
    94. }
    95. //...
    96. ?>
    Alles anzeigen


    Bitte um schnelle Hilfe!
    Danke im VOrraus.
    Gruß,
    Lars
  • moin,
    LIMIT 1? Du rufst dieses Query in einer Schleife auf?
    Du hast eine user_id, joinst aber über den user_name???
    Den Subselect solltest du dir sparen und stattdessen Datum und Titel des letzten Beitrags redundant halten.
    $sql5 zum Zeilen zählen solltest du auch vermeiden und $sql6 sowieso durch einen weiteren JOIN.

    Poste am besten mal dein ER Diagramm, dann können wir dir vielleicht helfen.
  • LIMIT 1:
    Weil nur ein Forum angezeigt werden soll (auf der Startseite).
    In der Themenübersicht ist das Limit weg.
    Der `thread_autor` ist `user_name`, deswegen der JOIN.

    Zum ER Diagramm: Ich hab die leider alle nur auf Papier und gerade keinen
    scanner zur Hand..
    Hast du evtl. einen Verdacht darauf, warum das mit dem anzeigen
    von gelesen/ungelesen nicht funktioniert?
    Oder eine andere Idee die Beiträge so auszulesen, wie es in jeder anderen
    Forensoftware ist?
  • Ich würd das System noch umdrehen. Anstatt zu speichern, was ungelesen ist, besser speichern was gelesen ist.
    Zudem kannst du dir den Zeitstempel des ältesten, ungelesenen Beitrags speichern.
    Diesen global speichern, und daraufhin die Einträge in der gelesenen Tabelle entfernen.

    Und die Abfrage musst du nicht einzeln machen, sondern kannst du in einen Subselect wie bei $sql3 packen.