Avatar billede Slettet bruger
10. november 2009 - 12:40 Der er 8 kommentarer og
1 løsning

Hvordan samler jeg både nye kommentarer og nye tråde fra mit forum?

Goddag eksperter,

Jeg er i den situation at jeg, som overskriften indikerer, gerne vil have samlet både nye kommentarer og nye tråde i mit forum på min forside. Som det fungerer nu er det kun de nyeste kommentarer, der bliver samlet. Det gør jeg på denne måde:

<?php               
$query = mysql_query("SELECT com.id, 4 as type, ft.forum_id, ft.title, com.topic_id FROM (SELECT max(id) as id, topic_id FROM comments where type = 4 group by topic_id ORDER BY id DESC LIMIT 7) com INNER JOIN forum_topics ft using(topic_id)") or die(mysql_error());
       
while ($row = mysql_fetch_assoc($query)) {

  echo '<div class="textnewest">» ';
       
  $message = nl2br(htmlspecialchars($row['title']));
  $message = str_replace("<br />","...", $message);   
               
  if(strlen($message)>30){
    $titel = substr($message,0,30);
    $ending = "...";
    }
  else{
    $titel = $message;
    $ending = "";
    }

  echo '<a href="http://www.udeboende.dk/forum/kategori/';
  echo nl2br(htmlspecialchars($row['forum_id']));
  echo '/topic/';
  echo nl2br(htmlspecialchars($row['topic_id']));
  echo '#';
  echo nl2br(htmlspecialchars($row['id']));
  echo '" title="';
  echo nl2br(htmlspecialchars($row['title']));
  echo '" class="alternative">';
  echo $titel;
  echo $ending;
  echo '</a>';
  echo '</div>';

}
?>

Det kan ses her http://www.udeboende.dk/ , hvordan de 7 nyeste kommentarer bliver udskrevet fra forummet på forsiden (lidt ned og i venstre side)


Men hvordan knytter jeg foruden nye kommentarer de nye tråde til SQL forespørgslen også?

Skitseret er det sådan her det skal se ud:

1. Topic titel (linker fx til forum/kategori/7/topic/23#124 <- dvs en kommentar)
2. Topic titel (linker fx til forum/kategori/15/topic/14#37 <- dvs en kommentar)
3. Topic titel (linker fx til forum/kategori/15/topic/14 <- dvs en tråd)
4. Topic titel (linker fx til forum/kategori/6/topic/11#12 <- dvs en kommentar)
5. Topic titel (linker fx til forum/kategori/15/topic/18 <- dvs en tråd)
6. Topic titel (linker fx til forum/kategori/10/topic/14 <- dvs en tråd)
7. Topic titel (linker fx til forum/kategori/16/topic/121#8 <- dvs en kommentar)


Så vidt jeg kan se skal jeg ind og benytte mig af UNION, men kan ikke helt overskue hvordan jeg får det gjort på den rigtige måde, samt hvordan jeg skelner mellem om det er en tråd eller kommentar (da stien skal være forskellig til disse to)

Håber meget at en venlig sjæl kan hjælpe til ;)
Avatar billede caspersch Nybegynder
10. november 2009 - 18:03 #1
Umildbart er det lidt svært at svare konkret på, når vi ikke kender dit database setup. Bygget det på et standard system?
Avatar billede Slettet bruger
10. november 2009 - 18:38 #2
Det afhænger nok lidt af hvad du mener med standard...

Siden er opbygget med én tabel til kommentarer og én tabel til forum tråde. Disse hedder "comments" og "forum_topics". Tabellerne ser ud som i det følgende:

comments:
id, parent_id, topic_id, forum_id, text, time, author, userid, parentuserid, ip, seen, type

forum_topics:
topic_id, forum_id, title, text, time, author, ip, userid


Som det kan ses på den funktion jeg benytter mig af nu, hentes kommentarer ud fra "comments" og vha. inner join bliver de tilhørende titler så hentet ud fra "forum_topics" ;)

Ved ikke om det var svar nok? Ellers må i bare spørge løs..
Avatar billede caspersch Nybegynder
10. november 2009 - 18:42 #3
Jo da - jeg er ikke særlig skarp til SQL desværre, så jeg ville (personligt) lave en funktion med to MySQL kald, som mergede det sammen i et array, og lavede et HTML output.

Men det kan garanteret laves bedre :-)
11. november 2009 - 12:38 #4
Lad mig sige med det samme at jeg har ikke svaret paa dit spoergsmaal.  Jeg er i gang med at laere mig selv css/php/mysql o.s.v., og det har vaeret en enorm god oevelse at studere spoergsmaalene her paa eksperten og proeve, ved hjaelp af googlen, "trial and error," og andre maader at arbejde mig frem til en loesning (og mange gange er det lykkedes.)  Jeg studerede dit spoergsmaal grundigt, men jeg konkluderer at det overstiger mine evner (endnu.)

Saa hvorfor laver jeg saa en kommentar?  Fordi sourcen til din side afsloerer et "sort hul" i min viden og jeg haaber du kan hjaelpe.  Jeg burde have rejst det som et nyt spoergsmaal, men jeg var bange for at sammenhaengen ville blive tabt, men hvis du kan hjaelpe laver jeg bagefter et "Points til PJS87."

Altsaa, jeg aabnede din side og aabnede sourcen for at finde den kode du viser i #1.  Jeg fandt den ikke.  I stedet fandt jeg resultatet, for eksempel
"<div class="textnewest">»
  <a href="http://www.udeboende.dk/forum/kategori/7/topic/23#124" title="Ny dansk Youtube-hero" class="alternative">Ny dansk Youtube-hero</a>
          </div>"

Saa hvor sidder koden fra #1?  Hvordan bliver den anvendt til at indsaette forum-kategorierne?  Har det noget at goere med konstruktionen <div class="textnewest">», altsaa tegnet >>?
Avatar billede Slettet bruger
12. november 2009 - 12:56 #5
Må indrømme at jeg ikke helt er med på hvad du spørger om, men jeg skal forsøge at svare (points er ikke nødvendigt)..


Koden fra #1 er PHP og derfor kan du ikke læse den i kildekoden ;) Du kan blot læse de ting jeg udskriver i mine echo's..

Grunden til at mine adresser fx hedder "http://www.udeboende.dk/forum/kategori/7/topic/23#124" skyldes at jeg har benyttet mig af en omskrivning af URL's ved hjælp af .htaccess.

Ovenstående URL kan også tilgåes vha. http://www.udeboende.dk/forum.display.php?forum=7&id=23#124 , men da det ikke er en pæn adresse og søgemaskiner ikke er glade for dette, har jeg omskrevet alle adresser på sitet. Hvis det er noget du er interesseret i bør du læse nogle af artiklerne rundt omkring om .htaccess ;)


Håber det gav mening - ellers må du lige skrive igen
Avatar billede Slettet bruger
12. november 2009 - 14:20 #6
Men for at vende tilbage til topic ;)


Jeg har nu selv delvist fået løst det nu. Det ser ud som følgende:

SELECT com.id, 4 as type, ft.forum_id, ft.title, com.topic_id, time FROM (SELECT max(id) as id, topic_id FROM comments where type = 4 group by topic_id) com INNER JOIN forum_topics ft using(topic_id) UNION SELECT 0, text, forum_id, title, topic_id, time FROM forum_topics ORDER BY time DESC LIMIT 7


Den udskriver de rigtige ting fra både topics og kommentarer nu. Der er dog to lille problemer ved det..

Hvis der er et nyligt oprettet topic bliver det lagt i listen. Men hvis der er en nylig oprettet kommentar bliver den også lagt i listen. Dvs. der ligger to "links" til det topic (et til selve topic og et til selve kommentaren). Hvordan får jeg gjort sådan at de to overskriver hinanden, så der kun er én i listen - vel og mærket den nyeste af de to?

Det andet problem er at den ikke sortere helt korrekt efter datoen på oprettelse af hhv. kommentar og topic. Det ser ud til at den bare smider dem rimelig tilfældigt ud.. Hvordan løser jeg det?
Avatar billede Slettet bruger
12. november 2009 - 17:44 #7
Er nu kommet frem til en lidt bedre løsning

SELECT * FROM (SELECT com.id, 4 as type, ft.forum_id, ft.title, com.topic_id, time FROM (SELECT max(id) as id, topic_id FROM comments where type = 4 group by topic_id) com INNER JOIN forum_topics ft using(topic_id) UNION SELECT 0, text, forum_id, title, topic_id, time FROM forum_topics LIMIT 7) as ownalias GROUP BY topic_id ORDER BY time DESC

Eneste problem for at få det til at virke fuldent er at når den udskriver en kommentar i listen. Så er den rangeret efter det tidspunkt "time" som topic er oprettet på og ikke efter det tidspunkt som kommentaren er skrevet.

Nogle, der umiddelbart kan se en smart løsning på dette?
17. november 2009 - 07:10 #8
PSJ87, tak for kommentarene, jeg laerte noget.

Dit sidste problem er der aabenbart ingen der foreslaar en loesning paa.  Er tiden maaske inde til at lukke spoergsmaalet?  Det giver god orden, og saa staar det ikke laengere som aabent paa min liste af indlaeg.
Avatar billede Slettet bruger
17. november 2009 - 14:46 #9
Har desværre ikke rigtig fundet en løsning på mit eget problem nej, men så er det altid noget at jeg kunne hjælpe dig ;)

Lukker tråden..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester