Gå til innhold

[LØST] | Hente ut info fra phpBB database


Anbefalte innlegg

Heisann. Jeg lager en portal til hjemmesiden min. Hjemmesiden min bruker phpBB 2 forum. Planene jeg hadde for siden var at de 10 siste postene fra en bestemt del av forumet kom i denne portalen.

 

Det skulle også komme opp antall svar, forfatter av tråden, tidspunkt for posting og link til tråden.

 

Med andre ord en del å gjøre.

 

Under phpbb_topics er disse radene:

 

forum_id, topic_title, topic_poster, topic_time, topic_replies.

 

Hvordan kan jeg finne f.eks de 10 siste topic_title'ene under forum_id 1?

 

SELECT `topic_title` FROM `phpbb_topics` WHERE `forum_id` = 1

 

Jeg er veldig noob når det gjelder MySQL. Har akkurat bestilt meg en bok fra bokkilden, men den har de ikke på lager :(

Endret av TheClown
Lenke til kommentar
Videoannonse
Annonse

Er ikke helt sikker på dette, men jeg vil tro at dette skulle fungere. Er avhengig av hva og hvordan data'ene i topic_time blir lagret.

SELECT `topic_title` FROM `phpbb_topics` WHERE `forum_id` = 1
ORDER BY topic_time DESC LIMIT 10

 

ORDER BY bestemmer hvordan informasjonen skal sorteres, og DESC bestemmer at det skal sorteres i synkende rekkefølge, eller nyeste først.

 

LIMIT 10 begrenser søket til å returnere maks 10 rader, eller de 10 første.

Lenke til kommentar

F.eks slik, men dette er gjordt utallige ganger her på forumet

 

PHP
<?php

//koble til database ett eller annet sted

 

$sql='SELECT `topic_title` FROM `phpbb_topics` WHERE `forum_id` = 1

ORDER BY topic_time DESC LIMIT 10';

$result=mysql_query($sql);

while ($row=mysql_fetch_row($result))

{

echo '<table class="xxyy"><tr><td>'.$row[0].'</td></tr></table>';

// evt så kan du bruke div

// echo '<div class="yyxx">'.$row[0].'</div>';

}

mysql_free_result($result);

 

?>

 

Må formatere tabellen/div'en etter ønske med css. Med div så er det bare å bruke margin og padding for å lage det mellomrommet du måtte ønske, og evt border for å få på rammer osv

Lenke til kommentar
Blir SQl infoen lagret i en array?

 

Kan man lage en vanelig while loop. $row[$nr] og $nr++ ?

9141568[/snapback]

 

Ja, og jeg tror du har misforstått litt hva $row[0] er. [0] er ikke første rad, det er første feltet i den posten/raden som er nylig hentet fra databasen. Hadde jeg brukt mysql_fetch_assoc i stedet så måtte det stått $row['topic_title']. Slik den while løkka er skrevet nå så vil den hente ut 10 rader og skrive dem ut. Hvis du vil ha en teller i tillegg så gjør slik

PHP
<?php

$i=1;

while ($row=mysql_fetch_row($result))

{

echo '<table class="xxyy"><tr><td>'.$i.' '.$row[0].'</td></tr></table>';

// evt så kan du bruke div

// echo '<div class="yyxx">'.$row[0].'</div>';

$i++;

}

?>

 

Tror du bør lese litt mer om hvordan de forskjellige mysql_fetch_* funksjonene fungerer. mysql_fetch_row() (se linkene på venstre siden for flere funksjoner).

mysq_fetch_row() (w3schools.com)

 

Hvis du har denne selecten, SELECT felt1,felt2,felt3,felt4,felt5 FROM test og du bruker mysql_fetch_row so er $row[0] = felt1, $row[1]=felt2, ..., $row[4]=felt5. Variablen må ikke hete $row, men er veldig greit.

Bruker du mysql_fetch_assoc så blir det $row['felt1'], $row['felt'2], ..., $row['felt5'].

Bruker du mysql_fetch_array så er det det samme som så bruke både row og assoc i en, verdien i felt1 kan hentes med enten $row[0] eller $row['felt'1]. Regner med at denne funksjonen bruker mer minne enn fetch_row og fetch_assoc, siden den blir dobbelt så stor som de andre funksjonene.

Lenke til kommentar

jeg tenkte da at $row så noe alá dette ut:

 

$row=array('Dette er den første nyhetssaken', 'Dette er den andre nyhetssaken, rofldage!!11', 'Her kommer den shity siste nyhetssaken, som er den tredde')

 

Men dette er da feil?

 

Eller hvordan kan jeg få et slikt resultat? Forsto ikke helt hva du mente ovenfor.

Endret av TheClown
Lenke til kommentar

Ja det er feil. Men det går ann å få det slikt, men ser ikke nødvendigheten av det i denne sammenhengen.

 

For å ta utgangspunkt i phpbb tabellen som da får tre poster (ca) slik

 

forum_id;topic_title;topic_poster;topic_time;topic_replies

1;test1;crowly;12345;5

2;test2;TheClown;12345;3

3;test3;Ståle;12345;6

 

Når man bruker denne koden

PHP
<?php

$sql="SELECT forum_id, topic_title,topic_poster,topic_time,topic_replies FROM phpbb_topics

LIMIT 10";

$result=mysql_query($sql);

while ($row=mysql_fetch_row($result))

{

  echo "<pre>";

  print_r($row);

  echo "</pre>";

}

mysql_free_result($result);

?>

 

Ved første kjøring av while løkka så vil $row se slik ut

 

$row[0]=1

$row[1]=test1

$row[2]=crowly

$row[3]=12345 (ett timestap regner jeg med)

$row[4]=5

 

siden dette ikke er siste rad/post i tabellen, eller begrenset av LIMIT så vil whilen fortsette og hente inn neste rad/post som da for disse verdiene

 

$row[0]=2

$row[1]=test2

$row[2]=TheClown

$row[3]=12345 (ett timestap regner jeg med)

$row[4]=3

 

fremdeles ikke siste rad/post, så neste hentes inn med disse verdiene

 

$row[0]=3

$row[1]=test3

$row[2]=Ståle

$row[3]=12345 (ett timestap regner jeg med)

$row[4]=6

 

Dette er siste rad/post og while løkka vil da avslutte.

 

Bruker du $row=mysql_fetch_assoc så må du gjøre slik for å få tak i verdiene i $row, resten er det samme

 

$row['forum_id']=3

$row['topic_title']=test3

$row['topic_poster']=Ståle

$row['topic_time']=12345 (ett timestap regner jeg med)

$row['topic_replies']=6

 

Håper dette gjør det litt enklere å forstå hvordan du henter ut informasjonen fra databasen.

Endret av crowly
Lenke til kommentar

Ser fint ut :D

 

Men for å gjøre det mer overskiktelig, kan man ta ut et og et felt gjennom forskjellige SELECT?

 

$sq1="SELECT forum_id FROM phpbb_topics LIMIT 10"

$sq2="SELECT topic_title FROM phpbb_topics LIMIT 10"

 

Eller går det til helvette?

 

Jeg lurer fremdeles på hva denne linja egentlig gjør:

 

$result=mysql_query($sql);

 

mysql_query()

 

Spørring? Skjekker denne linja bare om databasene osv. er ok?

 

 

$row['forum_id']=3
$row['topic_title']=test3
$row['topic_poster']=Ståle
$row['topic_time']=12345 (ett timestap regner jeg med)
$row['topic_replies']=6

9144955[/snapback]

 

 

Er det ikke mulig å skille "sett" nr 1 fra nr 2?

 

Hvis "sett" en er det du har ovenfor, hvordan kan du skille det fra f.eks dette:

 

$row['forum_id']=43535
$row['topic_title']=homoeasifsdøofhdf
$row['topic_poster']=Meg
$row['topic_time']=1337
$row['topic_replies']=9999

Endret av TheClown
Lenke til kommentar
Men for å gjøre det mer overskiktelig, kan man ta ut et og et felt gjennom forskjellige SELECT?

 

$sq1="SELECT forum_id FROM phpbb_topics LIMIT 10"

$sq2="SELECT topic_title FROM phpbb_topics LIMIT 10"

 

Eller går det til helvette?

 

Det er fult mulig (og jeg vil ikke si det er mer oversiktlig, tror du bare må forstå hvordan det fungerer), men hvis du ønsker å optimalisere koden så mye som mulig, slik at den bruker minst mulig ressurser så burde du prøve å bruke minst mulig database oppslag. Kan du klare deg med ett, hvorfor bruke to ?

 

Jeg lurer fremdeles på hva denne linja egentlig gjør:

 

$result=mysql_query($sql);

mysql_query()

 

Spørring? Skjekker denne linja bare om databasene osv. er ok?

mysql_query er funksjonen som utfører sql settningen mot databasen og hvis ikke noe går galt så returerer den en "ressursverdi"/resource. mysql_fetch_* funksjonene trenger denne resource'en for å fungere. Det blir vel en form for peker mot basen/tabell oppslaget, som går til neste rad for hver gang du utfører en mysql_fetch_*. Kan ikke så mye om akkurat dette, har bare lært meg at det er slik det skal brukes. Kanskje noen andre mere kyndige kan forklare det bedre.

 

Er det ikke mulig å skille "sett" nr 1 fra nr 2?

 

Hvis "sett" en er det du har ovenfor, hvordan kan du skille det fra f.eks dette:

Verdiene i $row vil endres for hver gang mysql_fetch_* kjøres, så sett 1 forsvinner når sett 2 hentes inn osv. Hvis du ønsker å ta vare på tidligere sett så må du lagre de i en annen tabell, f.eks slik

PHP
<?php

$sql="SELECT ....";

$result=mysql_query($sql);

$i=1;

while ($row=mysql_fetch_row($result))

{

  $tab[$i][]=$row[0];

  $tab[$i][]=$row[1];

  // evt flere felter

  $tab[$i][]=$row[5];

  $i++;

  // div annen kode her man vil utføre

}

mysql_free_result($result);

echo "<pre>";

print_r($tab);

echo "</pre>";

?>

Da vil $tab[0] inneholde alle verdiene av $row fra første rad, $tab[1] alle verdiene av $row fra andre rad osv. $tab[0][0] har verdien fra forum_id i første rad, $tab[1][0] har forum_id fra andre rad. $tab[0][1] er topic_title fra første rad osv.

Bruk print_r() funksjonen med <pre> tager rundt for å se verdiene i arrayene.

Håper det var dette du lurte på, for jeg forstå ikke helt hva du spurte om.

Endret av crowly
Lenke til kommentar

Funka jo fett :D Med print_r fikk jeg dette:

 

Array
(
   [0] => Nye Funksjoner #3
   [1] => 2
   [2] => 1184781929
   [3] => 1
)
Array
(
   [0] => Flere funksjoner #2
   [1] => 2
   [2] => 1184498834
   [3] => 4
)
Array
(
   [0] => Flere funksjoner #1
   [1] => 2
   [2] => 1184417540
   [3] => 10
)
Array
(
   [0] => RingerikeUngdom.net
   [1] => 2
   [2] => 972086460
   [3] => 3
)

 

Som er helt riktig :D Elsker deg crowly

Lenke til kommentar

Alt funker veldig pent nå...MEN!

 

Jeg skulle gjerne tatt ut en del mer info. Jeg har prøvd nå i flere timer men får det ikke til.

 

Dette må jeg også få tatt ut fra databsen:

 

brukernavn på brukeren som postet tråden. ['topic_poster'] viser bare hvilke id brukeren hadde. Så jeg tenkte at:

SELECT `username` from `phpbb_users` WHERE `user_id` = $row[1]

 

Men dette funka da, ikke. Noen som har peil på hvordan jeg kan ta ut navnet når jeg har iden?

 

Jeg må også ta ut innholdet fra første post under hver tittel. Den ligger under `phpbb_posts_text` table `post_text`

 

PÅ forhådn takk :)

Lenke til kommentar
Tatt fra luften, så kan være noen småfeil her, men noe slikt:

SELECT username, forum_id, topic_title, topic_time FROM phpbb_topics INNER JOIN phpbb_users ON phpbb_topic.topic_poster=phpbb_users.user_id LIMIT 10

 

Les mer om JOIN her:

http://www.w3schools.com/sql/sql_join.asp

9153225[/snapback]

 

Evt slik, JOINs er vel mer speifikt til Mysql og denne varrianten er vel mer "vanlig" sql (tror jeg)

SELECT t2.username, t1.forum_id, t1.topic_title, t1.topic_time FROM phpbb_topics t1, phpbb_users t2
WHERE t1.topic_poster = t2.user_id
LIMIT 10

 

t1 og t2 er alias på tabellene phpbb_topics og phpbb_users

 

PHP
<?php $sql="SELECT `username` from `phpbb_users` WHERE `user_id` = ".$row[1]; ?>

Dette vil fungere, men du må legge dette oppslaget inn i den første while løkka, og det resulterer i at du gjør ett nytt oppslag mot databasen for hver post, dette er unødvendig ressursbruk. Prøv å hold antall database oppslag til ett minimum.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...