How can I do pagination of HABTM data? - php

i have a table where a Collection has many Entities and an Entity has and belongs to many colections..now for a particular collection there are many entities..how can i paginate those entities belonging to a particular collection..
my find query says..,
$this->Collection->find('first', array('condition'=>array('uid'=>$uid)),
'contains(array('Entity')));
now how to paginate the result of entities..

In your controller action
$this->paginate=array('Entity' => array(
'conditions' => "Entity.collection_id=$id",
'fields' => array('Entity.*')
)
);
$this->set('entities', $this->paginate($this->Collection->Entity));

I'm assuming here that you're using an SQL database.
Now i haven't tested the code, but i think it should work.
// First query to get some info.
$testquery = mysql_query("SELECT * FROM `table` WHERE `entity` = 'something'");
if(!$testquery) die(mysql_error());
$total_items = mysql_num_rows($testquery); // Count the total number of entity's that match the criteria.
$limit = 10; // Maximun number of entity's on page.
$page = $_GET['page'];
//calcuate total pages
$total_pages = ceil($total_items / $limit); // ceil is used to round up fractions to the next int
$set_limit = $page * $limit - ($limit);
$query2 = mysql_query("SELECT * FROM `table` WHERE `entity` = 'something' LIMIT $set_limit, $limit");
if(!$query2) die(mysql_error());
//show data matching query:
while($code = mysql_fetch_object($query2)) {
echo("item: ".$code->title."<BR>");
}
// This displays the "previous page" link if there is a previous page.
$prev_page = $page - 1;
if($prev_page >= 1) {
echo("<a href=yourpagename.php?page=$prev_page>Previous</a>");
}
//Display middle pages:
$mid_page = 1;
while ($total_pages >= $mid_page) {
if ($page == $midpage){
echo ("<b>$mid_page</b> | ");
}
else {
echo (" <a href=yourpagename.php?page=$mid_page> $mid_page </a> | ");
$midpage++;
}
}
// This page will display a "next page" link if there is one.
$next_page = $page + 1;
if($next_page <= $total_pages) {
echo("<a href=yourpagename.php?page=$next_page>Next</a>");
}

Related

I need guidance in fixing pagination PHP code

I'm working on a piece of code that does pagination for different sorting systems. It works for likes (sorting system) and outputs correctly, but does not work for the sorting system of tag.
$sorting = $_GET["sorting"];
$page = $_GET["page"];
$per_page = 10;
$pages = $count_total->num_rows;
$total_pages = ceil($pages / $per_page);
if($sorting == "likes") {
$count_total = $db2->query("SELECT * FROM likes WHERE user='$user'");
}
if($sorting == "tag") {
$tag_name = $_GET["tag_name"];
$count_total = $db2->query("SELECT * FROM movie_tags WHERE tag_id='$tag_name'");
}
$pages = $count_total->num_rows;
$total_pages = ceil($pages / $per_page);
$start = (($page - 1) * $per_page);
for ($number=1; $number<=$total_pages; $number++) {
if($page == $number) {
echo '<div class="complete_page">'.$number.'</div>';
} else {
$sorting = $_GET["sorting"];
echo ' <div class="number_page">'.$number.'</div>';
}
}
This is an example of how I'm using pagination:
$movie = $db2->query("SELECT * FROM movies ORDER BY likes DESC LIMIT $start, $per_page");
NOTE: When I echo $pages, both sorting systems generate values. In fact, tag has a value of 11. Why is this value not creating the pagination system. I know this is not a problem with the pagination system because it is working for the sorting system of likes.
To have pagination in php, Simply you have to use two things in query.
Offset
Limit
For example for having pagination the query looks like
Select * from table Limit 5 Offset 0
Make logic in php, get count of products and change these two values for pagination

Pagination script last page

I created php script following the tutorial, but it has a mistake. It displays in the last page information which is in the previous page - it's because $perpage. How can I display only data which wasn't display yet.
EXAMPLE - If I set $perpage to 3 and I have 7 records (named 1,2,3,4,5,6,7) on page one is 1,2,3 on page two is 4,5,6 and on the last page is 5,6,7 (I want to display only record 7)
$query = mysql_query("SELECT ID FROM clanek");
$count = mysql_num_rows($query);
$perpage = 3; // řádků na stránku
$pages_count = ceil($count / $perpage); //celkem stránek zaokrohleno
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$is_first = $page == 1; //první stránka
$is_last = $page == $pages_count;
$prev = max(1, $page - 1);
$next = min($pages_count , $page + 1); /
$data = mysql_query("SELECT DATE_FORMAT(datum_pridani_c,'%d.%m.%Y %H:%i:%s')as datumcas,nazev,kratky_popis,ID FROM clanek ORDER BY datum_pridani_c DESC LIMIT ".($page - 1).", ".$perpage); /
while ($zaznam = mysql_fetch_array($data)) {
//some info her
}
if($pages_count>0) {
if(!$is_first) {
echo '<a class="predchozistranka" href="index.php?page='.$prev.'">Předchozí</a>';
}
echo '<span class="stranka">Stránka '.$page.' / '.$pages_count.'</span>';
if(!$is_last) {
echo '<a class="dalsistranka" href="index.php?page='.$next.'">Další</a>';
}
}
$data = mysql_query("SELECT DATE_FORMAT(datum_pridani_c,'%d.%m.%Y %H:%i:%s')as datumcas,nazev,kratky_popis,ID FROM clanek ORDER BY datum_pridani_c DESC LIMIT ".($page - 1).", ".$perpage);
It has been a while since I have used MySQL but I fired up my Workbench just now and I see that the syntax for LIMIT is LIMIT offset,rowcount. The doc says so too http://dev.mysql.com/doc/refman/5.0/en/select.html
For your query to work then, instead of ($page - 1), $perpage, it should be ($page - 1)*$perpage, $perpage
$query = mysql_query("SELECT ID FROM clanek");
$count = mysql_num_rows($query);
Irrelevant but the above code is highly inefficient for getting the total number of rows. It would be better if you use SELECT count(id) FROM clanek

SQL Server 2008 Pagination PHP

I am trying to display 10 records per page by using ROW_NUMBER function of SQL SERVER 2008.
I think there is something wrong with my query because I only define where to start and where to end displaying records (from 1 to 10), but not the amount of records displayed per page.
As I go to the next page I get no results displayed at all because I don't know how to add $per_page variable to my SQL query properly.
All I want is be able to display the first 10 product IDs on page 1, and once I click on the "next" button, the next 10 product IDs will be displayed, etc.
This is the code that I have right now:
$per_page = 10;
if(!isset($_GET['page']))
{
$page = 1;
}
else
{
$page = $_GET['page'];
}
if($page<=1)
{
$start = 0;
}
else
{
$start = $page * $per_page - $per_page;
}
$tsql = " SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY productID) AS
rownum, productID FROM products) AS products1
WHERE rownum >= $start AND rownum <= $per_page";
$num_rows = sqlsrv_num_rows(sqlsrv_query($conn,$tsql));
$num_pages = ceil($num_rows / $per_page);
$stmt = sqlsrv_query($conn,$tsql);
while($row = sqlsrv_fetch_array($stmt)){
echo $row['productID']. "<br/>";
}
$prev = $page - 1;
$next = $page + 1;
echo "<hr>";
//prev
if($prev > 0)
{
echo "<a href='?page=$prev'>prev</a> ";
}
//numbers
$number = 1;
for($number; $number <= $num_pages; $number +=1)
{
if($page==$number)
{
echo " <b>[$number]</b> ";
}
else
{
echo "<a href='?page=$number'>$number</a> ";
}
}
//next
echo "<a href='?page=$next'>next</a>";
I'm not familiar with sql server, but it seems to me you just need the end point:
$tsql = " SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY productID) AS
rownum, productID FROM products) AS products1
WHERE rownum >= $start AND rownum < ($start + $per_page)";
^ changed ^
And if $page is supposed to be an integer, it's always best to make sure that it is:
$page = (int) $_GET['page'];

how to use paging in displaying records from the database?

I am displaying some records from the database. Currently I am displaying the top twenty records but I want to show all records with twenty records per page.
How will I use the paging in php to display all records?'
Any Idea about this?
Something like this might work:
$posts_per_page = 10;
$page = isset($_GET['page']) ? intval($_GET['page']) : 0;
$query = sprintf("SELECT * FROM <table> LIMIT %d, %d",
$page * $post_per_page,
$posts_per_page);
$result = mysql_query($query);
The above query will select 10 records with a offset based on the current page.
You will also have to get the total number of pages based on the $posts_per_page:
$query = "SELECT COUNT(*) c FROM <table>";
You will have to keep track of the total number of posts divided with $posts_per_page and also the current page, then you can display a prev and next link:
if ($current_page > 0) {
echo '<a href="index.php?page=' . ($current_page - 1) . '>prev</a>';
}
if ($current_page < $max_pages - 1) {
echo '<a href="index.php?page=' . ($current_page + 1) . '>next</a>';
}
The basic idea is to send a page variable, for example $page, to your script and then customize your MySQL query to retrieve only that page's results.
Here is an example so you can see what I mean:
$page = $_GET['page'];
$resultsPerPage = 20;
$start = ($page - 1) * $resultsPerPage;
$query = "SELECT `results` FROM `table` WHERE ... ORDER BY `date` LIMIT $start, $resultsPerPage"
You can see how if $page = 1, then $start = 0 and this query will retrieve the 20 results, offset at 0. For $page = 2, $start = 20 so the query will retrieve the results from 20 - 40, which should show on the second page.
This is assuming your first page is 1. If you want the first page to be 0, then you need to change $start:
$start = $page * $resultsPerPage;

PHP & MySQL Pagination

I have a MySQL query
SELECT * FROM 'redirect'
WHERE 'user_id'= \''.$_SESSION['user_id'].' \'
ORDER BY 'timestamp'`
I want to paginate 10 results per page. How Can I do it?
Here is a nice starting point:
<?php
// insert your mysql connection code here
$perPage = 10;
$page = (isset($_GET['page'])) ? (int)$_GET['page'] : 1;
$startAt = $perPage * ($page - 1);
$query = "SELECT COUNT(*) as total FROM redirect
WHERE user_id = '".$_SESSION['user_id']."'";
$r = mysql_fetch_assoc(mysql_query($query));
$totalPages = ceil($r['total'] / $perPage);
$links = "";
for ($i = 1; $i <= $totalPages; $i++) {
$links .= ($i != $page )
? "<a href='index.php?page=$i'>Page $i</a> "
: "$page ";
}
$r = mysql_query($query);
$query = "SELECT * FROM 'redirect'
WHERE 'user_id'= \''.$_SESSION['user_id'].' \'
ORDER BY 'timestamp' LIMIT $startAt, $perPage";
$r = mysql_query($query);
// display results here the way you want
echo $links; // show links to other pages
Use LIMIT.
SELECT *
FROM redirect
WHERE user_id = '35251'
ORDER BY timestamp
LIMIT 40, 10
40 is how many records to skip, 10 is how many to display.
There are also a few problems with your PHP. You use backticks (not single quotes) to surround table and column names. And you shouldn't use string concatenation to build your query.
Here is my code
which contains next and Previous button
<?php
$limit = 3; //set Number of entries to show in a page.
// Look for a GET variable page if not found default is 1.
if (isset($_GET["page"])) {
$page = $_GET["page"];
}
else { $page=1;
}
//determine the sql LIMIT starting number for the results on the displaying page
$page_index = ($page-1) * $limit; // 0
$All_Users=mysqli_query($con,"select * from users limit $page_index, $limit");
while($row=mysqli_fetch_array($All_Users))
{
//show data in table or where you want..
}
$all_data=mysqli_query($con,"select count(*) from users");
$user_count = mysqli_fetch_row($all_data); // say total count 9
$total_records = $user_count[0]; //9
$total_pages = ceil($total_records / $limit); // 9/3= 3
if($page >= 2){
echo "<a href='blog.php?page=".($page-1)."' class='btn
customBtn2'>Previous</a>";
}
if($page<$total_pages) {
echo "<a href='blog.php?page=".($page+1)."' class='btn customBtn2'>NEXT</a>";
}
?>
Use the LIMIT clausule of the query to limit the amount of results you retrieve from the database.
See: http://dev.mysql.com/doc/refman/5.1/en/select.html

Categories