PDA

View Full Version : صفحه بندی کردن مقادیر دیتابیس



hesam3
پنج شنبه 03 مرداد 1398, 03:28 صبح
سلام به همه دوستان ، من مقدار 20 row داخل دیتابیس دارم ، یعنی به عنوان مثال 20 تا کاربر دارم داخل دیتابیس ؛ حالا من میخوام 5 تا از این افراد رو در صفحه اول ؛ 5 تا صفحه دوم . 5 تا سوم . چهارم نمایش بدم .

قصد من دقیقا این هست که اگر کوئری خاصی هست که باهاش بشه این کار و انجام داد انجام بدم ...
حالا میخوام اگر مقدار کاربران ما از 20 تا هم بیشتر بود مثلا 500 تا هم بود این مقدار با صفحات بیشتری هم بشه انجام داد و قصد من این هست که بهینه باشه چون میخوام نتایج کوئری رو در نرم افزاری نمایش بدم .

باتشکر از همه دوستان .

ali_sed
پنج شنبه 03 مرداد 1398, 11:30 صبح
سلام

ساختار کوئری اسکیول شما بصورت زیر باید باشد. توصیه می کنم حتما از order متناسب با نیاز خودتان استفاده کنید


#page 1
select * from table_name order by id_table desc limit 0,5

#page 2
select * from table_name order by id_table desc limit 5,5

#page 3
select * from table_name order by id_table desc limit 10,5

#page 4
select * from table_name order by id_table desc limit 15,5


دستور لیمیت دو مقدار میگیرد که اولی offset (تعداد سطرهایی که نباید در نظر گرفته شود) و دومی تعداد سطرهای مورد نظر است. بنابراین یک رابطه ساده بین شماره صفحه و آفست وجود دارد (page-1)*rowsPerPage



$rowsPerPage = 5;
$currentPage= (int)$_REQUEST['page'];
if($currentPage<1) $currentPage= 1;
$offset = ($currentPage-1)*$rowsPerPage;

$query = 'select * from table_name order by id_table desc limit "'. $offset .'","'. $rowsPerPage .'"';

مورد بعدی این است که چگونه در url شماره صفحه را بگنجانیم. ساده ترین روش آن استفاده از query string می باشد مثلا mydomain.com/users.php?page=4.
می توانید از فرم های کاربر پسند دیگری مانند mydomain.com/users/page/4 نیز استفاده کنید.

در نهایت به بخشی نیاز داریم تا شماره صفحات را به کاربر نمایش دهد. و لینک آنها را با توجه به توضیحات مرحله قبل بسازد. در اینجا ما به دو مقدار نیاز داریم یکی تعداد کل کاربران (در اینجا 20 تا) و دیگری تعداد سطرهای موردنظر در هر صفحه (در اینجا 5 تا) تا از آنها تعداد صفحات را بدست آوریم تعداد صفحات برابر است با ceil($countUsers/$rowsPerPage)

بقیه مراحل به راحتی در یک حلقه قابل انجام است:


/*
* pagening results
*/
$perPage = 5;
$pages = 0;
//بسته به کلاس مورد استفاده، دستور زیر را اصلاح کنید
$result = $db->fetch('select count(*) from users');

if($result)
$pages = ceil($result['count(*)'] / $perPage);


$currentPage= (int)$_REQUEST['page'];
//شماره صفحه نمیتواند کوچکتر از 1 و یا بزرگتر از کل صفحات باشد.
if($currentPage<1) $currentPage= 1;
if($currentPage>$pages) $currentPage= $pages;

//برای یک صفحه نیازی به نمایش شماره صفحات نیست
if($pages>1){
echo '<ul class="pagening">';
for($i = 1; $i <= $pages; $i++){
echo '<li class="'.($currentPage==$i?'active':'').'"><a href="/users.php?page='.$i.'">'.$i.'</a></li>';
}
echo '</ul>';
}

با افزایش تعداد کاربران تعداد صفحات نیز افزایش می یابد و منطقی نیست که مثلا لینک 100 تا صفحه را داخل سایت قرار دهیم برای این کار کافیست تا الگویی برای اینکه کدام صفحات نمایش یابند و کدام صفحات نمایش نیابند در نظر بگیریم. به اینصورت که 4 صفحه قبل و بعد از صفحه کنونی کاربر را نمایش دهیم + شماره صفحه اول و آخر
فرض کنیم کاربر در صفحه اول قرار دارد: 1-2-3-4-5-...-20
فرض کنیم کاربر در صفحه 8 قرار دارد: 1-...-4-5-6-7-8-9-10-11-12-...-20
و اگر کاربر در صفحه 20 قرار داشت: 1-...-16-17-18-19-20
بسته به نیاز خود می توانید این الگو را تغییر دهید.

حال کافیست یک شرط ساده در ابتدای حلقه قرار دهیم تا موارد غیر ضروری را در نظر نگیرد. یا اینکه صفحات را به سه بخش تقسیم کنیم و محدوده هر کدام را تعیین کنیم و از سه حلقه برای نمایش آنها استفاده کنیم مثلا برای مورد دوم این بازه ها بصورت 1تا1 و 4 تا 12 و 20 تا 20 تقسیم می شود. روش دوم بهتره چون اگر تعداد صفحات خیلی زیاد باشه نیازی نیست همه آنها را در لوپ مرور کنید. دلیل استفاده از سه حلقه این است که ممکن است بخواهید شماره صفحات دارای این الگو باشند مثلا 1-2-3-4-5-6-7-8-9-10-11-12-...-18-19-20 سه حلقه 1تا3 و 4تا12 و 18تا20 خواهیم داشت. در ضمن به حالت هایی که ممکن است محدوده این حلقه ها همپوشانی داشته باشند و مواردی که نیاز به ... نمی باشد دقت کنید.

در نهایت تمامی این موارد را می توانید در یک کلاس پیاده کنید که ورودی های آن صفحه جاری / تعداد کل سطرها / تعداد سطرهای هر صفحه / و الگوی url می باشد و به عنوان خروجی می تواند صفحه بندی را بصورت خودکار انجام دهد.

hesam3
پنج شنبه 03 مرداد 1398, 15:48 عصر
خیلی ممنونم از پاسختون ، مشکل کاملا حل شد :لبخندساده::چشمک: