|  | Posted by M. Sokolewicz on 01/08/05 18:24 
and now a few small comments to your code ;)
 
 Bruno B B Magalhães wrote:
 > Thanks for your help, in fact helped a lot... Now my function only
 > performs 2 queries, here it is:
 >
 > =======================================
 >     function fetch_paginated($query='',$page=1,$itens=20)
 >     {
 >         $this->query($query);
 >         $total_rows = $this->num_rows();
 >
 >         if($total_rows > $itens)
 >         {
 >             $this->total_pages = ceil($total_rows/$itens);
 >             $this->pages_before = ceil($page - 1);  // No need to ceil this!
 // $page is an integer, meaning a full numer (like 1, 10, 125, -15,
 etc.) ceiling the result is not useful, since the result is an integer
 aswell.
 >             $this->pages_after = ceil($this->total_pages - $page); // same thing here
 // no need to ceil it.
 >
 >             $this->query($query.' LIMIT
 > '.(($page*$itens)-$itens).','.$itens);
 >
 >             while($this->fetch_array())
 >             {
 >                 $results[] = $this->row;
 >             }
 >         }
 >         elseif($total_rows > 0)
 >         {
 >             while($this->fetch_array())
 >             {
 >                 $results[] = $this->row;
 >             }
 >
 >             $this->total_pages = '1';
 >             $this->pages_before = '0';
 >             $this->pages_after =  '0';
 // here, I suggest not making those values STRINGS, but instead leaving
 them be integers. So instead do:
 /*
 $this->total_pages = 1;
 $this->pages_before = 0;
 $this->pages_after =  0;
 */
 >         }
 >         else
 >         {
 >             return null;
 >         }
 >
 >         return $results;
 >     }
 > =======================================
 >
 >
 > Regards,
 > Bruno B B Magalhães
 >
 > On Jan 7, 2005, at 10:09 PM, M. Sokolewicz wrote:
 >
 >> first of all, you're running 4 queries here. 4 queries is a lot!
 >> Especially when you don't need more than 2 ;)
 >> the problem here is that your queries are pretty "unknown" to this
 >> function. Although it does a nice result for that unknowing, there's a
 >> few minor things that make it faster.
 >>
 >> First of all, would be using less queries.
 >> What I usually do is issue a query like this:
 >> "SELECT count(some_unique_col) WHERE
 >> (that_where_clause_youre_using_in_the_select_query)"
 >> then, we do some math.
 >>
 >> $pages_before = $page-1;
 >> $rows_before = $pages_before*$itens;
 >>
 >> $rows_after = $total_number_of_rows-($page*$itens);
 >> $pages_after = ceil($rows_after/20);
 >>
 >> Then do the actual selecting of the rows using the limit.
 >>
 >> The thing that makes it slow in your example is the fact that 4 times
 >> you're selecting ALL data from the relevant rows, and buffer it. You
 >> buffer it, but don't use any of it, except for the number of rows.
 >> Mysql does a far quicker job at this than PHP would, so use mysql. :)
 >> Then, you're using 3 queries to determine the rows around the page;
 >> even though, with a bit of simple math, you can calculate it. And
 >> trust me on this, simple math is faster ;)
 >>
 >> anyway, hope that helped.
 >
 >
 [Back to original message] |