2017-01-05 2 views
1

Я сделал эту разбивку на страницы, используя PHP и SQL. Идентификаторы 11 и 12 отсутствуют в модуле страницы 2. Я не могу понять, где моя ошибка. Вот мой исходный код:Php разбиение на страницы с SQL не работает

<?php 
$per_page = 5; 
$rec_count = $row['id']; 
$total_pages = ceil($rec_count/$per_page);   

if (isset($_GET['page'])) { 
    $show_page = $_GET['page']; //current page 
    if ($show_page > 0 && $show_page <= $total_pages) { 
     $start = ($show_page - 1) * $per_page; 
     $end = $start + $per_page; 
    } else { 
     $start = 0; 
     $end = $per_page; 
    } 
} else { 
    $start = 0; 
    $end = $per_page; 
} 

$page = intval($_GET['page']); 
$tpages=$total_pages; 
if ($page <= 0) 
    $page = 1; 

$sql = "SELECT COUNT(Id) AS id FROM [Register].[dbo].[RegisData] WHERE DeleteStatus = 1"; 
$result = sqlsrv_query($conn,$sql); 
$row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC); 
$rec_count = $row['id']; 
$total_pages = ceil($rec_count/$per_page); 

$sql1 = "SELECT [Id],[FirstName],[LastName],[ProfilePic],[Gender] 
     ,[Email],[MobileNo],[Company],[Designation],[Country],[State],[Address],[City] 
     ,[Pincode],[Hobbies],[DietaryHabits],[DeleteStatus] 
     FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY RegId) as row 
     FROM [Register].[dbo].[RegisData]) 
     a WHERE row between $start and $end 
     AND DeleteStatus = 1 
     ORDER BY RegId"; 

$result = sqlsrv_query($conn,$sql1); 
$z = 1; 
for ($x=1; $x<=$total_pages; $x++) { 
    echo $x; 
} 
?> 
+0

[1]: https://i.stack.imgur.com/lSAuk.jpg [2]: https://i.stack.imgur.com/DwRFw .jpg [3]: https://i.stack.imgur.com/VMbSC.jpg –

ответ

0

, как вы сделали пагинацию в сочетании с DeleteStatus = 1 всегда будет создавать сломанные и неполные страницы (если взять все строки от 1 до 5 и номер строки 4, DeleteStatus = 0 вы только получите 4 ряда)

вы должны использовать LIMIT функциональность SQL, что позволяет выбрать номер строки результата, чтобы начать и сколько строк, чтобы показать после пункта WHERE так попробовать

$page = intval($_GET['page']); 
if($page == 0) $page = 1; 
$per_page = 5; 
$offset = ($page -1) * $per_page; 

$sql1 = "SELECT [Id],[FirstName],[LastName],[ProfilePic],[Gender] 
    ,[Email],[MobileNo],[Company],[Designation],[Country],[State],[Address],[City] 
    ,[Pincode],[Hobbies],[DietaryHabits],[DeleteStatus] 
    FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY RegId) as row 
    FROM [Register].[dbo].[RegisData]) 
    a WHERE DeleteStatus = 1 
    ORDER BY RegId 
    LIMIT {$per_page} OFFSET {$offset}"; 

больше на LIMIT в SQL, взгляните на краткое объяснение: https://www.techonthenet.com/sql/select_limit.php это действительно то, что вы ищете

--- EDIT ----

, так как вы не хотите использовать мое предложенное решение (по неизвестным причинам) вы можете попытаться сделать это изменение в код:

$sql1 = "SELECT [Id],[FirstName],[LastName],[ProfilePic],[Gender] 
    ,[Email],[MobileNo],[Company],[Designation],[Country],[State],[Address],[City] 
    ,[Pincode],[Hobbies],[DietaryHabits],[DeleteStatus] 
    FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY RegId) as row 
    FROM [Register].[dbo].[RegisData] WHERE DeleteStatus = 1) 
    a WHERE row between $start and $end 
    AND DeleteStatus = 1 
    ORDER BY RegId"; 

, что я сделал, это добавить условие WHERE DeleteStatus = 1 к внутреннему запросу, нумеруют строки, таким образом ваш фильтр должен работатьОжидается, - хотя вы должны использовать LIMIT

Для предотвращения дубликатов (5 появляющийся как для страницы 1 и страница 2) вы должны изменить это, если:

if ($show_page > 0 && $show_page <= $total_pages) { 
    $start = ($show_page - 1) * $per_page; 
    $end = $start + $per_page; 
} 

к этому:

if ($show_page > 1 && $show_page <= $total_pages) { 
    $start = ($show_page - 1) * $per_page + 1; 
    $end = $start + $per_page; 
} 

снова, если бы вы использовали LIMIT, это не было бы проблемой

+0

Спасибо за ваш быстрый ответ sir ;-). Я использую SQL как back end, а не MYSQL. –

+0

Сэр, я не использую запрос на удаление, поэтому вместо этого я использую update как «DeleteStatus = 0», поэтому я использовал «DeleteStatus = 1» –

+0

Привет, друг! Во-первых, мы должны повторить ваш вопрос: D Я обновил свой ответ на работу с SQL - «LIMIT» появляется во всех БД, немного отличающихся друг от друга. и я понимаю, что вы сделали с «DeleteStatus», и все в порядке, но это то, где ваша проблема с этим вопросом. –

Смежные вопросы