I have the following PHP code:
$page = $_POST["page"];
$pageSize = $_POST["pageSize"];
$toRecord = $page * $pageSize;
$fromRecord = $toRecord - $pageSize;
$query = "SELECT * FROM table LIMIT $fromRecord, $toRecord";
Now, out of 10 total table records, if my $pageSize is '3', the first page returns me 3 records, the 2nd 6 records, the 3rd 4 records, and the last one 1 record. I have limited experience in SQL, what am I doing wrong?
LIMIT params are offset, row_count. So you should use not $toRecord, but $pageSize there - and don't forget about escaping it. In fact, I'd rewrite this logic a bit:
define('DEFAULT_PAGE_NO', 1);
define('DEFAULT_PAGE_SIZE', 10);
if (isset($_POST['page']) {
$pageNo = max(DEFAULT_PAGE_NO, (int)$_POST['page']);
}
else {
$pageNo = DEFAULT_PAGE_NO;
}
if (isset($_POST['pageSize']) {
$pageSize = (int)$_POST['pageSize'];
if ($pageSize <= 0) {
$pageSize = DEFAULT_PAGE_SIZE;
}
}
else {
$pageSize = DEFAULT_PAGE_SIZE;
}
$offset = ($pageNo - 1) * $pageSize;
$query = "SELECT * FROM table LIMIT $offset, $pageSize";
Related
I am having a problem with putting order by acctname limit 1,3. It is showing the same results from the 1st page to the last page.
<?php
$_payrolldate = '2019-10-15';
$pagenum = 1;
$record_limit_per_page = 24;
$offset = ($pagenum-1) * $record_limit_per_page;
$sql_count = mysqli_query($db,"SELECT COUNT(*) As total_records FROM `tbl_payroll_charges` WHERE payroll_date='$_payrolldate'");
$total_records = mysqli_fetch_array($sql_count);
$total_records = $total_records['total_records'];
$total_no_of_pages = ceil($total_records / $record_limit_per_page);
for ($pagenum = 1; $pagenum <= $total_no_of_pages; $pagenum++) {
$sqlEmp = "SELECT
tbl_payroll_charges.acctname,
tbl_payroll_charges.payroll_date,
tbl_payroll_charges.branch,
tbl_payroll_charges.date_happened,
tbl_payroll_charges.personal_charges,
tbl_payroll_charges.inventory_charges,
tbl_payroll_charges.raw_material_charges,
tbl_payroll_charges.infraction_charges,
tbl_payroll_charges.other_charges,
tbl_payroll_charges.total_charges
FROM tbl_payroll_charges
WHERE payroll_date='$_payrolldate'
order by acctname ASC
LIMIT $pagenum, $record_limit_per_page";
$empResult = mysqli_query($db, $sqlEmp);
$final_total = 0;
while($listemp = mysqli_fetch_array($empResult))
{
echo $listemp['acctname']."<br>";
}
}
The problem with the above code is that it is showing same results on all pages. This code generates 37 pages, each page returns 24 rows, 24 rows fit in one legal size paper. When I removed the "order by acctname" it works well.
the print layout before sending to the printer
The Final Image for Printing
So to make a final answer, This is the final code and thanks to smashrain for making me realize that i am stoopid hahaha anyway i am trying to make my own crystal report using php and pure css only.
<?php
$_payrolldate = '2019-10-15';
$pagenum = 1;
$record_limit_per_page = 24;
$sql_count = mysqli_query($db,"SELECT COUNT(*) As total_records FROM `tbl_payroll_charges` WHERE payroll_date='$_payrolldate'");
$total_records = mysqli_fetch_array($sql_count);
$total_records = $total_records['total_records'];
$total_no_of_pages = ceil($total_records / $record_limit_per_page);
for ($pagenum = 1; $pagenum <= $total_no_of_pages; $pagenum++) {
$offset = ($pagenum-1) * $record_limit_per_page;
$sqlEmp = "SELECT
tbl_payroll_charges.acctname,
tbl_payroll_charges.payroll_date,
tbl_payroll_charges.branch,
tbl_payroll_charges.date_happened,
tbl_payroll_charges.personal_charges,
tbl_payroll_charges.inventory_charges,
tbl_payroll_charges.raw_material_charges,
tbl_payroll_charges.infraction_charges,
tbl_payroll_charges.other_charges,
tbl_payroll_charges.total_charges
FROM tbl_payroll_charges
WHERE payroll_date='$_payrolldate'
order by acctname ASC
LIMIT $offset, $record_limit_per_page";
$empResult = mysqli_query($db, $sqlEmp);
$final_total = 0;
while($listemp = mysqli_fetch_array($empResult))
{
echo $listemp['acctname']."<br>";
}
}
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
Hi I have a system where I only want to display the last 300 records from MYSQL, normally i would just write the query like this LIMIT 300
the problem i have is i am using a pagination system which writes the query like this.
$tableName="masterip_details";
$targetpage ="raw_data.php";
$limit = 30;
$query = "SELECT COUNT(*) as num FROM $tableName where type='6' AND country_code='GB'";
$total_pages = mysql_fetch_array(mysql_query($query));
$total_pages = $total_pages[num];
$stages = 3;
$page = mysql_escape_string($_GET['page']);
if($page){
$start = ($page - 1) * $limit;
}else{
$start = 0;
}
// Get page data
$query1 = "SELECT * FROM $tableName where type='6' AND country_code='GB' LIMIT $start, $limit";
$result = mysql_query($query1);
The problem is because it uses the limit to calculate the start and finish page numbers i am not sure if i can limit the number of rows to return whilst using the pagination.
select * from (SELECT * FROM $tableName where type='6' AND country_code='GB' order by AUTO_INCERMENT_ID DESC LIMIT 300) as a order by AUTO_INCERMENT_ID ASC LIMIT $start, $limit
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
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>");
}