Как исправить пагинацию в oracle?

Я показываю пользователю записи о том, сколько форм он / она принял, и для этой цели я использую нумерацию страниц в php. Данные извлекаются из базы данных оракула и отображаются в таблице. Я использую нумерацию страниц, но когда я перехожу на следующую страницу, она показывает, что новые записи предыдущей записи не отображаются.

<table>
<tbody>
<?php
include('connect.php');
$user_name = $_SESSION['username'];
$sql = oci_parse($conn,"select * from userM where user_name = '$user_name'");
$result = oci_execute($sql);

while(($row = oci_fetch_array($sql,OCI_BOTH)) != false ){
$approvedBy = $row[1];
}
if(!isset($_GET['page'])){
$_GET['page'] = 0;
}else{
// Convert the page number to an integer
$_GET['page'] = (int)$_GET['page'];
}
$varPage = $_GET['page'];
if($varPage == "" || $varPage == "1"){
$page1 = 0;
}else{
$page1 = ($varPage*6)-6;
}
$approvedBy = strtoupper($approvedBy);

$sql = oci_parse($conn,"SELECT * FROM formC where UPPER(approvedBy) = '$approvedBy' AND rownum < 7");
oci_execute($sql);

while(($row = oci_fetch_array($sql,OCI_BOTH)) != false )  {
$accountingNo = $row[0];
?>
<tr>
<td style="color:black"><?php echo  $row[0] ?></td>
<td style="color:black"><?php echo  $row[1] ?></td>
<td style="color:black"><?php echo  $row[2]  ?></td>
<td style="color:black"><?php echo $row[3]?></td>
<td style="color:black"><?php echo $row[4] ?></td>
<td style="color:black"><?php echo $row[7] ?></td>
</tr>
<?php
}
?>
</tbody>
</table>

<?php
$sql1 = oci_parse($conn,"SELECT * FROM formC where UPPER(approvedBy) = '$approvedBy'");
oci_execute($sql1);
$count = oci_fetch_all($sql1,$abc);
$a=$count/6;
$a = ceil($a);

for($b=1;$b<=$a;$b++){
?>
<a href="approvedList.php?page=<?php echo $b?>" style="text-decoration;align:center: none;" class="btn btn-success "><?php echo $b." "; ?></a>
<?php
}
oci_close($conn);
?>
</div>

0

Решение

Это объясняется в Подземное руководство по PHP и Oracle, страница 181:

Канонический пейджинговый запрос для Oracle8i и далее приведен на http://asktom.oracle.com:

select *
from ( select a.*, rownum as rnum
from (YOUR_QUERY_GOES_HERE -- including the order by) a
where rownum <= MAX_ROW )
where rnum >= MIN_ROW

Здесь MIN_ROW — номер строки
первая строка, а MAX_ROW — номер строки последней строки для возврата.

Есть даже полный пример скрипта:

<?php
$c = oci_connect('hr', 'welcome', 'localhost/XE');
$mystmt = "select city from locations order by city";
$minrow = 4; // row number of first row to return
$maxrow = 8; // row number of last row to return
$pagesql = "select *
from ( select a.*, rownum as rnum
from ( $mystmt ) a
where rownum <= :maxrow)
where rnum >= :minrow";
$s = oci_parse($c, $pagesql);
oci_bind_by_name($s, ":maxrow", $maxrow);
oci_bind_by_name($s, ":minrow", $minrow);
oci_execute($s);
oci_fetch_all($s, $res);
var_dump($res);
?>

Редактировать:

Как упоминается Кристофер Джонс, в Oracle> = 12.1 есть более чистый способ сделать это, используя смещение:

select *
from mytable
order by myfield
offset X rows fetch next Y rows only
1

Другие решения

Я не оракул, но я не рекомендую вам выбирать все строки и считать их, я думаю, что лучше использовать этот код для подсчета строк:

$sql1 = oci_parse($conn,"SELECT COUNT(*) FROM formC where UPPER(approvedBy) = '$approvedBy'");
oci_execute($sql1);
$count = oci_fetch_all($sql1,$abc);
$a=$count/6;

документация по счету оракулов

чтобы решить вашу проблему, посмотрите этот вопрос:Как ограничить количество строк, возвращаемых запросом Oracle после упорядочивания?

Вы рассчитываете текущую страницу и сохраняете ее в $page1 но не использовал его в вашем запросе !!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector