Avatar billede mik789 Nybegynder
31. august 2004 - 12:51 Der er 9 kommentarer og
1 løsning

vise de fire sidste meddelsesr fra forskellige fora

Jeg har tre forskellige fora, og nu vil jeg godt kunne vise links til de fire sidste meddelelser der er kommet ind, uanset til hvilke af de tre fora de sidste fire meddelelser er gået ind.

De tre fora har hver deres MySql tabel og felterne hedder lidt forskelligt. Jeg skal bruge oplysninger fra flg. kolonner:

fourm_1: art_id, afsender, titel, tid.
forum_2: pub_id, afsender, titel, tid.
forum_3: postid, poster, title, posted.

forum_1.tid, forum_2.tid og forum_2.posted er alle MySql timestamp (14) kolonner.

Jeg kan ikke bruge "UNION" i min SELECT komando i MySql, da versionen er mindre end 4.0.

Jeg startede det her med sp. http://www.eksperten.dk/spm/534704 i MySql kategorien, hvor det ser ud til at det ikke kan løses alene i MySql, men at der først skal laves tre forskellige selects for hver af de tre fora og derefter noget array_merge. Det kan jeg nok ikke lige overskue ;-) Et af problemerne er at jeg skal ende med at kunne sortere på timestamp felterne (skal jo vise de fire sidste), og hvordan får jeg lige MySql timestamp over i en php funktion så der stadig kan sorteres på tiden? Skal jeg konvertere til unix-timestamp, og i så fald, hvordan konverterer jeg så tilbage til læselige tidsangivelser?
Avatar billede mik789 Nybegynder
31. august 2004 - 13:05 #1
jeg forestiller mig selv noget med at der skal laves et overordnet array, f.eks. $fora_sidste4, der samler de tre tabeller. $fora_sidste4[0] rummer art_id, pub_id og postid som keys sammen med deres værdier. Så kan jeg bagefter ved at teste på hver af disse keys vide om vi har at gøre med en meddelelse fra forum_1, _2 eller _3, og derfra udforme linket korrekt. Men hvordan komme jeg lige derhen?
Avatar billede Slettet bruger
31. august 2004 - 15:35 #2
Hvad med at hente de 4 nyeste indlæg ud fra hver forum og lægge dem i et array.
forum_array[0][1] = Tid for besked
forum_array[0][2] = Tekst
forum_array[0][3] = Forumnr.
forum_array[1][1] = Tid for besked
forum_array[1][2] = Tekst
forum_array[1][3] = Forumnr.
osv.

Så kan du sortere efter tiden og vil have de 4 nyeste, uanset hvilket forum de kommer fra.
Avatar billede mik789 Nybegynder
31. august 2004 - 16:00 #3
kfisker> de skal være sådan at jeg kan bevare de oprindelige feltnavne ("art_id", "pub_id", "postid"), for dem skal jeg dels bruge til at finde ud fra hvilket forum meddelelserne kommer og til at skrive linket, hvori de indgår som variabler, f.eks. <a href="forum.php?artID=<?php echo $forum_array["artID"]; ?>"> eller tilsvarende
Avatar billede Slettet bruger
31. august 2004 - 17:48 #4
Du kan jo gemme de oplysninger du har brug for i arrayet:

Du laver en sql-forespørgsel for hver forum, sorteret efter-tidsfeltet og bruger limit til at vælge de 4 første poster.

Du henter værdierne for hvert forum ud vha. af en while-løkke og gemmer det hele i et array:

$forum_array[0][1] = $art_id;
$forum_array[0][2] = $afsender;
$forum_array[0][3] = $titel;
$forum_array[0][4] = $tid;
$forum_array[0][5] = $linkdata;

Linket du skal bruge afhængig af hvilket forum beskeden kommer fra, har du så i det sidste felt i arrayet, og kan hentes der.
Avatar billede mik789 Nybegynder
01. september 2004 - 12:14 #5
kfisker> ok, jeg skal lige forstå dig rigtigt. Jeg regner med at det bare er en fejl at du er startet med index 1 i arrayets anden dimension, det skal vel være 0. Under alle omstændigheder skal jeg vel bare gentage hvad du har i din sidste komm. for hvert forum. Hvis koden i din komm. er for forum_1 (der har "art_id"), så vil koden for forum_2 og forum_3 være:

$forum_array[1][0] = $pub_id;
$forum_array[1][1] = $afsender;
$forum_array[1][2] = $titel;
$forum_array[1][3] = $tid;
$forum_array[1][4] = $linkdata;

$forum_array[2][0] = $postid;
$forum_array[2][1] = $poster;
$forum_array[2][2] = $title;
$forum_array[2][3] = $posted;
$forum_array[2][4] = $linkdata;

Hvis det er korrekt, så ender jeg altså med $forum_array som indeholder de 3 select-udtræk (med hver de fire sidste meddelelser). Det næste led er vel så at løbe $forum_array[$i][3] igennem for at udvælge de der tilsammen er de fire seneste. Kan man gøre sådan:

while($i<3) // altså alle tre forums
$forum_array = rsort($forum_array[$i][3]);
// dvs. sortér i omvendt rækkefølge; men får jeg så samlet de seneste fire fra ALLE tre selects, eller får jeg bare overskrevet værdien af $forum_array undervejs (dvs. while $i<3), og ender jeg så bare med værdien af rsort($forum_array[2][3]) - det var jo ikke meningen ?

Men hvis jeg efter dette gennemløb faktisk får udvalgt de indlæg der tilsammen er de seneste fire fra alle tre forums og får dem samlet i $forum_array, er proceduren vel bare:

for($i=0;$i<4;$i++){
  if(eregi("artID",$forum_array[$i][4])){
    echo "<a href=\"forum.php?artID=".$forum_array[$i][0]."\">$forum_array[$i][1], $fourm_array[$i][2] .... osv. ;
  }elseif(eregi("pubID",$forum_array[$i][4])){

[osv]
  }
}

Hvis jeg kommer så langt, så er der stadig problemet med at konvertere MySql timestamp til noget der kan sorteres i omvendt rækkefølge i php og siden formatteres til dd.mm.åååå tt:mm:ss format.
Avatar billede mik789 Nybegynder
01. september 2004 - 12:18 #6
hovsa, for($i=0;$i<4;$i++) skal være for($i=0;$i<3;$i++)
vi har kun index 0-2 i første dimension, dvs. de tre forums
Avatar billede mik789 Nybegynder
01. september 2004 - 14:30 #7
og så mangler jej også at får begrænset det samlede array til fire meddelelser, dvs. efter:

while($i<3) // altså alle tre forums
$forum_array = rsort($forum_array[$i][3]); // hvis altså det overhovedet dur:

$forum_array = array ($forum_array[0],$forum_array[1],$forum_array[2],$forum_array[3]); // dvs bare de fire første rækker af det $forum_array der netop er lavet med rsort()
???
Avatar billede Slettet bruger
02. september 2004 - 23:19 #8
mik789...> Beklager den lange svartid. Har ikke være hjemme i noget tid.
Kan du ikke lægge dine tre SQL-forespørgsler, så skal jeg strikke noget sammen til dig.
Avatar billede Slettet bruger
12. september 2004 - 11:15 #9
Betragter hermed denne tråd som værende lukket.
Avatar billede mik789 Nybegynder
12. september 2004 - 13:21 #10
ja, det er den også på en måde...
der skete det at kunden ændrede ønske og nu blot vil have vist den seneste meddelelse, altså kun én. Og det er jo simpelt nok. Det er bare at lave en MySQL tabel til netop det formål, hvis felter så bare bliver overskrevet (UPDATE) hver gang nogle sender en meddelelse til foraene. Så jeg nåede aldrig til at teste dine forslag for alvor. Men jeg gemmer dem, da jeg sagtens kan få brug for dem en anden gang, så du får pointene alligevel. ;-)
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