[php/sql] resultaten splitsen

Pagina: 1
Acties:

Onderwerpen


  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
ik ben bezig om een pagina te maken waarop ik mijn muziek collectie kan bekijken. Ik gebruik hiervoor php en een access database (dmv een odb koppeling)

dit werk allemaal best, en ik heb het al zover dat het netjes per eertse letter van het alfabet wordt weergegeven, ik gebruik de volgende query:

code:
1
 SELECT * FROM [muziek - losse nummers] WHERE [artiest] like '$letter%'


$letter wordt via een link meegegeven.

nu zit ik met het volgende probleem: bij bepaalde letters zijn er erg veel resultaten, en duurt het laden erg lang. Nu ben ik op zoek naar een manier om de resultaten per 100 te splitsen, dus dat de eerste 100 resultaten worden weergegeven, en je onder aan de pagina op volgende kan klikken zodat je de rest van de resultaten te zien krijgt.

is hier een makkelijke manier voor?

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

http://www.w3schools.com

Kijk daar eens in de SQL tutorial naar LIMIT :)

  • samo
  • Registratie: Juni 2003
  • Laatst online: 08:36

samo

yo/wassup

code:
1
SELECT * FROM [muziek - losse nummers] WHERE [artiest] like '$letter% limit 10;

Bekend van cmns.nl | ArneCoomans.nl | Het kindertehuis van mijn pa in Ghana


  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
limit had ik ook aan zitten denken, alleen krijg je daar dus alleen de eerste 100 resultaten mee.
Als ik dan een pagina wil maken met de resultaten van 100-200 moet ik eerst weten hoeveel resultaten er totaal zijn (om te weten hoeveel links er onderaan moeten komen te staan)

Verwijderd

Ik heb er wel iets voor:


http://www.hyperlinkz.nl/artikelen/?t=60

Ga daar maar ff over na denken

Verwijderd

Bosmonster schreef op 12 februari 2004 @ 09:26:
http://www.w3schools.com

Kijk daar eens in de SQL tutorial naar LIMIT :)
Zelfde als bosmonser, maar dan zoeken naar COUNT

of die site die tuxie gaf bekijken :+

[ Voor 9% gewijzigd door Verwijderd op 12-02-2004 09:42 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 00:41

TeeDee

CQB 241

Wat jij nodig hebt is een paging recordset. Ik ken deze alleen voor ASP, maar voor PHP zal dit ook wel te vinden zijn.

/spuit elf

[ Voor 6% gewijzigd door TeeDee op 12-02-2004 09:42 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
Verwijderd schreef op 12 februari 2004 @ 09:39:
Ik heb er wel iets voor:


http://www.hyperlinkz.nl/artikelen/?t=60

Ga daar maar ff over na denken
bedankt, denk dat ik daar wel wat mee kan :)

ik ga ff knutselen

  • TRON
  • Registratie: September 2001
  • Laatst online: 09:03
http://www.hyperlinkz.nl/artikelen/?t=60
$qaantal = mysql_query("SELECT * FROM gastenboek"); // hier je query waarbij je alle berichten uit de database haalt
$max_aantal = mysql_num_rows($qaantal); // tel het aantal resultaten en maak er een variable van
Lekker voor je prestaties als je veel berichten hebt. COUNT(*) past hier beter bij.

Leren door te strijden? Dat doe je op CTFSpel.nl. Vraag een gratis proefpakket aan t.w.v. EUR 50 (excl. BTW)


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

TRON schreef op 12 februari 2004 @ 09:44:
http://www.hyperlinkz.nl/artikelen/?t=60

---------
$qaantal = mysql_query("SELECT * FROM gastenboek"); // hier je query waarbij je alle berichten uit de database haalt
$max_aantal = mysql_num_rows($qaantal); // tel het aantal resultaten en maak er een variable van
------------

[...]
Lekker voor je prestaties als je veel berichten hebt. COUNT(*) past hier beter bij.
Lol inderdaad... een raad die ik niet op zou volgen van die site..

Beter dan COUNT(*) is nog COUNT(ID) of hoe je PK ook heet.

(De rest van de code van dat hyperlinkz zit ook niet echt lekker in elkaar trouwens.. om het over de opmaak (blijkbaar alles bij elkaar gecopy-paste) het nog maar niet te hebben...)

[ Voor 14% gewijzigd door Bosmonster op 12-02-2004 09:48 ]


Verwijderd

//offtopic

Mjah , gelukkig heeft deze tut vele mensen opweg geholpen.
Ben eigenlijk allang gestopt met het maken van nieuwe tuts, en onderhouden van ouwe. Ik zou dat tegenwoordig zelf ook anders doen.
Voor iemand die al niet psies weet wat LIMIT is, en hoe het werkt maakt de uitleg een hoop duidelijk, en daar ging het om.

Beetje onzin om de blaten over copy en paste, ook al ben je admin hiero..

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Verwijderd schreef op 12 februari 2004 @ 10:01:
//offtopic

Mjah , gelukkig heeft deze tut vele mensen opweg geholpen.
Ben eigenlijk allang gestopt met het maken van nieuwe tuts, en onderhouden van ouwe. Ik zou dat tegenwoordig zelf ook anders doen.
Voor iemand die al niet psies weet wat LIMIT is, en hoe het werkt maakt de uitleg een hoop duidelijk, en daar ging het om.

Beetje onzin om de blaten over copy en paste, ook al ben je admin hiero..
Man ik wist niet eens dat die site van jou was... niet dat dat mijn mening beinvloedt overigens ;)

  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
ik ben al wat verder, limit werkt niet ben ik net achter gekomen, omdat het een access db is moet ik:


code:
1
SELECT TOP 5 * FROM [muziek - losse nummers] WHERE [artiest] like '$letter%'

doen om de eerste 5 te zien

[ Voor 4% gewijzigd door AtlonXP1800 op 12-02-2004 10:32 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 00:41

TeeDee

CQB 241

Ja, maar dan zal je dus alleen de eerste 5 te zien krijgen.
Dit gaat niet werken met een "paging recordset".

Die TOP 5 heb je helemaal niet nodig voor hetgeen jij wilt doen.

Je moet al je data selecten, die in een recordset (is dat met php een "row" oid :?) en die met bovenstaande site (afgezien of het foute code is) doorlopen.

Hiero staat een voorbeeld!

[ Voor 16% gewijzigd door TeeDee op 12-02-2004 10:36 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

LIMIT heeft 2 waarden die je mee kunt geven zoals uit tutorials al blijkt. Een start-row en een hoeveelheid.

Voor row 100-200 doe je dus LIMIT 100,100

Het enige wat je nu nog moet weten is het aantal resultaten, maar dat kun je dus eenvoudig met een COUNT(ID) opvragen.

  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
het opvragen van het aantal resulaten blijkt wat moeilijker te zijn met acces & odbc, het is mij nu zo gelukt:

code:
1
2
3
4
5
6
7
$connectionstring = odbc_connect('pl','','') ;
sql = "SELECT COUNT(*) FROM [muziek - losse nummers] WHERE [artiest] like '$letter%'";
$sql_result = odbc_prepare($connectionstring,$sql) or die("ERROR");
odbc_execute($sql_result) or die("ERROR");
$rc = odbc_fetch_into($sql_result, $my_array);
echo ("Total rows: " . $my_array[0]);
odbc_free_result($sql_result);


probleem waar in nu tegen aan loop is dat access/odbc geen limit kent, maar alleen top, en top heeft maar 1 waarde ipv 2 bij limit

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-09 08:45

Bosmonster

*zucht*

Ow.. soz had ik overheen gelezen...

Je zou TOP kunnen combineren met een WHERE ID > hoogste ID die je uit je vorige set had?

  • trogdor
  • Registratie: Mei 2003
  • Laatst online: 22-04 10:17
das ranzig.

  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
ik denk dat het me gelukt is... om limit te immiteren heb ik een 3 dubbele select uitgevoerd (wat de snelheid vast niet ten goede komt)

zie hier mijn smerige lap code :P

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    if (isset($letter)){
    $stime = gettimeofday();
    
    $connectionstring = odbc_connect('pl','','') ;
    
    $limit=50; // aantal resultaten per pagina
    
    // bepalen aantal records in DB beginnend met letter%
    $sql = "SELECT COUNT(*) FROM [muziek - losse nummers] WHERE [artiest] like '$letter%'";
    $sql_result = odbc_prepare($connectionstring,$sql) or die("ERROR");
    odbc_execute($sql_result) or die("ERROR");
    $rc = odbc_fetch_into($sql_result, $my_array);
    echo ($my_array[0] . " muziek nummers gevonden");
    odbc_free_result($sql_result);

    if (empty($offset)) {
    $offset=1;}
    
    // code om er voor te zorgen dat er 50 resultaten per pagina worden weergegeven
    $start = $offset+50;
    $qwerie2 = "SELECT * from(SELECT top 50 * from ";
    $qwerie2 .= "(SELECT top $start * FROM [muziek - losse nummers] WHERE [artiest] like '$letter%') ";
    $qwerie2 .= "order by [artiest] desc)order by [artiest]";
        
    $queryexe = odbc_exec($connectionstring,$qwerie2); 
    if ($queryexe==false) 
        die("Er is een fout opgetreden tijdens het verbinden met de database");
TABEL
    while(odbc_fetch_row($queryexe))     { 
        $veld1 = odbc_result($queryexe, 1); 
        $veld2 = odbc_result($queryexe, 2);
        $veld3 = odbc_result($queryexe, 3);
        $veld5 = odbc_result($queryexe, 5);
        $veld6 = odbc_result($queryexe, 6);
TABEL
    
    if ($offset!=0) { 
        $prevoffset=$offset-100;
        print "<a href=\"$PHP_SELF?offset=$prevoffset&letter=$letter\">PREV</a> &nbsp; \n"; }

    $pages=intval($my_array[0]/$limit);

    if ($my_array[0]%$limit) {
    $pages++;}

    for ($i=1;$i<=$pages;$i++) { 
        $newoffset=$limit*($i-1);
        print "<a href=\"$PHP_SELF?offset=$newoffset&letter=$letter\">$i</a> &nbsp; \n";}

    if (!(($offset/$limit)==$pages) && $pages!=1) {
        $newoffset=$offset+$limit;
        print "<a href=\"$PHP_SELF?offset=$newoffset&letter=$letter\">NEXT</a><p>\n";   }

    odbc_close($connectionstring); 
    $ftime = gettimeofday();
    $time = round(($ftime[sec] + $ftime[usec] / 1000000) - ($stime[sec] + $stime[usec] / 1000000), 5);


het kan gegarandeerd beter,netter & mooier, maar dit is in iedergeval al iets werkends

edit: mijn excuses voor het vernaaien van de layout

[ Voor 83% gewijzigd door AtlonXP1800 op 13-02-2004 11:08 ]


Acties:
  • 0 Henk 'm!

  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
de bovenstaande code werkt al aardig, alleen geeft het een probleem met de laatste pagina. Op de laatste pagina worden de onderste 50 resultaten getoond, als 55 resultaten hebt krijg je dus op de 2e pagina er ook 50 te zien, wat niet helemaal de bedoeling is.

ik denk dat wel weet hoe ik dit kan oplossen, aleen heb ik een probleem met deze regel:

code:
1
SELECT TOP 5 * FROM [muziek - losse nummers] WHERE [artiest] like '%$anaam%' order by [artiest] desc


deze regel zou 5 resulaten moeten weergeven, maar geeft alle resultaten, en ik kan er niet echter komen waar de fout in zit.

Acties:
  • 0 Henk 'm!

  • Jerry
  • Registratie: September 2001
  • Laatst online: 09-04-2022

Jerry

Who?

AtlonXP1800 schreef op 13 februari 2004 @ 10:42:
de bovenstaande code werkt al aardig, alleen geeft het een probleem met de laatste pagina. Op de laatste pagina worden de onderste 50 resultaten getoond, als 55 resultaten hebt krijg je dus op de 2e pagina er ook 50 te zien, wat niet helemaal de bedoeling is.

ik denk dat wel weet hoe ik dit kan oplossen, aleen heb ik een probleem met deze regel:

code:
1
SELECT TOP 5 * FROM [muziek - losse nummers] WHERE [artiest] like '%$anaam%' order by [artiest] desc


deze regel zou 5 resulaten moeten weergeven, maar geeft alle resultaten, en ik kan er niet echter komen waar de fout in zit.
Dat probleem had ik laatst ook :P.
Je moet eerst berekenen hoeveel pagina's je nodig hebt ($aantal_nr_per_page/$resultaat_nrs), daarna kijk je of je op de laatste pagina zit ($pages == $current_page) en dan bereken je hoeveel nummers je nog over hebt.

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
// Laatste pagina of Eerste pagina?
if($pages == 1)
{
    $nrs_over = $resultaat_count;     // Aantal nrs als resultaat
}
else if($pages == $cur_page)      // laatste pagina?
{
    // Hoeveel pagina's heb ik gehad?
    $pages_gehad = $pages - 1;
        
    // Hoeveel nrs waren dat per pagina
    $nrs_gehad = $pages_gehad * $nrs_per_page;
        
    // Hoeveel nrs moet ik nog afbeelden
    $nrs_over = $nr_count - $nrs_gehad;
}
else
{
    // Check hoeveel hits we hebben
    if($resultaat_count < $nrs_per_page)
    {
        $nrs_over = $resultaat_count;
    }
    else
        $nrs_over = $nrs_per_page;
}

[ Voor 34% gewijzigd door Jerry op 13-02-2004 11:06 ]

Specs
Youtube celebrity
D3 Crusader


Acties:
  • 0 Henk 'm!

  • AtlonXP1800
  • Registratie: Augustus 2001
  • Laatst online: 29-01 12:01
klopt, zo'n idee had ik ook al, alleen moet ik daar de bovenstaande query voor gebruiken (waarbij 5 wordt vervangen door een variable)

ik snap alleen niet waarom die query alle resultaten terug geeft ipv de bovenste 5

edit:

ik heb het bepalen van de laatset pagina quick&dirty opgelost:

PHP:
1
2
3
4
5
for ($i=1;$i<=$pages-1;$i++) { 
 $newoffset=$limit*($i-1);
  print <a href=\"$PHP_SELF?offset=$newoffset&anaam=$anaam\">$i</a ";}
        
print <a href=\"$PHP_SELF?anaam=$anaam&pagina=last\">$i</a> ";


dit is heel simpel, de for loop die de links met nummers aan maakt stopt eentje eerder, en daarna wordt er nog een nummer bij gezet met de variable $pagina=last

[ Voor 52% gewijzigd door AtlonXP1800 op 13-02-2004 11:08 ]

Pagina: 1