I’m not going to explain once again how this class works, because it was thoroughly covered in the previous articles in this series. Just let me to say that it aggregates the “MySQLConnector” object, accepting it as a parameter. It later uses the methods offered by this first object to execute SQL queries, display paged result sets and finally, generate the proper paging links. As usual, here’s the source code: class Pager { var $db; // MySQLConnector object var $query; // SQL query var $numRecs; // number of records per page var $output=''; // dynamic output function Pager(&$db,$query,$numRecs=5){ $this->db=&$db; (preg_match("/^SELECT/",$query))?$this->query=$query:die('Invalid query '.$query); (is_int($numRecs)&&$numRecs>0)?$this->numRecs=$numRecs:die('Invalid number of records'); } function displayRecords($page){ // calculate total number of records using MySQLConnector object if(!$totalRecs=$this->db->getNumRows($this->db->performQuery($this->query))){ die('Cannot retrieve records from database'); } // calculate number of pages $numPages=ceil($totalRecs/$this->numRecs); // validate page pointer $page if(!preg_match("/^\d{1,2}$/",$page)||$page<1||$page>$numPages){ $page=1; } // retrieve result set using MySQLConnector object $this->db->performQuery($this->query.' LIMIT '.($page-1)*$this->numRecs.','.$this->numRecs); while($rows=&$this->db->fetchRow()){ foreach($rows as $row){ $this->output.=$row.' '; } $this->output.='<br />'; } $this->output.='<div>'; // create previous link if($page>1){ $this->output.='<a href="'.$_SERVER['PHP_SELF'].'?page='.($page-1).'"><<Previous</a> '; } // create numbered links for($i=1;$i<=$numPages;$i++){ ($i!=$page)?$this->output.='<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i.'</a> ':$this->output.=$i.' '; } // create next link if($page<$numPages){ $this->output.=' <a href="'.$_SERVER['PHP_SELF'].'?page='.($page+1).'">Next>></a> '; } $this->output.='</div>'; // return generated output return $this->output; } } The only thing to be pointed out here is how we use the methods of the “MySQLConnector” object to perform the tasks inherent to the “Pager” class. Generally speaking, as a rule of thumb, when one object aggregates another one, the first object is passed as a reference to the second, in order to address some performance issues. Of course, the possible overhead caused to the server will depend strongly on how applications use the objects involved in the interaction process. For instance, if multiple objects are sharing the same object for connecting to a database, probably the server will suffer a heavy load when the application is used by numerous users. While this may sound like a common sense thing, it’s important to know where to implement aggregation in projects. Having listed the source code for each developed class, it’s time to build an illustrative example for proper implementation. Just turn the page and keep reading.
blog comments powered by Disqus |
|
|
|
|
|
|
|