[PHP/MySQL] Vermoedelijk simpel loopje

Pagina: 1
Acties:

  • twi
  • Registratie: Februari 2000
  • Laatst online: 05-08 16:40
Ik heb wat beschamende problemen met een loopje (iets waar ik geen held in ben). Ik kan me herinneren dat ik rond vorig jaar een forum ben gaan maken, en eenzelfde probleem ooit heb opgelost in de vorm van een forumlijst. Ik heb die files niet meer, omdat ik er na een tijdje mee ben gestopt, maar ik heb nu een soortgelijk probleem. Allemaal niet relevant, here goes:

Ik wil via een query een navigatielijstje maken m.b.v. links. Een index waarbij je op een hoofdstuk/paragraaftitel klikt, je naar de pagina gaat. Het eindresultaat moet er dus zo uit zien:

Hoofdstuk 1
-- Paragraaf 1.1
-- Paragraaf 1.2
-- Paragraaf 1.3
Hoofdstuk 2
-- Paragraaf 2.1
-- Paragraaf 2.2
Hoofdstuk 3
-- Paragraaf 3.1
Hoofdstuk 4
-- Paragraaf 4.1
-- Paragraaf 4.2
-- Paragraaf 4.3

Elk hoofdstuk is 1 pagina, waarop alle paragrafen zich bevinden. Nu wil ik een dergelijk lijstje dynamisch creëren uit de database (waarom makkelijk statisch als het moeilijk dynamisch kan?). Enfin, ik heb de volgende twee tabellen:

hoofdstuk
------------
id
titel

paragraaf
------------
id
hoofdstuk (naar hoofdstuk.id)
titel
inhoud

Ik kan nu iets gaan verzinnen met mysql_num_rows en zo het aantal hoofdstukken tellen, dan via een query in een while()-loopje in een for()-loopje iets doen, maar zodra het twintig hoofdstukken worden is het niet echt leuk voor de server (20 queries).

Heb op google gezocht naar alternatieve manieren om een mysql_fetch_array (meerdere malen) door te lopen in een loopje (of op een andere manier op passende wijze uit te lezen), maar onsuccesvol om m'n 'probleem' op te lossen. Ik neem aan dat er zat soortgelijke problemen zijn geweest hier op GoT, maarja...de search is kaput. En ik wil graag verder :{

  • getty
  • Registratie: Januari 2001
  • Laatst online: 28-08 13:19
Kun je niet beter een join gebruiken. Dus zoiets
code:
1
2
SELECT * FROM tblHoofdstuk JOIN tblParagraaf ON 
tblHoofdstuk.ID=tblParagraaf.Hoofdstuk ORDER BY tblHoofdstuk.ID


Dan deze lijst gewoon doorlopen en als de hoofdstukid veranderd weer een nieuwe hoofstuk beginnen?

A computer is almost human - except that it does not blame its mistakes on another computer.


  • twi
  • Registratie: Februari 2000
  • Laatst online: 05-08 16:40
een gewone join werkt niet, maar met LEFT JOIN krijg ik hetzelfde resultaat als ik had. Mijn probleem is de query niet, maar de manier van het presenteren. Wanneer ik deze lijst door zou lopen in een simpele while-loop waar ik de titel van 't hoofdstuk+paragraaf neerzet krijg ik:

code:
1
2
3
4
5
6
7
8
9
10
1 Introductie / Titel 1 - Pagina 1  
1 Introductie / Titel 2 - Pagina 1  
1 Introductie / Titel 3 - Pagina 1  
2 Testhoofdstuktitel / Titel 1 - Pagina 2  
2 Testhoofdstuktitel / Titel 2 - Pagina 2  
3 Oprichting / Titel 1 - Pagina 3  
4 Concurrentie / Titel 1 - Pagina 4  
4 Concurrentie / Titel 2 - Pagina 4  
4 Concurrentie / Titel 3 - Pagina 4  
4 Concurrentie / Titel 4 - Pagina 4

Terwijl ik de output zó zou willen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1 Introductie
Titel 1 - Pagina 1  
Titel 2 - Pagina 1  
Titel 3 - Pagina 1  

2 Testhoofdstuktitel
Titel 1 - Pagina 2  
Titel 2 - Pagina 2  

3 Oprichting
Titel 1 - Pagina 3  

4 Concurrentie
Titel 1 - Pagina 4  
Titel 2 - Pagina 4  
Titel 3 - Pagina 4  
Titel 4 - Pagina 4
Dan deze lijst gewoon doorlopen en als de hoofdstukid veranderd weer een nieuwe hoofstuk beginnen?
Dit is dus 't probleem :) Hoe doe ik dat?

  • getty
  • Registratie: Januari 2001
  • Laatst online: 28-08 13:19
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
[pseudo code]
$id = 0;
do
{
  if ($id != $record->id)
  {
     echo "$record->id $record->titel<br>";
     $id = $record->id;
  }
  echo "$record->titel $record->pagina<br>";
} while(alles doorlopen)
[/pseudo code]

A computer is almost human - except that it does not blame its mistakes on another computer.


Verwijderd

Wat ik altijd doe in zulk soort gevallen, is alle hoofdstukken ophalen uit de database, deze in een while lus uitlezen mbv mysql_fetch_array en in de lus een 2e query uitvoeren om de bijbehorende paragrafen op te halen. Die ik dus ook weer met een while lus met mysql_fetch_array uitlees.
Dit is denk ik niet echt de meest efficiënte manier maar hij werkt wel.

  • Ozzi
  • Registratie: Mei 2000
  • Laatst online: 01-09 12:09

Ozzi

??

Verwijderd schreef op 10 augustus 2002 @ 14:41:
Wat ik altijd doe in zulk soort gevallen, is alle hoofdstukken ophalen uit de database, deze in een while lus uitlezen mbv mysql_fetch_array en in de lus een 2e query uitvoeren om de bijbehorende paragrafen op te halen. Die ik dus ook weer met een while lus met mysql_fetch_array uitlees.
Dit is denk ik niet echt de meest efficiënte manier maar hij werkt wel.
dat is echt naar mijn mening een hele smerige oplossing :X :X

geen


  • JoostBaksteen
  • Registratie: December 2000
  • Laatst online: 27-03 19:32
Dit is al vaker gevraagd. Maar toen in het 'categorie / fora' verband.

Als je daarop zoekt krijg je goeie oplossingen :)

Verwijderd

Ozzi schreef op 10 augustus 2002 @ 14:44:
[...]
dat is echt naar mijn mening een hele smerige oplossing :X :X
Ach ja, it works for me. En zoveel bezoekers trekken die sites van mij nou ook weer niet

  • twi
  • Registratie: Februari 2000
  • Laatst online: 05-08 16:40
joostbaksteen schreef op 10 augustus 2002 @ 14:47:
Dit is al vaker gevraagd. Maar toen in het 'categorie / fora' verband.

Als je daarop zoekt krijg je goeie oplossingen :)
Als de search zou werken, dan zou ik dat inderdaad heel graag doen. Ik krijg op deze termen niks in P&W, alleen vage topics in SG. Ik ga de andere suggestie even bekijken.

Verwijderd

twi schreef op 10 augustus 2002 @ 15:00:
[...]
Als de search zou werken, dan zou ik dat inderdaad heel graag doen. Ik krijg op deze termen niks in P&W, alleen vage topics in SG. Ik ga de andere suggestie even bekijken.
Dat komt omdat nog niet alle topics geïndexeerd zijn.
Maar je kunt bv ook op andere websites zoeken, naar zoiets (bv google)
Kijk anders eens in de FAQ, daar staan een aantal hele interessante links in over php.

Succes

  • twi
  • Registratie: Februari 2000
  • Laatst online: 05-08 16:40
Bedankt, ik ga door met zoeken :)

  • twi
  • Registratie: Februari 2000
  • Laatst online: 05-08 16:40
getty schreef op 10 augustus 2002 @ 14:23:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
[pseudo code]
$id = 0;
do
{
  if ($id != $record->id)
  {
     echo "$record->id $record->titel<br>";
     $id = $record->id;
  }
  echo "$record->titel $record->pagina<br>";
} while(alles doorlopen)
[/pseudo code]
Bedankt! Uiteindelijk leek me die do overbodig, maar de rest heb ik improviserend gebruikt. Uiteindelijk was 't vrij logisch:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$id = 1;

while ($historienav = mysql_fetch_array($historienavresult)) {

  $hoofdstukid     = $historienav["hoofdstukid"];
  $hoofdstuktitel  = $historienav["hoofdstuktitel"];
  $paragraafid     = $historienav["paragraafid"];
  $paragraaftitel  = $historienav["paragraaftitel"];

  if ($id == $hoofdstukid) {
    echo "$hoofdstuktitel<br>";
    $id++;
  }

  echo "$paragraaftitel<br>";

}

Bedankt in ieder geval!

  • getty
  • Registratie: Januari 2001
  • Laatst online: 28-08 13:19
Het was ook maar Pseudocode die ik even snel had verzonnen. Hoe je het nu hebt opgelost is het iig netjes ja.

A computer is almost human - except that it does not blame its mistakes on another computer.


  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Ik zit met een soortgelijk probleem. Ik wil namelijk een behoorlijke lijst automatisch laten genereren met witregels tussen de diverse beginletters/-cijfers zodat het er ongeveer zo uit komt te zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0....
0....

1....
1....
1...

etc..

A....
A....
A...

B....
B....

C....


etc...



Iemand enig idee hoe ik dit kan aanpakken? Bij voorbaat dank....

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


  • Mini-me
  • Registratie: November 1999
  • Niet online
Lijkt me dat je dat doet aan de hand van de code die twi gebruikt.
In plaats van het checken op $id hou je nu in een variabele bij met de laatste beginletter, en vervolgens check je bij iedere rij of het eerste element hiervan gelijk is aan die variabele. Zonee, dan geef je een extra newline en zet je de zojuist gelezen beginletter in de variabele.

  • Grum
  • Registratie: Juni 2001
  • Niet online
'dood'-simpel

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$curHead = -1; # of iets anders wat NOOIT voor zal komen. 

while( $theRow = mysql_fetch_assoc( $historienavresult ) )
{ 
   $hId     = $theRow['hoofdstukid']; 
   $hTitel  = $theRow['hoofdstuktitel']; 
   $pId     = $theRow['paragraafid']; 
   $pTitel  = $theRow['paragraaftitel']; 

   if ($curHead != $hId) 
   {
      echo $hId .' '. $hTitel .'<br>'; 
      $curHead = $hId;
   }
   echo $pId .' '. $pTitel .'<br>'; 
}


Have fun

edit:
- dan dus OOK maar met code tags .. zucht -


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$curHead = -1; # of iets anders wat NOOIT voor zal komen. 

while( $theRow = mysql_fetch_assoc( $historienavresult ) )
{ 
   $hId     = $theRow['hoofdstukid']; 
   $hTitel  = $theRow['hoofdstuktitel']; 
   $pId     = $theRow['paragraafid']; 
   $pTitel  = $theRow['paragraaftitel']; 

   if ($curHead != $hId) 
   {
      echo $hId .' '. $hTitel .'<br>'; 
      $curHead = $hId;
   }
   echo $pId .' '. $pTitel .'<br>'; 
}

[ Voor 0% gewijzigd door Grum op 20-08-2002 17:23 . Reden: Parse stinkt! (single quote-[php]-bug) ]


  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

judgem schreef op 20 augustus 2002 @ 15:39:
Ik zit met een soortgelijk probleem. Ik wil namelijk een behoorlijke lijst automatisch laten genereren met witregels tussen de diverse beginletters/-cijfers zodat het er ongeveer zo uit komt te zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0....
0....

1....
1....
1...

etc..

A....
A....
A...

B....
B....

C....


etc...



Iemand enig idee hoe ik dit kan aanpakken? Bij voorbaat dank....
Hier ben ik inmiddels ook al aan uitgekomen (eerste poging slaagde wonderwel in 1 keer) en dus zal ik mijn code met jullie delen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function get_record($queryname)
{ 
    if ($this->result[$queryname])
        $value = mysql_fetch_array($this->result[$queryname]);
    else
        $value = 0;
    return $value;
}

$sql = "SELECT * FROM links ORDER by name ASC";

$oud_char = '0'; 

$conn->open_query("linklist",$sql); 
while($links = $conn->get_record("linklist"))
{
    $begin_char = substr($links[name],0,1); 
    
    if ($begin_char > $oud_char)
    {
        echo '<br>';
        $oud_char = $begin_char;
    }

    echo '<A HREF="'.$links[url].'">'.$links[name].'</A><br>';
}

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO

Pagina: 1