PDA

View Full Version : آموزش: صفحه بندی یا pagination



H:Shojaei
یک شنبه 15 تیر 1393, 21:07 عصر
با سلام...
راستش دیدم خیلی تاپیکهای صفحه بندی زیاد شده و یه آموزش نسبتا کامل هم تقریبا نداریم هرکدوم بالاخره یه چیزی کم داره واسه همین گفتم یه ساده و اگه اساتید تایید کنن نسبتا کاملشو بذارم.
حالا بریم در ادامه ببینیم چی میشه دیگه... :D
...
واسه صفحه بندی معمولا از ارسال اطلاعات مورد نیاز به صورت GET استفاده میشه ما هم از همین روش استفاده میکنیم.
فرض کنید آدرس ما به این صورت میشه واسه صفحه بندی:
index.php?limit=10
حالا این مقدار رو اول کار تو یه متغیر میذاریم که ازش بعدا استفاده کنیم:


$limit=$_GET['limit'];


خوب حالا فرض میکنیم که میخوایم صفحه بندی رو بالای اطلاعات رکورد ها نشون بدیم یعنی اول صفحه بندی بعد اطلاعاتی که از جدول بدست میاد واسه این کار:

اول با یه کوئری تعداد کل رکورد ها رو بدست میاریم:


$query='select count(*) from `tbl`';$query=mysql_query($query); $query=mysql_fetch_assoc($query);$res=$query['count(*)'];

حالا باید یه متغیر داشته باشیم که تعداد سطرها در هر پیج رو نمایش میده مثلا ما در نظر میگیریم هر پیج 10 تا رکورد رو نمایش بده:


$pagenumrow=10;

خوب حالا تعداد کل رکورد ها رو داریم و تعداد رکورد در هر پیج که میخواد نمایش بدیم رو هم داریم باید ببینیم کلا چندتا پیج میشه که لینکهاش رو نمایش بدیم. واسه این کار تعداد کل رکوردها رو تقسیم بر تعداد رکورد تو هر پیج میکنیم که همون 10 هست و عدد رو به سمت بالا گرد میکنیم با تابع ceil() (این کار گرد کردن به بالا واسه اینه که مثلا اگه 41 تعداد کل رکورد جدول بشه تقسیمش کنیم میشه 4.1 و وقتی ازش استفاده بشه عدد 4 در نظر گرفته میشه در صورتی که باید باشه 5 چون تو پیج آخر هم یک رکورد داریم):


$res=ceil($res/$pagenumrow);

خوب حالا تعداد پیج ها رو هم داریم.
اول میایم پیج اول و پیج آخر رو لینک هاش رو میگذاریم این 2تا لینک که همیشه در حالت معمول باید باشن دیگه (البته این در حالتیه که در حال دیدن پیج های اول و آخر نباشیم که شرط هاش رو هم میذاریم واسش):


if($limit!=0)echo '<a class="btn" href=index.php?limit=0><<</a>';

این وسط هم پیج بندی اصلی رو نشون میدیم ( 1 2 3 4 و...)

if($limit!=$res&&$res>=0)echo '<a class="btn" href=index.php?limit='.$res.'>>></a>';


حالا میتونیم وسط پیج اول و پیج آخر مثلا 20 تا پیج رو در هر بار لینکهاشو نمایش بدیم مثلا همون:
1 2 3 4 و...
حالا این 20تا لینکی که از پیجها میخوایم نمایش بدیم چه اعدادی باشن یا چه پیجهایی رو لینک بدیم؟؟
این مطلب کاملا صلیقه ای هست یعنی شما میتونید این 20 پیج رو پشت سر هم مثل مثال یا مثلا اول 5تا پیج نشون بدین بعد یهو برین به پیج 50 بعد باز از اونجا به بعد 15تا پیج دیگه رو نمایش بدین... حالا ما تو این مثال همون پشت سر هم رو نمایش میدیم که ساده تره اگه این رو یاد بگیرین و بفهمیدش همه کاری میتونید خودتون بکنید:



if($limit!=0)echo '<a class="btn" href=index.php?limit=0><<</a>';$count=0;for($i=$limit;$i<$res&&$count<20;$i++ ,$count++) { $style=''; if($limit==$i) $style='style="color:#aaaaaa;text-decoration:underline;"'; if(!($count>10&&$count<14)) echo '<a class="btn" '.$style.' href='.BASE_URL.'mainadmin.php?page=orders&type='.$type.'&limit='.$i.'>'.$i.'</a>';}if($limit!=$res&&$res>=0)echo '<a class="btn" href=index.php?limit='.$res.'>>></a>';

میبینید که توی شرط حلقه چک کردیم که تا وقتی $i کوچکتر از تعداد کل پیجهاست و $count که یه شمارنده واسه حلقس و همون 20 تا پیج رو چک میکنه کمتر از 20 بود حلقه ادامه پیدا کنه.
خوب حالا شما مثلا میتونید یه چندتا پیج دستی دیگه رو هم به پیجهاتون اضافه کنید مثلا قبل یا بعد حلقه این کد رو بذارید تا لینک پیج وسط کل پیجها رو هم تو لینکهاتون داشته باشین:



if($limit!=$res/2&&$limit+20<$res/2&&$limit-20>$res/2)echo '<a class="btn" href=index.php?limit='.($res/2).'>>></a>';

توی شرطش هم چک کردیم که در حال دیدن همون پیج نباشیم و هم این که تو رنج اون 20 تا پیجی که نشون دادیم نباشه.
خوب حالا همینطوری میتونید هر شماره از پیجی رو که میخواید لینکش رو نمایش بدین.


حالا میریم واسه نمایش اطلاعات اون 10 تا رکوردی که از $limit شروع میشه و تا 10 تا رکورد بعدش رو میخونه:

$query='select * from `tbl` order by `id` desc limit '.($limit*$pagenumrow).' , '.$pagenumrow.';';$result=mysql_query($query);whil e($row=mysql_fetch_array($result)){ echo $row['name'].'<br/>';}
خوب کار تموم شد.
اینم کد نهایی که از این کار به دست اومد تست هم شده ...


include 'connect.php';/////////////vars$pagenumrow=1;$limit=$_GET['limit'];////////////paginations$query='select count(*) from `tuser`';$query=mysql_query($query); $query=mysql_fetch_assoc($query);$res=$query['count(*)'];$res=ceil($res/$pagenumrow);if($limit!=0)echo '<a class="btn" href=testtest.php?limit=0><<</a>';if($limit!=$res/2&&$limit+1<$res/2)echo '<a class="btn" href=testtest.php?limit='.($res/2).'>'.($res/2).'</a>';$count=0;for($i=$limit;$i<$res&&$count<17;$i++ ,$count++){$style='';if($limit==$i)$style='style="color:#aaaaaa;text-decoration:underline;"';echo '<a class="btn" '.$style.' href=testtest.php?limit='.$i.'> '.$i.' </a>';}if($limit!=$res-1&&$res-1>=0)echo '<a class="btn" href=testtest.php?limit='.($res-1).'>>></a>';echo ''; ////////////show table countent $query='select * from `tuser` order by `id` desc limit '.($limit*$pagenumrow).' , '.$pagenumrow.';';$result=mysql_query($query);whil e($row=mysql_fetch_array($result)){echo $row['muser'].'';}

فقط یه ایراد داره (البته تا جایی که من میدونم ایرادای دیگه هم 100% داره که من نمیدونم ;) ) اونم میذاریم به عهده دوستان رفعش نسبتا راحته...
استایل دهی و اینا هم با خودتون دیگه ;)
امیدوارم مورد قبول واقع شده باشه...

H:Shojaei
یک شنبه 15 تیر 1393, 21:11 عصر
ببخشید نمیدونم چرا قسمت آخرش به هم چسبیدس!!!! دوباره میذارمش


include 'connect.php';
/////////////vars
$pagenumrow=1;
$limit=$_GET['limit'];
////////////paginations
$query='select count(*) from `tuser`';
$query=mysql_query($query);
$query=mysql_fetch_assoc($query);
$res=$query['count(*)'];
$res=ceil($res/$pagenumrow);
if($limit!=0)echo '<a class="btn" href=testtest.php?limit=0><<</a>';
if($limit!=$res/2&&$limit+1<$res/2)echo '<a class="btn" href=testtest.php?limit='.($res/2).'>'.($res/2).'</a>';
$count=0;
for($i=$limit;$i<$res&&$count<17;$i++ ,$count++)
{
$style='';
if($limit==$i)
$style='style="color:#aaaaaa;text-decoration:underline;"';
echo '<a class="btn" '.$style.' href=testtest.php?limit='.$i.'> '.$i.' </a>';
}
if($limit!=$res-1&&$res-1>=0)echo '<a class="btn" href=testtest.php?limit='.($res-1).'>>></a>';
echo '<br><br>';

////////////show table countent
$query='select * from `tuser` order by `id` desc limit '.($limit*$pagenumrow).' , '.$pagenumrow.';';
$result=mysql_query($query);
while($row=mysql_fetch_array($result))
{
echo $row['muser'].'<br/>';
}

vahidqara
یک شنبه 15 تیر 1393, 22:51 عصر
ببخشید نمیدونم چرا قسمت آخرش به هم چسبیدس!!!! دوباره میذارمش

include 'connect.php';
/////////////vars
$pagenumrow=1;
$limit=$_GET['limit'];
////////////paginations
$query='select count(*) from `tuser`';
$query=mysql_query($query);
$query=mysql_fetch_assoc($query);
$res=$query['count(*)'];
$res=ceil($res/$pagenumrow);
if($limit!=0)echo '<a class="btn" href=testtest.php?limit=0><<</a>';
if($limit!=$res/2&&$limit+1<$res/2)echo '<a class="btn" href=testtest.php?limit='.($res/2).'>'.($res/2).'</a>';
$count=0;
for($i=$limit;$i<$res&&$count<17;$i++ ,$count++)
{
$style='';
if($limit==$i)
$style='style="color:#aaaaaa;text-decoration:underline;"';
echo '<a class="btn" '.$style.' href=testtest.php?limit='.$i.'> '.$i.' </a>';
}
if($limit!=$res-1&&$res-1>=0)echo '<a class="btn" href=testtest.php?limit='.($res-1).'>>></a>';
echo '<br><br>';

////////////show table countent
$query='select * from `tuser` order by `id` desc limit '.($limit*$pagenumrow).' , '.$pagenumrow.';';
$result=mysql_query($query);
while($row=mysql_fetch_array($result))
{
echo $row['muser'].'<br/>';
}

و انسان اینتر را اختراع کرد... لطفا کد هارو زیبا بزارید .. ممنونم..
الان اینو تو تگ php بزارید بهتره...

7asemoon
سه شنبه 02 تیر 1394, 22:48 عصر
ببخشید یه سول داشتم و اون این که من صفحه ای که مطالبم رو نشون میده به این صورته
http://localhost/blog/category.php?id=2
که اون عدد 2 برای اینه که عدد زمانی ست میشه که کاربر روی موضوع خاصی کلیک میکنه
مثلا وقتی روی ایران کلیک میکنه اخبار مربوط به ایران رو میاره که در جدول آیدی 2 داره
و وقتی آمریکا رو انتخاب میکنه عدد 3 میاد
حالا من باید چطور کد رو تغییر بدم قسمت limit رو متوجه نشدم

7asemoon
سه شنبه 02 تیر 1394, 22:59 عصر
منظورم از اینکه متوجه نشدم اینه که من نمیدونم چطور باید اطلاعات رو ارجاع بدم به صفحات بعد.یعنی اگر بخام برای کد خودم ویرایش کنم به این صورت میشه :
href=category.php?id='.$res_r.'

H:Shojaei
سه شنبه 02 تیر 1394, 23:50 عصر
توی ارجاع هایی که با لینک انجام میشه و مقادیر ارسال میشه شما این id خودتون رو هم اضافه کنید و ارسالش کنید... مثلا به این صورت:

echo '<a class="btn" '.$style.' href=category.php?id='.$id.'&limit='.$i.'> '.$i.' </a>';
limit هم به این منظوره که بگید صفحه چند رو میخواید دریافت کنید که مقدارش هم همون شماره لینکی هست که روش کلیک میکنید...
و این هم که چطور میفهمه از رکورد چند تا چند باید بیاره... به این صورته که مثلا اگر برابر 10 باشه یعنی روی لینک شماره 10 کلیک بشه و هر صفحه شما هم 20 مطلب نشون بده از مطلب شماره 10*20 یعنی 200 باید شروع کنه و تعداد 20 تای دیگه رو نشون بده...

7asemoon
چهارشنبه 03 تیر 1394, 00:35 صبح
توی ارجاع هایی که با لینک انجام میشه و مقادیر ارسال میشه شما این id خودتون رو هم اضافه کنید و ارسالش کنید... مثلا به این صورت:

echo '<a class="btn" '.$style.' href=category.php?id='.$id.'&limit='.$i.'> '.$i.' </a>';
limit هم به این منظوره که بگید صفحه چند رو میخواید دریافت کنید که مقدارش هم همون شماره لینکی هست که روش کلیک میکنید...
و این هم که چطور میفهمه از رکورد چند تا چند باید بیاره... به این صورته که مثلا اگر برابر 10 باشه یعنی روی لینک شماره 10 کلیک بشه و هر صفحه شما هم 20 مطلب نشون بده از مطلب شماره 10*20 یعنی 200 باید شروع کنه و تعداد 20 تای دیگه رو نشون بده...

من کد رو نسبت به پروژه خودم تا اینجا به این صورت اصلاح کردم


$id = CheckNum($_GET["id"]);
$limit=$_GET['limit'];
$sql2="select * from `$tbl_posts` WHERE `cat_id`=$id";
$res = $connect -> query($sql2);
$pag = $res->rowCount();
$pagenumrow=2;
$res_r = ceil($pag/$pagenumrow);
if($limit!=0)echo '<a class="btn" href=category.php?id='.$id.'&limit=0><<</a>';

ولی خطای زیر رو میده:

Notice: Undefined index: limit

H:Shojaei
چهارشنبه 03 تیر 1394, 01:49 صبح
ببخشید اینو میگم ولی به نظر من یکم مطالعه کنید بعد شروع به استارت پروژه بزنید اینطوری خودتون از کدنویسی اگر بخواید ادامه بدین دلسرد میشید...
و اون خطا واسه اینه که شما بار اول هیچ limiti ارسال نکردید تو خط 2 از همین کدهایی که گذاشتید قبل به این صورت تغییرش بدین:

$limit=(isset($_GET['limit'])&&$_GET['limit']>0)?$_GET['limit']:1;

7asemoon
چهارشنبه 03 تیر 1394, 08:37 صبح
ببخشید اینو میگم ولی به نظر من یکم مطالعه کنید بعد شروع به استارت پروژه بزنید اینطوری خودتون از کدنویسی اگر بخواید ادامه بدین دلسرد میشید...
و اون خطا واسه اینه که شما بار اول هیچ limiti ارسال نکردید تو خط 2 از همین کدهایی که گذاشتید قبل به این صورت تغییرش بدین:

$limit=(isset($_GET['limit'])&&$_GET['limit']>0)?$_GET['limit']:1;

حرف شما کاملا درسته
ببخشید اگه اذیت تون کردم

7asemoon
چهارشنبه 03 تیر 1394, 08:39 صبح
این سوال به عنوان آخرین سوال:
من تو نمایش اطلاعات مشکل دارم. کل خط کدهام رو قرار میدم اگه امکانش بود بهم بگین چه تغییری باید بدم
کدهام برای نمایش معمولی مشکلی ندارن و اطلاعات رو به خوبی نشون میدن ولی هیچ عکس العملی نسبت به pagination ندارن



<?php
if(isset($_GET["id"]))
{
$id = CheckNum($_GET["id"]);
$limit=(isset($_GET['limit'])&&$_GET['limit']>0)?$_GET['limit']:1;
$sql2="select * from `$tbl_posts` WHERE `cat_id`=$id ";
$res = $connect -> query($sql2);
$pag = $res->rowCount();
$pagenumrow=2;
$res_r = ceil($pag/$pagenumrow);
if($limit!=0)echo '<a class="btn" href=category.php?id='.$id.'&limit=0><<</a>';
if($limit!=$res_r/2&&$limit+1<$res_r/2)echo '<a class="btn" href=category.php?id='.$id.'&limit'.($res_r/2).'>'.($res_r/2).'</a>';
$count=0;
for($i=$limit;$i<$res_r&&$count<17;$i++ ,$count++)
{
$style='';
if($limit==$i)
$style='style="color:#aaaaaa;text-decoration:underline;"';
echo '<a class="btn" '.$style.' href=category.php?id='.$id.'&limit='.$i.'> '.$i.' </a>';
}
if($limit!=$res_r-1&&$res_r-1>=0)echo '<a class="btn" href=category.php?id='.$id.'&limit='.($res_r-1).'>>></a>';
echo '';
$sql = "SELECT * FROM `$tbl_posts` WHERE `cat_id`=? ORDER BY `id` DESC";
$result = $connect->prepare($sql);
$result->bindValue(1,$id);
$result->execute();
}
while($rows = $result->fetch(PDO::FETCH_ASSOC)){
?>
<div class="post-news">
<div class="image_review_wrapper">
<a href="more.php?id=<?=$rows["id"];?>">
<img style="opacity: 1;" src="<?=$rows["pic_url"];?>">
</a>
</div>
<div class="post_title">
<h3><a class="title" href="more.php?id=<?=$rows["id"];?>"><?=$rows["post_title"];?></a></h3>
<p class="post-meta">
<span class="date updated" dir="ltr"><?=$rows["date_show"];?> <i class="icon-calendar"></i></span>
</p>
<?php echo substr($rows["post_content"],0,200);?>
<div class="more-link">
<a href="more.php?id=<?=$rows["id"];?>" class="read-more">ادامه مطلب</a>
</div>
</div>
<div class="clear"></div>
</div>

<div class="brack_space"></div>
<?php
}
?>

7asemoon
چهارشنبه 03 تیر 1394, 10:14 صبح
خوشبختانه از راه دیگه ای رفتم جواب گرفتم دیگه نیازی نیست زحمت بکشید
خیلی ممنون

H:Shojaei
چهارشنبه 03 تیر 1394, 10:21 صبح
حرف شما کاملا درسته
ببخشید اگه اذیت تون کردم
نه مسئله اذیت شدن من نیست من بالاخره اینجا میام که اگر کمکی از دستم بر بیاد کاری انجام بدم...
واسه خودتون گفتم اگر نه من کی باشم که به شما یا دیگران بگم چکار بکنن یا نکنن...!
خوبه که حل شد موفق باشید...

zdavood
یک شنبه 07 تیر 1394, 01:12 صبح
با عرض سلام و خسته نباشید
دوست عزیز اقای H:Shojaei (http://barnamenevis.org/member.php?241637-H-Shojaei)
من کد های شما داخل صفحه PHPنوشتم و اسم بانک هارو به اسم بانک خودم تغیر دادم
اما فقط تعداد فیلد های توی بانک رو به صورت لینک نشون میده و هیچ اثری از محتویات بانک نیست
امید وارم منظورمو متوجه شده باشید و کمکم کنید .

H:Shojaei
یک شنبه 07 تیر 1394, 02:04 صبح
کدتون رو بذارید...

zdavood
یک شنبه 07 تیر 1394, 02:31 صبح
<?php
include 'connect.php';
$pagenumrow=3;
$limit=$_GET['limit'];
$query='select count(*) from `tbl_user`';
$query=mysql_query($query);
$query=mysql_fetch_assoc($query);
$res=$query['count(*)'];
$res=ceil($res/$pagenumrow);
if($limit!=0)echo '<a class="btn" href=testtest.php?limit=0><<</a>';
if($limit!=$res/2&&$limit+1<$res/2)echo '<a class="btn" href=testtest.php?limit='.($res/2).'>'.($res/2).'</a>';
$count=0;
for($i=$limit;$i<$res&&$count<17;$i++ ,$count++)
{
$style='';
if($limit==$i)
$style='style="color:#aaaaaa;text-decoration:underline;"';
echo '<a class="btn" '.$style.' href=testtest.php?limit='.$i.'> '.$i.' </a>';
}
if($limit!=$res-1&&$res-1>=0)echo '<a class="btn" href=testtest.php?limit='.($res-1).'>>></a>';
echo '';

////////////show table countent
$query='select * from `tbl_user` order by `id` desc limit '.($limit*$pagenumrow).' , '.$pagenumrow.';';
$result=mysql_query($query);
while($row=mysql_fetch_array($result))
{
echo $row['muser'].'';
}
?>

H:Shojaei
یک شنبه 07 تیر 1394, 04:07 صبح
کد که درسته تنها احتمالی که دادم این که شاید نام فیلد muser رو یادتون رفته باشه تغییر بدید این فیلد رو دارید توی جدول؟

alfabeta
یک شنبه 07 تیر 1394, 11:11 صبح
include_once('config.php');

alfabeta
یک شنبه 07 تیر 1394, 11:11 صبح
<?php
include_once('config.php');
?>

zdavood
یک شنبه 07 تیر 1394, 12:35 عصر
<?php
include_once('config.php');
?>


خب درسته دیگه .
برنامه اصلی config.php توی برنامه خودم با connect.phpوصل شدم و توی خط اول هم فراخونیش کردم .
منظورتونو متوجه نشدم :افسرده:

zdavood
یک شنبه 07 تیر 1394, 12:56 عصر
بله:تشویق:
دوتا اشتباه ضایع کردم .
1 اسم فیلد muser رو تغییر نداده بودم
2 و اسم testtest.phpرو تغییر نداده بودم
دوستانی که بعدا این برنامه رو میخواهید پیاده کنید این اشتباه ها رو نکنید
فقط ی مشکل دیگه وقتی روی اخرین صفحه ی که توی خروجی نشون داده (مثلا صفحه شماره 10) رو کلیک میکنم فیلد 1 توی بانک رونشون میده
ی جورای بالعکس شده
نیمدونم گرفتی چی گفتم ؟؟میتونی کمک کنی ؟؟
Hooom