Click to See Complete Forum and Search --> : Perl Guestbook Navigation


cass84
11-01-2005, 12:45 AM
I've created a perl guestbook script. I am attempting to customize it to where only 10 entries show per page and the rest of the entries are shown through page navigation. Like with the Next/Previous links showing 10 entries per page. I can't figure it out tho. Here is my code

#!/usr/bin/perl -w

$data_file = '/cgi-bin/data/guestbook.txt';

$max_entries = 10; # how many guestbook entries to save?

# set to '0' (zero) for infinite entries...

use CGI;

use Fcntl;

$query = new CGI;

$date_command = '/bin/date';

$date = `$date_command +"%A, %B %e, %Y at %I:%M %p"`; chop($date);

$smilies_url =

"http://smilies";

unless ($action = $query->param('action')) {

$action = 'none';

}

print <<"EndOfText";

Content-type: text/html

<html><head><title>page</title></head><body>

<p><font size="3">To Post A Comment Or Offer Your Support Click <A HREF="#form"><i><b>HERE</b></i></a> to fill out the form!</font></b>

<br><font size="2">HTML is ENABLED!</font></center>

<HR>

<!-- END HTML CODE BEFORE FORM -->

EndOfText

if ($action eq 'Be Heard') {

# process the form submission and assemble the guestbook entry

$name = $query->param('name');

$email = $query->param('email');

$url = $query->param('url');

$city = $query->param('city');

$state = $query->param('state');

$country = $query->param('country');

$comment = $query->param('comment');

# clean up $name

if (length($name) > 50) {

$name = 'A Really Long Name . . . ';

}

# clean up and adjust $from_where

$from_where = "$city, $state, $country";

$from_where =~ s/, , /, /; # remove duplicate ', '

$from_where =~ s/^, //; # remove initial ', '

$from_where =~ s/, $//; # remove final ', '

if ($from_where =~ /^[,\s]+$/) {

# commas and whitespace

$from_where = 'parts unknown';

}



if (length($from_where) > 75) {

$from_where = 'A Place With A Really Long Name . . .';

}

# clean up and adjust $comment

if (length($comment) > 32768) {

$comment = 'The Comment That Was Posted Was Too Long.';

}

# fix line-endings

$comment =~ s/\r\n?/\n/g;

#clean up $URL

unless ($url) {

$url = 'No Website';

}

# Smilies

$comment =~ s/\/<img src="$smilies_url\/angel.gif">/sg;

$comment =~ s/\:bow:/<img src="$smilies_url\/bow.gif">/sg;

$comment =~ s/\:clap:/<img src="$smilies_url\/clap.gif">/sg;

$comment =~ s/\/<img src="$smilies_url\/cool.gif">/sg;

$comment =~ s/\:crazy:/<img src="$smilies_url\/crazy.gif">/sg;

$comment =~ s/\/<img src="$smilies_url\/cry.gif">/sg;

$comment =~ s/\:cry2:/<img src="$smilies_url\/cry2.gif">/sg;

$comment =~ s/\:dork:/<img src="$smilies_url\/dork.gif">/sg;

$comment =~ s/\/<img src="$smilies_url\/evil.gif">/sg;

$comment =~ s/\:flag:/<img src="$smilies_url\/flag.gif">/sg;

$comment =~ s/\:giggle:/<img src="$smilies_url\/giggle.gif">/sg;

$comment =~ s/\:grin:/<img src="$smilies_url\/grin.gif">/sg;

$comment =~ s/\:hbreak:/<img src="$smilies_url\/hbreak.gif">/sg;

$comment =~ s/\:hug:/<img src="$smilies_url\/hug.gif">/sg;

$comment =~ s/\:idea:/<img src="$smilies_url\/idea.gif">/sg;

$comment =~ s/\/<img src="$smilies_url\/laugh.gif">/sg;

$comment =~ s/\:lost:/<img src="$smilies_url\/lost.gif">/sg;

$comment =~ s/\:love:/<img src="$smilies_url\/love.gif">/sg;

$comment =~ s/\/<img src="$smilies_url\/mad.gif">/sg;

$comment =~ s/\:nervous:/<img src="$smilies_url\/nervous.gif">/sg;

$comment =~ s/\:no:/<img src="$smilies_url\/no.gif">/sg;

$comment =~ s/\:nono:/<img src="$smilies_url\/nono.gif">/sg;

$comment =~ s/\hno:/<img src="$smilies_url\/ohno.gif">/sg;

$comment =~ s/\mg:/<img src="$smilies_url\/omg.gif">/sg;

$comment =~ s/\:party:/<img src="$smilies_url\/party.gif">/sg;

$comment =~ s/\:peace:/<img src="$smilies_url\/peace.gif">/sg;

$comment =~ s/\:please:/<img src="$smilies_url\/please.gif">/sg;

$comment =~ s/\:quiet:/<img src="$smilies_url\/quiet.gif">/sg;

$comment =~ s/\/<img src="$smilies_url\/rofl.gif">/sg;

$comment =~ s/\:rose:/<img src="$smilies_url\/rose.gif">/sg;

$comment =~ s/\:sad:/<img src="$smilies_url\/sad.gif">/sg;

$comment =~ s/\:sigh:/<img src="$smilies_url\/sigh.gif">/sg;

$comment =~ s/\:smile:/<img src="$smilies_url\/smile.gif">/sg;

$comment =~ s/\:stop:/<img src="$smilies_url\/stop.gif">/sg;

$comment =~ s/\:thanku:/<img src="$smilies_url\/thanku.gif">/sg;

$comment =~ s/\:think:/<img src="$smilies_url\/think.gif">/sg;

$comment =~ s/\:whatever:/<img src="$smilies_url\/whatever.gif">/sg;

$comment =~ s/\:wink:/<img src="$smilies_url\/wink.gif">/sg;

$comment =~ s/\:yap:/<img src="$smilies_url\/yap.gif">/sg;

$comment =~ s/\:yay:/<img src="$smilies_url\/yay.gif">/sg;

# assemble finished guestbook entry

$entry = <<"EndOfText";

<P><strong><emp>Posted on $date</emp></strong>

<P><strong>Name:</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $name

<br> <strong>Email:</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A HREF=\"<A href="mailto:$email\">$email</A">mailto:$email\">$email</A>

<br><strong>My URL:</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A target="_blank" HREF=http://$url>$url</a>

<br><strong>Location:</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $from_where

<br><strong>Comments:</strong>

<BR><center><div style="width:500px">$comment</div></center></P>

<HR>

EndOfText

# Read old entries, write out new

$all_entries = $entry;

sysopen(ENTRIES, "$data_file", O_RDWR)

or die "can't open $data_file: $!";

flock(ENTRIES, 2) or die "can't LOCK_EX $data_file: $!";

while(<ENTRIES>) {

$all_entries .= $_;

}

if ($max_entries) {

# lop the tail off the guestbook, if necessary

@all_entries = split(/<HR>/i, $all_entries);

$entry_count = @all_entries - 1;

while ($entry_count > $max_entries) {

pop @all_entries;

$entry_count = @all_entries - 1;

}

$all_entries = join('<HR>', @all_entries);

}



# now write out to $data_file

seek(ENTRIES, 0, 0) or die "can't rewind $data_file: $!";

truncate(ENTRIES, 0) or die "can't truncate $data_file: $!";

print ENTRIES $all_entries or die "can't print to $data_file: $!";

close(ENTRIES) or die "can't close $data_file: $!";

}

# display the guestbook

open (IN, "$data_file") or die "Can't open $data_file for reading: $!";

flock(IN, 1) or die "Can't get LOCK_SH on $data_file: $!";

while (<IN>) {

print;

}

close IN or die "Can't close $data_file: $!";

# display the form

print <<"EndOfText";

<!-- BEGIN HTML CODE FOR FORM AND AFTER -->

<A NAME="form"><H2>Submit Your Voice!</H2></A>

<FORM NAME="gbook" METHOD="POST" ACTION="/cgi-bin/guestbook.cgi">

<TABLE>

<TR>

<TD ALIGN="right"><STRONG>Name:</STRONG></TD>

<TD><INPUT NAME="name" SIZE=30></TD>

</TR>

<TR>

<TD ALIGN="right"><STRONG>Email:</STRONG></TD>

<TD><INPUT NAME="email" SIZE=30></TD>

</TR>

<TR>

<TD ALIGN="right"><STRONG>My URL:</STRONG><br>(www.domain.com)</TD>

<TD><INPUT NAME="url" SIZE=30></TD>

</TR>

<TR>

<TD ALIGN="right"><STRONG>City:</STRONG></TD>

<TD><INPUT NAME="city" SIZE=30></TD>

</TR>

<TR>

<TD ALIGN="right"><STRONG>State:</STRONG></TD>

<TD><INPUT NAME="state" SIZE=30></TD>

</TR>

<TR>

<TD ALIGN="right"><STRONG>Country:</STRONG></TD>

<TD><INPUT NAME="country" SIZE=30 value="USA"></TD>

</TR>

<TR>

<TD ALIGN="right"><STRONG>Comment:</STRONG></TD>

<TD>

<TEXTAREA NAME="comment" ROWS=5 COLS=55 WRAP="virtual"></TEXTAREA>

</TD>

</TR>

<TR><TD COLSPAN=2> </TD></TR>

<TR>

<TD> </TD>

<TD><INPUT TYPE="submit" NAME="action" VALUE="Be Heard" onsubmit="return validate();"></TD>

</TR>

</TABLE>

</FORM>



<!-- BEGIN JAVASCRIPT VALIDATION -->

<script language="JavaScript">

<!--

document.gbook.onsubmit=validate;

function validate() {



var name=document.gbook.name.value;

if( (name.length==0) ) {



alert("Please Enter A Name.");

document.gbook.name.focus();

document.gbook.name.select();

return false;

}



var city=document.gbook.city.value;

if( (city.length==0) ) {



alert("Please Enter A City.");

document.gbook.city.focus();

document.gbook.city.select();

return false;

}

var state=document.gbook.state.value;

if( (state.length==0) ) {



alert("Please Enter A State.");

document.gbook.state.focus();

document.gbook.state.select();

return false;

}

var comment=document.gbook.comment.value;

if( (comment.length==0) ) {



alert("Please Enter A Comment.");

document.gbook.comment.focus();

document.gbook.comment.select();

return false;

}

var email=document.gbook.email.value;

if( (email.length<5) ||

(countchar(email," ")>0) ||

(countchar(email,"@")!=1) ||

(countchar(email,".")==0) ) {



alert("Invalid email format.");

document.gbook.email.focus();

document.gbook.email.select();

return false;

}



return true;

}



//-->

</script>

<!-- END JAVASCRIPT VALIDATION -->

</body>

</html>



EndOfText

Ultimater
11-01-2005, 02:34 AM
Get all the posts into a list, and based on the parameter, splice the list there.

Here's a demonstration:

#!/usr/bin/perl -w
use strict;
use warnings;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);

print header;

my @allEntrys=('post1','post2','post3','post4','post5','post6','post7','post8','post9','post10','post11 ','post12');
my $entrys=scalar(@allEntrys);

my $s=param("s")||0;
my $p=param("p")||10;
$s =~ s/[^0-9]//g;
$p =~ s/[^0-9]//g;
$s = $s||0;
$p = $p||10;

my @pageX=splice(@allEntrys,$s,$p);

print join('<br>',@pageX);
if($entrys>$s+$p){
print '<a href="'.url(-full=>1).'?s='.($s+$p).'&p='.$p.'">Next Page</a>';
}



edit:
Note that you can even go 2 posts at a time using this method.

mypage.pl?s=0&p=2