Avatar billede shjdsi Nybegynder
25. september 2003 - 10:00 Der er 48 kommentarer og
1 løsning

dele dataudtræk op på flere sider

hej !

Jeg har en funtion der viser en masse records fra en mysql database. Jeg har set på mange sider at man kan begrænse antallet af records på en side og istedet have et link "next page" eller næste knap. Således at man kan bladre i sit dataudtræk.

Hvordan laver man det.

Her er min funktion.

$reports = GetCustomerReports($custId,$repId,$final);
    if(isset($reports)) {
        foreach($reports as $rep) {
            $headLine=$rep['issue'];
            $repDate=$rep['repDate'];
            $repId =  $rep['id'];
            $firstName= $rep['firstName'];
            $lastName = $rep['lastName'];
            echo "<td><a href=\"report.php?repId=$repId&custId=$custId\">$headLine</a></td>";
            echo "<td>$firstName $lastName</td>";
            echo  "<td>$repDate</td><tr>";

          }
    }
    echo "</table>";
Avatar billede anhansen Nybegynder
25. september 2003 - 10:03 #1
Jeg ville lave det ved kun at hive, lad os sige 20 poster ud af gangen. Og så lave det for hver side. Enten det eller lave et "for" loop de kun tæller 20. Lad så nogle variabler beskrive hvorlangt du er kommet og så en href på næste.
<a href="_PHP_SELF?start=21&antal=20">næste</a>
Avatar billede riversen Nybegynder
25. september 2003 - 10:03 #2
når du henter fra databasen kan du bruge LIMIT...hvis du har phpmyadmin, er det nemmeste næsten at kigge der hvordan det ser ud og hvad det betyder. Så skal du bare sende et offset med hver gang...
Avatar billede anhansen Nybegynder
25. september 2003 - 10:04 #3
Altså bruge 'for' istedet for 'foreach'.
Det du vil er jo at undgå at den løber igennem alle poster, men starter og slutter et bestemt sted i et array.. Klassisk 'for' løkke.
Avatar billede shjdsi Nybegynder
25. september 2003 - 10:16 #4
hmmm
altså noget lignedne dette her
$i=0;
for($i <= $antal){
$start=$start +1;
print $report[$start];

}

kan du komme med et lille syntax eksempel. jeg er ny i php,.
Avatar billede shjdsi Nybegynder
25. september 2003 - 10:17 #5
$i++;
skal selvfølgelig med i for løkken
Avatar billede anhansen Nybegynder
25. september 2003 - 10:26 #6
næsten... men sådan her... Hvis vi bruger samme $reports...

$antal = $_GET['antal'];
$start = $_GET['start'];
$reports = GetCustomerReports($custId,$repId,$final);
    if(isset($reports)) {
        for($i=$start; $i>=$start+$antal; i++)) {
            $rep = $reports[i];
            $headLine=$rep['issue'];
            $repDate=$rep['repDate'];
            $repId =  $rep['id'];
            $firstName= $rep['firstName'];
            $lastName = $rep['lastName'];
            echo "<td><a href=\"report.php?repId=$repId&custId=$custId\">$headLine</a></td>";
            echo "<td>$firstName $lastName</td>";
            echo  "<td>$repDate</td><tr>";

          }
    }
    echo "</table>";
    echo "<a href=\"_PHP_SELF?start=$start+20&antal=$antal">næste</a>

Det eneste du laver om er vist de to øverste ligner.. Hvor du lige laver en for header i stedet for foreach.. og så selv hiver elementet ud.
Og så har vi de to elementer der tæller...
Avatar billede anhansen Nybegynder
25. september 2003 - 10:27 #7
Og et link til næste...
Avatar billede anhansen Nybegynder
25. september 2003 - 10:28 #8
Men jeg vil stadig mene den bedste løsning, performancemæssigt, er kun at hive det ud af db som du skal bruge.
Så måske GetCustomerReports kan laves om til det.. Jeg ved ikke hvor store poster der er tale om, men hvis man hiver 200 poster ud hver gang man viser 20, er det jo et rimeligt stort overhead..
Avatar billede anhansen Nybegynder
25. september 2003 - 10:29 #9
Glemte et $ i det sidste link...
echo "<a href=\"$_PHP_SELF?start=$start+20&antal=$antal">næste</a>
Avatar billede shjdsi Nybegynder
25. september 2003 - 10:38 #10
Det er nok bare mig der ikke har forstået det helt endnu, men dette her laver endeløst loop

    $reports = GetCustomerReports($custId,$repId,$final);
    if(isset($reports)) {
        for($i=$start; $i>=$start+$antal; $i++) {
            $rep=$report[$i];
            $headLine=$rep['issue'];
            $repDate=$rep['repDate'];
            $repId =  $rep['id'];
            $firstName= $rep['firstName'];
            $lastName = $rep['lastName'];
            echo "<td><a href=\"report.php?repId=$repId&custId=$custId\">$headLine</a></td>";
            echo "<td>$firstName $lastName</td>";
            echo  "<td>$repDate</td><tr>";

          }
    }
    echo "</table>";
      echo "<a href=\"_PHP_SELF?start=$start+20&antal=$antal\">næste</a>";
Avatar billede shjdsi Nybegynder
25. september 2003 - 10:39 #11
Skal det iøvrigt ikke være
$PHP_SELF og ikke $_PHP_SELF i linket
Avatar billede anhansen Nybegynder
25. september 2003 - 10:40 #12
hmm... der er lige et tegn der vender forkert.. my bad... >= siger større end lige med.. Det der skal bruges er <= et fejltryk på shift...
for($i=$start; $i<=$start+$antal; $i++) {

lille men vigtig detalje...
Avatar billede anhansen Nybegynder
25. september 2003 - 10:42 #13
-> shjdsi : Det er vist ligemeget.. De virker begge to...
Avatar billede shjdsi Nybegynder
25. september 2003 - 10:45 #14
Nu kører den ikke endeløst længere :-) men den viser heller ingen records på siden overhovedet.


Skal jeg ikke have trukket antallet af records ud for at vide hvornår den ikke skal køre længere. altså et eller andet med

cnt$=countreportsfunktion();
if ($antal = $cnt) {
afslut for løkke
}
Avatar billede anhansen Nybegynder
25. september 2003 - 10:51 #15
Nej... forløkken tæller selv og afslutter. Den har strukturen
for ( tællevariabel ; begrænsning ; tællemekanisme)
i vores eksempel
for ( $i            ; $i <= $antal+start ; $i++)

Men jeg forstår ikke at den ikke skriver noget ud, jeg har jo ikke lavet om i koden, blot sat en begrænsning på. Den getCustomerReports() function er jo den samme, og hiver det ud i reports.
Det skrev det fint ud før?
Avatar billede shjdsi Nybegynder
25. september 2003 - 10:53 #16
ja med foreach løkken skrev den det fint ud ? det er ligesom der er et eller andet der ikke spiller med at læse data fra array $report

    $reports = GetCustomerReports($custId,$repId);
    if(isset($reports)) {
        for($i=$start; $i<=$start+$antal; $i++)  {
            $rep=$report[$i];
            $headLine=$rep['issue'];
            $repDate=$rep['repDate'];
            $repId =  $rep['id'];
            $firstName= $rep['firstName'];
            $lastName = $rep['lastName'];
            echo "<td><a href=\"report.php?repId=$repId&custId=$custId\">$headLine</a></td>";
            echo "<td>$firstName $lastName</td>";
            echo  "<td>$repDate</td><tr>";

          }
    }
    echo "</table>";
    echo "<a href=\"$_PHP_SELF?start=$start+20&antal=$antal\">næste</a>";
Avatar billede anhansen Nybegynder
25. september 2003 - 10:59 #17
Hmm... Hvis skal lige give start og antal nogle defaultværdier... Jeg tror det er der beten er...
Så vi tilføjer lige:
$antal = $_GET['antal'];
if(!isset($antal)){
  $antal = 20;
}
$start = $_GET['start'];
if(!isset($start)){
  $start = 0;
}
$reports = GetCustomerReports($custId,$repId);
    if(isset($reports)) {
        for($i=$start; $i<=$start+$antal; $i++)  {
            $rep=$report[$i];
            $headLine=$rep['issue'];
            $repDate=$rep['repDate'];
            $repId =  $rep['id'];
            $firstName= $rep['firstName'];
            $lastName = $rep['lastName'];
            echo "<td><a href=\"report.php?repId=$repId&custId=$custId\">$headLine</a></td>";
            echo "<td>$firstName $lastName</td>";
            echo  "<td>$repDate</td><tr>";

          }
    }
    echo "</table>";
    echo "<a href=\"$_PHP_SELF?start=$start+20&antal=$antal\">næste</a>";
Avatar billede anhansen Nybegynder
25. september 2003 - 10:59 #18
hvad giver det?
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:04 #19
hej! Der er vist også et eller andet galt i lænket
http://localhost/shj/show_reports.php?start=0%2020%2020%2020%2020%2020%2020+20&antal=20 efter nogle tryk, den incrementere ikke variablen start men behandler den som en string.

Der bliver stadig ikke vist noget data ??? hmmmm det er gangteret bare en eller anden lille dum fejl.
Avatar billede anhansen Nybegynder
25. september 2003 - 11:09 #20
lav det her inden den sidste echo:
$nystart = $start + $antal;
echo "<a href=\"$_PHP_SELF?start=$nystart&antal=$antal\">næste</a>";
Avatar billede anhansen Nybegynder
25. september 2003 - 11:10 #21
Hvis du bare lige skriver:
echo "bla bla"; lige efter forløkken, så kan vi se om den kører den...
altså:
      for($i=$start; $i<=$start+$antal; $i++)  {
          echo "bla bla";
$rep=$report[$i];
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:16 #22
Jeg har fået den til at vise data nu, min fejl havde kaldt $report som skulle have været $reports.

Har lavewt de ændringer i forbindelse med linket og initalisering af variablerne nu virker det næsten

ser det hele sådan her ud.

if(isset($reports)) {
        for($i=$start; $i<=$start+$antal; $i++)  {
            $rep=$reports[$i];
            $headLine=$rep['issue'];
            $repDate=$rep['repDate'];
            $repId =  $rep['id'];
            $firstName= $rep['firstName'];
            $lastName = $rep['lastName'];
            echo "<td><a href=\"report.php?repId=$repId&custId=$custId\">$headLine</a></td>";
            echo "<td>$firstName $lastName</td>";
            echo  "<td>$repDate</td>";
            echo "<td>$i</td><tr>";
          }
    }
    echo "</table>";
    $nystart = $start + $antal;
    echo "<a href=\"$_PHP_SELF?start=$nystart&antal=$antal\">næste</a>";

Når jeg trykker på link "næste" peger den sådan her i browseren
http://localhost/shj/show_reports.php?start=20&antal=20
men den viser ikke de næsre records :-( hgmmm
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:17 #23
Hvis jeg sætter antal ned til 10 viser den kun 10, men så viser den heller ikke mere. selvom jeg klikker på linket
Avatar billede anhansen Nybegynder
25. september 2003 - 11:17 #24
ok... det ser vi lige på... Godt det andet virker nu...
Avatar billede anhansen Nybegynder
25. september 2003 - 11:18 #25
har du ændret det med isset i kommentar : 10:59:38
Avatar billede anhansen Nybegynder
25. september 2003 - 11:20 #26
Problemet ligger i at vi ikke får brugt de 20 der står i linket.. Det skal vi lige finde ud af hvorfor ikke... :-)
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:22 #27
ja den her
$antal = $_GET['antal'];
        if(!isset($antal)){
              $antal = 10;
        }
            $start = $_GET['start'];
            if(!isset($start)){
              $start = 0;
        }

Før loopet, det giver god mening for mig. :-)
Avatar billede anhansen Nybegynder
25. september 2003 - 11:24 #28
prøv lige at skrive
print("start: $start inden loop <br>");
lige inden du kalder $reports = getCustom....
Og så skriv tilbage hvad den skriver både første gang, og når du har trykket på linket...
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:27 #29
inden jeg trykker på link
debug output>>  start: inden loop
efter jeg trykker på link
debug output>> start: 10 inden loop

Fordi jeg ændrede det fra 20 til 10
men det ser ikke ud til den bliver initaliseret første gang den kaldes.
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:29 #30
Kan det ikke have noget at gøre med
$rep=$reports[$i]; 

Den læser jo fra 0 og tæller hvergang.
Avatar billede anhansen Nybegynder
25. september 2003 - 11:34 #31
Prøv lige at kopiere hele koden herind, med "isset" delen og det hele.. Bare lige for at jeg kan se sammenhængen.. Forstår ikke at den ikke bliver sat første gang.. også den sidste print skal med...
Avatar billede anhansen Nybegynder
25. september 2003 - 11:35 #32
mht $rep = $reports[$i];  så er $i jo vores tæller. Så den holder styr på hvor vi er, og starter fra $start og kører 20 frem. Så det skulle være fint.
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:36 #33
Her er hele siden!

html>
<body>
<link rel="stylesheet" type="text/css" href="style.css">
<?php
    include ("header.php");
    require ("functions.php");


    echo "<table border = \"1\">
            <td colspan=\"3\"><b>Customer: $customerName</b></td>
                <tr>
                    <td><b>Subject</b></td>
                    <td><b>Name</b></td>
                    <td><b>Date</b></td>
                    <td><b>count</b></td>
                <tr>";


    /* lad os finde historik */
    print("start: $start inden loop <br>");

    $reports = GetCustomerReports($custId,$repId);
    $antal = $_GET['antal'];
        if(!isset($antal)){
              $antal = 10;
        }
            $start = $_GET['start'];
            if(!isset($start)){
              $start = 0;
        }

    if(isset($reports)) {
        for($i=$start; $i<=$start+$antal; $i++)  {
            $rep=$reports[$i];
            $headLine=$rep['issue'];
            $repDate=$rep['repDate'];
            $repId =  $rep['id'];
            $firstName= $rep['firstName'];
            $lastName = $rep['lastName'];
            echo "<td><a href=\"report.php?repId=$repId&custId=$custId\">$headLine</a></td>";
            echo "<td>$firstName $lastName</td>";
            echo  "<td>$repDate</td>";
            echo "<td>$i</td><tr>";
          }
    }
    echo "</table>";
    $nystart = $start + $antal;
    echo "<a href=\"$_PHP_SELF?start=$nystart&antal=$antal\">næste</a>";
    //echo "<a href=\"$_PHP_SELF?start=$start+20&antal=$antal\">næste</a>";

require("searchform.php");
?>
</html>
</body>
Avatar billede anhansen Nybegynder
25. september 2003 - 11:40 #34
Jeg ville faktisk også gerne have print sætningen efter det med _GET og isset. Altså lige inden if(isset($reports)
Så skulle den gerne være sat hver gang $start.
Avatar billede shjdsi Nybegynder
25. september 2003 - 11:45 #35
Subject Name Date count
start: inden loop
start: 0 inden loop 

Efter tryk på link

Customer: 
Subject Name Date count
start: 10 inden loop
start: 10 inden loop

Det ser ud som om den bliver sat
Avatar billede anhansen Nybegynder
25. september 2003 - 11:51 #36
Ja... Men den skriver kun de 10 første poster ud hvergang alligevel.
Prøv at skrive:
print("<td>Tæller: $i</td>");
lige efter for();

for($i=$start; $i<=$start+$antal; $i++)  {
  print("<td>Tæller: $i</td>");
  $rep=$reports[$i];

Så det bliver sådan.
Så skulle den jo gerne skrive tal i tabellen der svarer til dem vi tæller.
Altså fra 0-9 første gang, og fra 10-19 anden gang.
Avatar billede shjdsi Nybegynder
25. september 2003 - 12:02 #37
Det har jeg allerede i den :-)
echo "<td>$i</td><tr>"; i forloop

giver følgende
Subject Name Date count
start: inden loop
start: 0 inden loop
endnu enttttesttete fdsfsdf fssfsdfsdf,sæld Simon Jespersen 2003-09-18 0
asdasddas Simon Jespersen 2003-09-25 1
wqeqwe eqwe qe  Simon Jespersen 2003-09-25 2
qwerwqewqeqweqwe Simon Jespersen 2003-09-25 3
eqweqewqeqweqw Simon Jespersen 2003-09-25 4
dsadadasdadada Simon Jespersen 2003-09-25 5
dasdasdasdasdada Simon Jespersen 2003-09-25 6
dasdsadasdasdasd Simon Jespersen 2003-09-25 7
saddasdasdasda Simon Jespersen 2003-09-25 8
dasdasdadasdada Simon Jespersen 2003-09-25 9
dasdadadadasd Simon Jespersen 2003-09-25 10

næste
Avatar billede anhansen Nybegynder
25. september 2003 - 12:03 #38
og anden gang... når du har trykket på næste...
Avatar billede shjdsi Nybegynder
25. september 2003 - 12:26 #39
anden gang når jeg har trykket på næste giver den følgende

start: 10 inden loop
start: 10 inden loop

næste

altså en tom tabel uden data i.
Avatar billede anhansen Nybegynder
25. september 2003 - 12:37 #40
mærkeligt... prøv at lægge $start og $antal sammen inden løkken... Sådan her:
$limit = $start + $antal;
for($i = $start; $i <= $limit; $i++){


ændrer det noget...
Avatar billede shjdsi Nybegynder
25. september 2003 - 12:44 #41
Det gjore desværre ingen forskel, tror du det kan have noget at gøre med
at  $reports = GetCustomerReports($custId,$repId);       
disse variabler, ikke kommer med når når man kalder $PHP_SELF og derfor er $reports tom.
Avatar billede anhansen Nybegynder
25. september 2003 - 12:48 #42
Ja... hvis de er med første gang du kalder... så kan det sagtens... vi overfører jo kun start og antal... godt bud..
Prøv at find ud af hvad der bliver overført første gang du kalder siden.
Hvad står der efter ? - står der noget.
Hvis ikke bliver de overført med 'post' så skal vi til at kigge i koden, for at finde ud af hvad de hedder...
Avatar billede shjdsi Nybegynder
25. september 2003 - 12:52 #43
denne fil show_customer, er der følgende form
De bliver kaldt med følgende form

echo "<form action=\"show_reports.php\" method=POST>";
echo "<td><input type=\"submit\" value =\" Show support reports\"></td>";
echo "<input type = \"hidden\" name = \"custId\" value=$customerId>";
echo "<input type = \"hidden\" name = \"customerName\" value=\"$customerName\">";
echo "</form>";

custId og customername bliver altå medtaget fra en anden side første gang siden kaldes.
Avatar billede shjdsi Nybegynder
25. september 2003 - 13:00 #44
jeg ændrede link til følgende
    echo "<td><a href=\"report.php?repId=$repId&custId=$custId&customerName='$customerName'\">$headLine</a></td>";

customername fordi det bliver sat længere op i tabellen
<td colspan=\"3\"><b>Customer: $customerName</b></td>   

Den kan jeg ikke få med, men nu viser den de næste poster, der er barer en lille trals ting.

Jeg kan blive ved at trykke på næste selvom der ikke er flere poster. Så jeg skal vfel lægge et eller andet check ind.
Avatar billede anhansen Nybegynder
25. september 2003 - 13:01 #45
Ja.. ok... og med POST. Jeg kan ikke lige huske hvordan man med en <a> overfører med post, eller om man kan...
Men hvis vi så skriver:
echo "<a href="$_PHP_SELF?start=$nystart&antal=$antal&custId=$custId&repId=$repId\">næste</a>");

og så oppe i toppen tilføjer :
if(!isset($custId)){
    $custId = $_GET['custId'];
}
if(!isset($repId)){
    $repId = $_GET['repId'];
}
Avatar billede shjdsi Nybegynder
25. september 2003 - 13:20 #46
Ok nu virker det. læg lige mærke til den if jeg har lagt ind i for løkken og den if der er føre jeg echo link.
Avatar billede shjdsi Nybegynder
25. september 2003 - 13:20 #47
$reports = GetCustomerReports($custId,$repId);
    $antal = $_GET['antal'];
        if(!isset($antal)){
              $antal = 10;
        }
            $start = $_GET['start'];
            if(!isset($start)){
              $start = 0;
        }

        if(isset($reports)) {

              $limit = $start + $antal;

                  for($i = $start; $i <= $limit; $i++){

                      $rep=$reports[$i];
                    $headLine=$rep['issue'];
                    $repDate=$rep['repDate'];
                    $repId =  $rep['id'];
                    $firstName= $rep['firstName'];
                    $lastName = $rep['lastName'];
                        if(isset($repId)) {
                            echo "<td><a href=\"report.php?repId=$repId&custId=$custId&customerName='$customerName'\">$headLine</a></td>";
                            echo "<td>$firstName $lastName</td>";
                            echo  "<td>$repDate</td><tr>";

                        }else {
                              break;
                        }
                }
        }
        echo "</table>";
        $nystart = $start + $antal;
          if(isset($repId)) {
            echo "<a href=\"$_PHP_SELF?start=$nystart&antal=$antal&custId=$custId&customerName='$customerName'\">næste</a>";
        }
Avatar billede shjdsi Nybegynder
25. september 2003 - 13:20 #48
tusind tak fopr hjælpen :-) dette er virkelig noget der rykker for mig
Avatar billede anhansen Nybegynder
25. september 2003 - 13:20 #49
ok... Fantastisk... Tillykke...
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