05. maj 2003 - 23:46Der er
23 kommentarer og 1 løsning
multidimensionalt array af mysql udtræk
Hvordan former man resultatet fra en mysql-forespørgsel som et multidimensionalt array? Forestil jer en database med to tabeller. 1) indeholder forfatternavn, titel m.m. for en serie artikler, 2) indeholder afsender, navn, tekst m.m. for indlæg til et forum der diskuterer de forskellige artikler. Nu skal jeg lave en søgefunktion der søger på ord i deltagernes indlæg til forumet og lister dem under titel på de relevante artikler. Det kræver et multidimensionalt array, men hvilken php funktion kan man bruge til det?
Jeg starter med at samle oplysninger fra databasen:
$opl = "select artikler.forfatter, artikler.titel, forum.afsender, forum.tekst from artikler, forum where forum.tekst like '%\r\n".htmlentities($forumQuery)."\r\n%' and forum.artikel_id = artikler.artikel_id";
Så følger mysql_query($opl) og mysql_num_rows($resultatOpl).
Herfra skal jeg så have lavet et multidimensionalt array således at alle fundne indlæg listes under de relevante artikler. Altså:
Artikel 3 Indlæg fra Peter Indlæg fra Maja
Artikel 6 Indlæg fra Knud Indlæg fra Maja Indlæg fra Susanne
osv.
Nu skal jeg så definere mit multidimensionale array i stil med: $indlaeg_liste[$artikler][$indleag]. Hvordan gør jeg det? Med mysql_fetch_array()?
Selve udskrivningen skal have nogen lunde denne form:
for ($artikler=0; $artikler<$mysql_num_rows(?); $artikler++) { for ($indlaeg=0; $indlaeg<$mysql_num_rows(?); $indlaeg++) { echo $indlaeg_liste[$artikler][$indlaeg] ."<br />"; } echo "<br />"; }
Hvordan bruger du det så? Ja, der er jo ikke noget, der umiddelbart hjælper dig her til den struktur du ønsker. Der er 2 dimensioner ikke nok. Hvis det felt du vil have som overskrift ("Artikel 6") hedder "artikel", kan du så lave dig et 3-dimensionelt array på denne måde:
$liste[$row['artikel']][] = $row;
så bliver de samlet ét sted. Check igen med print_r($liste); De er nok ikke sorteret ordentligt, men det kan du klare med en
erikjacobsen> OK, jeg har forsøgt. Jeg kan godt lave det multidimensionale array (dit forslag 05/05-2003 23:55:18), men udtrækket (06/05-2003 00:07:01) fungerer ikke her.
Nu starter jeg forfra i forenklet form, og hvis du orker, så må du dirigere mig trin for trin:
Forumsiden loader et særskilt forum for hver artikel via en variabel der angiver artiklernes artikelID. Fra Peter Jørgensens artikel "Skovene i Danmark" loades forumsiden med forfatter og titel på artiklen som overskrift og indlæggene der diskuterer denne artikel derunder. Jeg har altså to tabeller: artikler og forum. Fælles for de to er feltet artikel_id, således at alle indlæg til Peter Jørgensens artikel lægges i tabellen forum med artikel_id for netop denne artikel. Til udskrift ønskes nu - for at gøre det lidt enkelt - bare felterne 'forfatter' og 'titel' fra artikler og felterne 'afsender' og 'tidspunkt' fra forum. Udsksriften skal have denne form:
F.eks. hvis der er fundet tre indlæg til Peter Jørgensens artikel og to til Karin Christensens artikel der alle matcher søgninge, skal det skrivet sådan:
Det også helst være muligt at angive det samlede antal indlæg, i dette tilfælde 5.
Min mysql forespørgsel ser så sådan ud:
$hent = "select artikler.forfatter, artikler.titel, forum.tidspunkt, forum.afsender from artikler, forum where forum.text like '%".$forumSearch."%' and artikler.artikel_id = forum.artikel_id";
Men jeg har heller ikke fuldt forstået hvad scriptet gør, og derfor heller ikke hvordan navnene 'forfatter', 'titel' og 'afsender' egentlig skal placeres
Tror du ikke bare det er navngivning af felterne der giver dig problemer? Jeg kan ikke dine navne. Og skal man ikke skrive "select titel.forfatter as forfatter ... " for at være sikker på navnene passer i PHP bagefter ?
Jeg tror nok at min mysql forespørgsel er OK. Jeg har prøvet at gå videre derfra bare med et alm. endimensionalt array. Altså:
$hent = "select artikler.forfatter, artikler.titel, forum.tidspunkt, forum.afsender from artikler, forum where forum.text like '%".$forumSearch."%' and artikler.artikel_id = forum.artikel_id";
<b>Peter Jørgensen, "Skovene i Danmerk"</b><br /> Sofus Hansen<br /> <b>Peter Jørgensen, "Skovene i Danmerk"</b><br /> Tjalve Sigerudsson<br /> <b>Karin Christensen, "Det norske torskefiskeri"</b><br /> Anders Klausen<br /> <b>Karin Christensen, "Det norske torskefiskeri"</b><br /> Niels Skovsen<br /> <b>Peter Jørgensen, "Skovene i Danmerk"</b><br /> Niels Skovsen<br />
dvs. det tager bare indlæggene i rækkefølge og lister dem med angivelse af artikel for hver af dem. Så navnene og mysql forespørgslen er OK. Det er opbyggelsen af det rigtige array til udprintninng af det ønskede format der giver problemer.
Ja det husker jeg, men sp. er om det er rigtigt. Dette er hvad jeg har nu:
$hent = "select artikler.forfatter, artikler.titel, artikler.reference, forum.afsender, forum.overskrift, forum.tidspunkt from artikler, forum where forum.text like '%jeg%' and artikler.artikel_id = forum.artikel_id"; $resultatHent = mysql_query($hent); $resultatHentAntal = mysql_num_rows($resultatHent);
for ($i=0; $i<$resultatHentAntal; $i++) { $rowHent = mysql_fetch_array($resultatHent); } $liste[$rowHent['titel']][]=$row; foreach ($liste as $key => $val) { print "<h3>$key</h3>"; foreach ($val as $row) { print $row['forfatter'].$row['titel'].$row['afsender']; } }
Det giver:
<h3>“Det norske torskefiskeri”</h3>
- altså titlen på den anden artikel, men ingen indlæg til trods for at det også melder om 5 indlæg. Men det er så også sp. om jeg har forstået dig rigtigt mht først at lave det alm. array med:
for ($i=0; $i<$resultatHentAntal; $i++) { $rowHent = mysql_fetch_array($resultatHent); $liste[$rowHent['titel']][]=$rowHent; } foreach ($liste as $key => $val) { print "<h3>$key</h3>"; foreach ($val as $row) { print $row['forfatter'].$row['titel'].$row['afsender']; } }
Det giver:
<h3>“Skovene i Danmark”</h3> Peter Jørgensen“Skovende i Danmark”Sofus HansenPeter Jørgensen“Skovene i Danmark”Tjalve SigrurdsonPeter Jørgensen“Skovene i Danmark”Niels Skovsen <h3>“Det norske torskefiskeri”</h3> Karin Christensen“Det norske torskefiskeri”Anders KlausenKarin Christensen“Det norske torskefiskeri”Niels Skovsen
- så vi nærmer os afgjort ;-) tak for tålmodigheden så langt...
Det der nu mangler er at få skik på formattering og felter. I overskriften, altså imellem <h3></h3> vil jeg godt både have ['forfatter'] og ['titel'], og i listen over indlæg skal ['forfatter'], ['titel'] til gengæld fjernes. ['tidspunkt'] er ikke med her, men det er min fejl. Det har jeg hevet ud.
Godt, hvis du laver grupper på forfatter og titel skal du have det med her: $liste[$rowHent['forfatter'].": ".$rowHent['titel']][]=$rowHent; og ellers, ja, så er der nok lidt formattering.
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.