Gå til innhold

Gjestebok i flat-file med paginering


Anbefalte innlegg

Jeg forsøker å lage en flat-file gjestebok med paginering. Dette er min kode


<?php
// Dagens dato
$today = date('d/m-Y');
// filnavn
$filename = 'myguestbook.txt';
// mode
$mode = 'a+';

// Bruker har skrevet et innlegg
if(isset($_POST['submit'])){
// variabler sjekkes
$name = empty($_POST['name'])? "" : strip_tags($_POST['name']);
$email = empty($_POST['email'])? "" : strip_tags($_POST['email']);
$message = empty($_POST['message'])? "" : strip_tags($_POST['message']);

// feilmelding skrives ut
if(empty($name) || empty($email) || empty($message)){  header( 'refresh:2; url=guestbook.php' );
 print ("Du må fylle ut alle feltene");
}

// innhold til skriving til fil klargjøres
$content = "Navn: $name | Dato: $today | Epost: $email | Melding: $message \n";

// filstrøm åpnes
$fp = fopen($filename, $mode) or die("IO Error!");
// innhold skrives
fwrite($fp, $content);
// lukker strømmen
fclose($fp);
// redirigerer tilbake til utgangspunktet
header( 'refresh:2; url=guestbook.php' );
print ("Meldingen din er lagt til!");

}else{
// skjema, script og stylesheet
print <<<HTML
<style type="text/css">
body{
 background-color:#fff;
 color:#22dd33;
}
input{
 width:100%;
}
</style>
<script type="text/javascript">
<!--

function checkInput(){
 var form = document.forms[0];
 for(i=0; i<form.elements.length; i++){
 	if((form.elements[i].type=="text" || form.elements[i].type=="textarea") && !form.elements[i].value){
   alert("Vennligst fyll ut "+ form.elements[i].name);
   form.elements[i].focus();
   return false;
 	}
 }
 return true;
}
-->
</script>
<h4>Welcome to my guestbook</h4>
<form method="post" action="" onsubmit="return checkInput()";>
 <table>
 	<tr>
   <td>Navn:</td><td><input type="text" name="name" value="$name"></td>
 	</tr>
 	<tr>
   <td>Dato:</td><td>$today</td>
 	</tr>
 	<tr>
   <td>Email:</td><td><input type="text" name="email" value="$email"></td>
 	</tr>
 	<tr>
   <td colspan="2"><textarea name="message" rows="20" cols="30" value="$message"></textarea></td>
 	</tr>
 	<tr>
   <td> </td><td><input type="submit" name="submit" value="Sign my guestbook!"></td>
 	</tr>
 </table>
</form>
HTML;

$antall=0;
// hvis filen finnes er det entries i gjesteboken - åpne for lesing
if(file_exists($filename)){
 $fp= fopen($filename, 'r') or die("IO Error");
 	while(!feof($fp)){
   // innhold plukkes ut og puttes i en array
   $entries[] = explode("|", fgets($fp));
   // teller innlegg
   $antall++;
 	}

 // skriver ut antall entries i gjesteboka
 print $antall . " meldinger i gjesteboka";

 // Pagineringsscript - forsøksvis
 $limit=0;
 $prPage=4;
 function writeEntries(&$prPage, &$antall, &$entries, &$limit){
 	$noPages = ceil($antall/$prPage);
 	// skriver ut entries
 	for($i=$limit; $i<$prPage+$limit; $i++){
   for($j=0; $j<count($entries[$i]); $j++){
   	print $i . " " . $entries[$i][$j] . "<br />";
   }
 	}
 	// limit får ny verdi
 	$limit += $prPage;
 	// debugging - skriver ut skille mellom hver løkke
 	print("<hr />");
 	// Her skal det inn neste>> siste>>
 	if($limit <$antall)
   return writeEntries($prPage, $antall, $entries, $limit);
 }

 // funksjonskall
 writeEntries($prPage, $antall, $entries, $limit);
}else{
 // filen finnes ikke, antall entries = 0
 print $antall . " meldinger i gjesteboka";
}
}
?>

 

Jeg klarer ikke helt å tenke hvordan paginering skal være her. Jeg skal hente ut $entries 5-9 neste gang og 10-14 tredje gang og 15 +4 neste gang der igjen.

 

Noen smarte hoder som vil jobbe sammen med meg på denne?

 

Edit: lagt til lenke til mer lesbar kildekode: http://nibbler.no/files/guestbook.php

Endret av CruellaDeVille
Lenke til kommentar
Videoannonse
Annonse
Jeg forsøker å lage en flat-file gjestebok med paginering. Dette er min kode

[

Jeg klarer ikke helt å tenke hvordan paginering skal være her. Jeg skal hente ut $entries 5-9 neste gang og 10-14 tredje gang og 15 +4 neste gang der igjen.

 

Noen smarte hoder som vil jobbe sammen med meg på denne?

 

Edit: lagt til lenke til mer lesbar kildekode: http://nibbler.no/files/guestbook.php

5750968[/snapback]

 

Er det ikke bare å sende page=2 feks med url

for å hente ut blir det dag page*antall_pr_side

 

eller tenker jeg feil ? :)

Lenke til kommentar

Du må vel, som trondes sier, la $limit være bestemt fra url. Enten ved at du oppgir hvilken side i urlen, eller ved at du oppgir starten ($limit)

 

Også må du fjerne $limit=0, da denne setter $limit til 0 uansett, og da vil jo alltid første side vises, eller ?

$limit = isset($_GET["limit"])?$_GET["limit"]:0;

i Funksjonen writeentries, så trenger du heller ikke gi $limit ny verdi

 

Linkene setter du slik, f.eks nesteside:

$nestestart = $limit+$prPage;
echo "<a href='?limit=$nestestart'>neste side >>></a>";

 

btw: Trenger ikke bruke "a+" som mode, vel ? Du skriver vel bare til filen i det tilfellet ? skal holde med "a" da...

 

Jeg for min del ville brukt file() for å lese filen istedetfor fopen, da jeg er mer komfortabel med denne :

$limit = isset($_GET["limit"])?$_GET["limit"]:0;
$guestfile = file("guest.txt") // F.eks
$ant_innlegg = count ($guestfile);
$teller = $limit;
// Her starter den på den linjen som er angitt i urlen.
while ($teller < $ant_innlegg) {
 $innlegg[] = explode("|", $guestfile[$teller]);
}
// For debug:
print "<pre>";
print_r($innlegg);
print "</pre>";

Men det er jo forsåvidt det samme du gjør, da...

 

/k

Lenke til kommentar
jeg har endret litt på koden, paginering fremover fungerer (delvis- limit bare fortsetter å telle oppover, selv når maks antall innlegg er vist)

 

Men paginering bakover har en logisk brist... noen som kan hjelpe her?

 

Lenke: http://nibbler.no/files/guestbook.php

5752629[/snapback]

       function writeEntries(&$prPage, &$antall, &$entries, &$limit){
           $noPages = ceil($antall/$prPage);
           // skriver ut entries
           for($i=$limit; $i<$prPage+$limit; $i++){
               for($j=0; $j<count($entries[$i]); $j++){
                   print $entries[$i][$j] . "<br />";
               }
               print("<hr style=\"width:95%\" />");
           }
           if($limit < $antall){
               $limit +=$prPage;
           }else{
               $limit +=0;
           }
           $limit_back = $limit-$prPage*2;
           if($limit_back < 0)
           	$limit_back = 0;
           print("<form method=\"get\" action=\"\">
                   <input type=\"hidden\" name=\"limit\">");
           if($limit_back <= 0 AND $limit == $prPage)
           	print "«Forrige ";
           else
           	print "<a href=\"?limit=". ($limit_back). "\">«Forrige</a> ";
           if($limit > $antall)
     print "Neste»";
   	else
           	print "<a href=\"?limit=$limit\">Neste»</a>";
           print "</form>\n";
       }

 

Slik ville jeg ha løst det...

 

EDIT: det største feilen din var at når du sende en limit med $_GET, feks 8.

Så printet du ut det som skulle printes ut, så la du til $prPage til $limit..

 

når du skulle bla tilbake så tok du $limit - $prPage ... dvs samme som du igrunn så på nå.. løser dette problemet med å ta $limit - ( $prPage*2)

 

EDIT2: Forandret en liten feil i koden.

Endret av trondes
Lenke til kommentar
jeg har endret litt på koden, paginering fremover fungerer (delvis- limit bare fortsetter å telle oppover, selv når maks antall innlegg er vist)

 

Men paginering bakover har en logisk brist... noen som kan hjelpe her?

 

Lenke: http://nibbler.no/files/guestbook.php

5752629[/snapback]

       function writeEntries(&$prPage, &$antall, &$entries, &$limit){
           $noPages = ceil($antall/$prPage);
           // skriver ut entries
           for($i=$limit; $i<$prPage+$limit; $i++){
               for($j=0; $j<count($entries[$i]); $j++){
                   print $entries[$i][$j] . "<br />";
               }
               print("<hr style=\"width:95%\" />");
           }
           if($limit < $antall){
               $limit +=$prPage;
           }else{
               $limit +=0;
           }
           $limit_back = $limit-$prPage*2;
           if($limit_back < 0)
           	$limit_back = 0;
           print("<form method=\"get\" action=\"\">
                   <input type=\"hidden\" name=\"limit\">");
           if($limit_back <= 0 AND $limit == $prPage)
           	print "«Forrige ";
           else
           	print "<a href=\"?limit=". ($limit_back). "\">«Forrige</a> ";
           if($limit > $antall)
     print "Neste»";
   	else
           	print "<a href=\"?limit=$limit\">Neste»</a>";
           print "</form>\n";
       }

 

Slik ville jeg ha løst det...

 

EDIT: det største feilen din var at når du sende en limit med $_GET, feks 8.

Så printet du ut det som skulle printes ut, så la du til $prPage til $limit..

 

når du skulle bla tilbake så tok du $limit - $prPage ... dvs samme som du igrunn så på nå.. løser dette problemet med å ta $limit - ( $prPage*2)

 

EDIT2: Forandret en liten feil i koden.

5753903[/snapback]

 

Hjertelig hjertelig! Da kan jeg endelig sove i natt. Var egentlig et script for en i html-forumet som ønsket et popup-script (derfor hr med width 95% - når viduet er 300px bredt ser det okay ut)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...