List View / Paging through Records
Use the sample app to create about 20 more landlord records. We'll enable 
pagination so that the list view displays a fixed number of records regardless 
how big the database becomes.
To save the effort of entering dummy data, we'll display 5 records per page. 
This number can be easily changed to more  reasonable values, such as 10 or 
20.
This is the original query to get all the landlords:
select landlords.*, persons.*
from landlords, persons
where landlords.personid=persons.personid
order by fname,lname
We'll be running the query twice with some variations. Record sorting is 
dropped for the first pass; pagination and sorting is added to the second pass.
The trick here is to write the query only once. 
$query="select landlords.*,persons.* 
    from landlords, persons
    where landlords.personid=persons.personid ";
$rs=sql_query($query,$db); // 1st pass
$count=sql_affected_rows($db, $rs);
$page=$_GET['page']+0;
if ($page<0) $page=0; //lower bound
$perpage=5;
$maxpage=ceil($count/$perpage)-1;
if ($maxpage<0) $maxpage=0; //lower bound
if ($page>$maxpage) $page=$maxpage; //upper bound
$start=$page*$perpage; //starting record position
$query.=" order by ffname limit $start, $perpage";
$rs=sql_query($query,$db); //2nd pass
If the records do not fit in one page, we can display the paging links:
if ($maxpage>1){
?>
<div style="padding:10px 0;">
  <a onclick="...">« Prev</a>
    |  
  Page <?echo $page+1;?> of <?echo $maxpage+1;?>
    |  
  <a onclick="...">Next »</a>
</div>
<?
}//paging
In  the  above  snippet,  «  gives  a  left  arrow  symbol («);  »  gives  a 
right  arrow  symbol (»);.  The  page  numbers  are  0-based,  so  they  need  to  be 
increamented by one when displayed.
Before we fill out the blanks in the Prev and Next links, let's take a look at 
the pieces we have so far, and how they fit in the LCHH architecture.
First there is a list view container, lv0 that serves as a 
Loader. Clicking on the 
menu icon is handled by the showview Client 
Handler, which in turn, triggers 
the  listlandlords  function  via  the  slv0  Server  
Handler.  The  listlandlords
function outputs the 
Content that's injected back to the loader lv0.
Loader, Handler, Handler, Content
The paging links in the content invoke more client-side events that  keep the 
LCHH cycle running.
For now, we can reuse the lv0 container and the slv0 message. Since the page 
calculation in listlandlords is already getting the page parameter, we can set 
the Next page link to the following:
<a 
onclick="ajxpgn('lv0',document.appsettings.codepage +'?cmd=slv0
  &page=<?echo $page+1;?>');">
    Next »
</a>
In  the  sample  application,  
document.appsettings.codepage  is  evaluated  to 
myservices.php. This value is set in  
settings.php  and can be retrieved on the 
server side as well, using the global 
$codepage variable:
<?
global $codepage;
?>
<a 
onclick="ajxpgn('lv0','<?echo $codepage;?>?cmd=slv0
  &page=<?echo $page+1;?>');">
    Next »
</a>
Using  lv0  to  inject  the  content  is  not  the  greatest  idea.  Later  we'll  add  a 
search  box  in  the  list  view.  When  each  keystroke  reloads  the  content  that 
includes the search box, the typing is interrupted. In addition, the script block 
at the end of listlandlords is repeated loaded for no reason.
Let's define a sub-loader:
<?php
function listlandlords(){
  global $db;
  $mode=$_GET['mode'];
  if ($mode=='embed'){
?>
<div class="section">
  <div id="landlordlist">
<?
  } //embed
// ... 
if ($mode=='embed'){
?>
  </div>
</div>
<script>
  //...
</script>
<?
  } //embed
} //function
Now add the embed parameter to the client handler:
<a 
onclick="ajxpgn('lv0',document.appsettings.codepage + '?cmd=slv0
    &page=<?echo $page+1;?>
    &mode=embed');">
  Next »
</a>