Avatar billede mik789 Nybegynder
05. maj 2003 - 23:46 Der 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 />";
}

//mik
Avatar billede erikjacobsen Ekspert
05. maj 2003 - 23:55 #1
Du kan lave det som

  while ($row=mysql_fetch_array(4result)) {
    $liste[] = $row;
  }

så har du dit 2 dimensionelle array. Bevis? Ok, skriv:

  print_r($liste);

bagefter ;)
Avatar billede erikjacobsen Ekspert
05. maj 2003 - 23:59 #2
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

    ksort($liste);

(check igen).

Er det lidt i tråd med det du søger?
Avatar billede mik789 Nybegynder
06. maj 2003 - 00:02 #3
erikjacobsen>tak for forslagene. jeg vil arbejde videre med dem i morgen. nu kalder dynerne!
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 00:07 #4
Ja, i lige måde ...

Udtræk er rimeligt nemme. Utestet:

  foreach ($liste as $key => $val) {
      print "<h1>$key</h1>";
      foreach ($val as $row) {
        print $row['forfatter'].$row['tekst']." osv...";
      }
  }

Det er - med forbehold for fejl, og at du skal bruge dine navne -
vist nok det. Jeg tror du vil finde det nemt.
Avatar billede mik789 Nybegynder
06. maj 2003 - 10:57 #5
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:

<b>forfatter, titel<b><br />
tidspunkt, afsender<br /><br />
[osv.]

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:

<b>Peter Jørgensen, "Skovene i Danmark"</b><br />
02.05.2203, 13:47:32 Sofus Hansen<br />
02.05.2203, 15:26:14 Tjalve Sigurdsson<br />
04.05.2003, 10:04:36 Niels Skovsen<br /><br />
<b>Karin Christensen, "Det norske torskefiskeri"</b><br />
02.05.2003, 22:19:05 Anders Klausen<br />
03.05.2203, 17:43:24 Niels Skovsen<br /><br />

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";

$hentIndl=mysql_query($hent);
$hentIndlAntal=mysql_num_rows($hentIndl);

Herfra skal jeg have opbygget det (de?) array der skal til for at foretage udskrivningen. Så altså hvad gør jeg herfra?
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 11:40 #6
Prøv at vise hvordan du laver udtrækket - og fortæl hvad det er der ikke virker?
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 11:40 #7
..laver udskriften....
Avatar billede mik789 Nybegynder
06. maj 2003 - 12:01 #8
foreach ($liste as $key => $val) {
  print "<h3>$key</h3>";
  foreach ($val as $row) {
  print $row['forfatter'].$row['titel'].$row['afsender'];
  }
}

giver:

<h3>0</h3>
DDDDDD&&&&&&<<<<<1
MMMMMM&&&&&&<<<<<2
DDDDDD&&&&&&<<<<<3
DDDDDD&&&&&&<<<<<4
MMMMMM&&&&&&<<<<<

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
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 12:10 #9
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 ?
Avatar billede mik789 Nybegynder
06. maj 2003 - 12:26 #10
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";

$resultatHent=mysql_query($hent);
$resusltatHentAntal=mysql_num_rows($resultatHent);

for ($i=0; $i<$resultatHentAntal; $i++) {
$rowHent = mysql_fetch_array($resultatHent);
print "<b>".$rowHent['forfatter'].", ".$rowHent['titel']."</b><br />".$rowHent['afsender']."<br />";
}

og det giver et forventet udprint i formatet:

<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.
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 12:33 #11
Så du husker at

  $liste[$row['titel']][] = $row;
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 12:34 #12
Eller :)

$liste[$rowHent['titel']][] = $rowHent;
Avatar billede mik789 Nybegynder
06. maj 2003 - 14:01 #13
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>&ldquo;Det norske torskefiskeri&rdquo;</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:

$rowHent = mysql_fetch_array($resultatHent);

og dernæst det nye array med:

$liste[$rowHent['titel']][]=$row;
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 14:03 #14
for ($i=0; $i<$resultatHentAntal; $i++) {
$rowHent = mysql_fetch_array($resultatHent);
$liste[$rowHent['titel']][]=$row;
}
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 14:03 #15
Ups:
for ($i=0; $i<$resultatHentAntal; $i++) {
$rowHent = mysql_fetch_array($resultatHent);
$liste[$rowHent['titel']][]=$rowHent;
}
Avatar billede mik789 Nybegynder
06. maj 2003 - 14:24 #16
OK, så har jeg:

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>&ldquo;Skovene i Danmark&rdquo;</h3>
Peter Jørgensen&ldquo;Skovende i Danmark&rdquo;Sofus HansenPeter Jørgensen&ldquo;Skovene i Danmark&rdquo;Tjalve SigrurdsonPeter Jørgensen&ldquo;Skovene i Danmark&rdquo;Niels Skovsen
<h3>&ldquo;Det norske torskefiskeri&rdquo;</h3>
Karin Christensen&ldquo;Det norske torskefiskeri&rdquo;Anders KlausenKarin Christensen&ldquo;Det norske torskefiskeri&rdquo;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.
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 14:26 #17
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.
Avatar billede mik789 Nybegynder
06. maj 2003 - 14:30 #18
hov der var lige en fejl. Rettet:

foreach ($liste as $key => $val) {
  print "<h3>$key</h3>";
  foreach ($val as $rowHent) {
  print $rowHent['tidspunkt'].", ".$rowHent['afsender']."<br />";
  }
}

nu er alt OK, undtagen at jeg godt også vil have 'forfatter' op i overskrifterne
Avatar billede mik789 Nybegynder
06. maj 2003 - 14:33 #19
SUPER så er den der!
Avatar billede mik789 Nybegynder
06. maj 2003 - 14:33 #20
- så mangler jeg bare helt at forstå hvad der foregår undervejs, men det finder jeg ud af når jeg går det ordentligt igennem. tak for hjælpen
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 14:45 #21
;) Ja, det er lidt langhåret. Skriver du print_r($liste); - og kigger
den igennem med "Vis kilde", så har du måske en idé om hvordan dit array
ser ud.
Avatar billede mik789 Nybegynder
06. maj 2003 - 21:36 #22
Ét lille problem er tilbage:

Hvis der søges på et ord der ikke matcher, fås flg. fejlmeddelelse:

Invalid argument supplied for foreach() ... i denne linje:

foreach ($liste as $key => $val) {

Hvorimod hvis søgeordet matcher fungerer alt perfekt. Hvad kan det skyldes?
Avatar billede erikjacobsen Ekspert
06. maj 2003 - 22:14 #23
Du har ret. Anbring denne linie

  $liste = array();

lige før:

  for ($i=0; $i<$resultatHentAntal; $i++) {
Avatar billede mik789 Nybegynder
06. maj 2003 - 23:10 #24
yep, det hjalp! tak.
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