یکی از مواردی که دیر یا زود مورد نیاز برنامه نویسان وب خواهد بود، صفحه بندی مطالب و محتوای سایت یا برنامه کاربردی است که در اصطلاح به آن pagination هم می گویند (به معنی تقسیم نمایش محتوای مورد نظر در چند صفحه به جای نمایش آنها در یک صفحه)، ناگفته پیدا است که فواید و لزوم این کار در دسته بندی بهتر و ایجاد محیط کاربری (UI یا User Interface) حرفه ای تر است، البته به جهت پیچیده گی ظاهری این امکان، ممکن است در نگاه نخست طراحی صحیح آن کمی مبهم به نظر برسد، اما با کمی راهنمایی و تمرکز می توان راه حل مشکل را پیدا کرد، به هر صورت در این آموزش قصد داریم تا با هم این مشکل را یک بار برای همیشه حل کنیم!، لذا اگر شما هم علاقمند هستید تا برنامه هایتان را به این روش طراحی کنید، با ادامه مطلب همراه ما باشید.
<?php
//نام میزبان
$db_host = "localhost";
//MySQL نام کاربری
$db_user = "root";
//MySQL کلمه عبور
$db_password = "";
//نام پایگاه داده
$db_name = "db_test";
//نام جدول
$tb_name = "tb_test";
//اتصال به سرور و پایگاه داده
$connect = mysql_connect("$db_host", "$db_user", "$db_password")
or die(mysql_error());
//انتخاب دیتابیس
mysql_select_db("$db_name")
or die(mysql_error());
//تنظیم کاراکترها سازگار با فارسی
$set = mysql_query("SET NAMES 'utf8'")
or die(mysql_error());
//اجرای پرس و جو و ساخت جدول و ستون ها
$create = mysql_query("CREATE TABLE ".$tb_name."(id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(id), title VARCHAR(255), article MEDIUMTEXT) ENGINE=MyISAM")
or die(mysql_error());
//تنظیم یونیکد utf8
$alter = mysql_query("ALTER TABLE ".$tb_name." DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;")
or die(mysql_error());
//وارد کردن نمونه اطلاعات
for($i = 1; $i <= 5; $i++){
$insert = mysql_query("INSERT INTO ".$tb_name."(title, article) VALUES ('تیتر $i', 'مقاله $i')")
or die(mysql_error());
}
//عملیات با موفقیت انجام شد
echo "Successfully Down!";
//پایان اتصال
$close = mysql_close($connect);
?>
<?phpهمان طور که گفتیم، مقادیر این متغیر مشخص کننده این است که در هر صفحه چه تعداد آیتم نمایش داده می شود.
//تعداد آیتم در هر صفحه
$setting = array(
'paged_item' => 2
);
?>
http://www.yoursite.com/paged_index.php?page=3مقادیر صفحه فعلی در پارامتر page وجود دارد (عدد 3) که به صورت زیر قابل دریافت در برنامه است.
$page = mysql_real_escape_string($_GET['page']);نکته: در حالت عادی نیازی به استفاده از تابع mysql_real_escape_string نیست، اما به این جهت که ما از متغیر page در پرس و جوهای دیتابیس استفاده خواهیم کرد، به دلیل ایمن سازی پرس و جو در مقابل حملات MySQL Injection از این تابع استفاده می کنیم.
$query = mysql_query("SELECT id, title, article FROM ".$tb_name." ORDER BY id ASC LIMIT 4, 2")ملاحظه می کنید که عدد 4 به عنوان شماره id برای شروع محدوده انتخاب ردیف ها در نظر گرفته شده است (نتایج از 5 شروع شده و شامل خود 4 نمی شود)، اما از آنجایی که ما به دنبال نوشتن یک برنامه داینامیک هستیم که با رفتار کاربر خود را وقف دهد، لذا این عدد نیز باید به صورت داینامیک ایجاد شود، بدین منظور از کد زیر استفاده می کنیم.
or die(mysql_error());
//محاسبه شروع انتخاب نتایجتوضیح:
if(empty($page)){
//پیش فرض
$page = 1;
}
$start = ($page - 1) * $setting['paged_item'];
$start = (3 - 1) * 2;که نتیجه برابر 4 خواهد بود و لذا انتخاب ردیف ها از شماره 4 (شامل id شماره 4 نمی شود) به تعداد 2 مورد انجام می شود ( LIMIT 4, 2).
//اجرای پرس و جوی داینامیک و دریافت مقادیرتوضیح:
$query = mysql_query("SELECT id, title, article FROM ".$tb_name." ORDER BY id ASC LIMIT $start, ".$setting['paged_item']."")
or die(mysql_error());
//پرس و جو تعداد کل ردیف هانکته: برای به دست آوردن تعداد کل ردیف ها می توان از روش های مختلفی (مانند استفاده از تابع COUNT که جزء توابع تجمعی یا aggregation در MySQL است) نیز استفاده کرد.
$total = mysql_query("SELECT id FROM ".$tb_name."")
or die(mysql_error());
//مجموع
$count = mysql_num_rows($total);
//بررسی نیاز به صفحه بندیبا فرض وجود صفحات، تعداد آنها را به صورت زیر محاسبه می کنیم.
if($count - $setting['paged_item'] > 0){
}
else{
echo 'صفحه ای وجود ندارد!';
}
//بررسی نیاز به صفحه بندینکته: تعداد صفحات را با تقسیم تعداد ردیف های موجود در دیتابیس (در اینجا 5) بر تعداد آیتم در هر صفحه (در اینجا 2) و با گرد کردن توسط تابع ceil به دست می آوریم (نتیجه برابر 3 می شود).
if($count - $setting['paged_item'] > 0){
//تعداد صفحه
$paged_total = ceil($count / $setting['paged_item']);
}
//بررسی نیاز به صفحه بندیدر اینجا شروع صفحه بندی به برنامه ما کمک می کند تا صفحات بعدی و قبلی را از صفحه انتخابی کاربر محاسبه کند.
if($count - $setting['paged_item'] > 0){
//تعداد صفحه
$paged_total = ceil($count / $setting['paged_item']);
//صفحه آخر
$paged_last = $paged_total;
//صفحات میانی
$paged_middle = $page + 4;
//شروع صفحه بندی
$paged_start = $paged_middle - 4;
}
//بررسی نیاز به صفحه بندیدر کدهای بالا به صورت داینامیک لینک صفحاتی که باید به کاربر نشان داده شود را ایجاد و به متغیر فرضی paged_result آن را اختصاص داده ایم، مسلما برای اینکه لینک ها به درستی ایجاد شوند، نیاز به پاره ای محاسبات و استفاده از حلقه های for است که به جهت مقدماتی بودن مبحث، از تکرار آن صرف نظر می کنیم.
if($count - $setting['paged_item'] > 0){
//تعداد صفحات
$paged_total = ceil($count / $setting['paged_item']);
//صفحه آخر
$paged_last = $paged_total;
//صفحات میانی
$paged_middle = $page + 4;
//شروع صفحه بندی
$paged_start = $paged_middle - 4;
//ایجاد لینک صفحه نخست
if($page > 1){
//اگر صفحه درخواستی بزرگتر از 1 بود
$paged_result = '<div class="paged-link"><a href="paged_index.php?page=1" title="صفحه نخست">نخست</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه نخست اگر صفحه درخواستی برابر 1 بود
else{
$paged_result = '<div class="paged-link-off">نخست</div>'."\n";
}
//ایجاد لینک صفحه قبلی
if($page > 1){
//محاسبه لینک صفحه قبلی
$paged_perv = $page - 1;
//ایجاد لینک صفحه قبلی
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$paged_perv.'" title="صفحه قبلی">قبلی</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه قبلی اگر صفحه انتخابی برابر 1 بود
else{
$paged_result .= '<div class="paged-link-off">قبلی</div>'."\n";
}
//ایجاد لینک صفحات میانی، شروع از دو شماره قبل
for ($i=$paged_start-2; $i<=$paged_middle; $i++){
//ایجاد لینک در صورتی که صفر، منفی یا از آخرین صفحه بیشتر نباشد
if ($i > 0 && $i <= $paged_last){
//در حالت انتخاب شده
if($i == $page){
$paged_result .= '<div class="paged-link-selected"><a href="paged_index.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
//در حالت عادی
else{
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
}
}
//نمایش لینک صفحات بعدی
if($page <= $paged_last - 1){
//محاسبه لینک صفحه بعدی
$paged_next = $page + 1;
//ایجاد لینک صفحه بعدی
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$paged_next.'" title="صفحه بعدی">بعدی</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه بعدی اگر صفحه انتخابی برابر صفحه آخر بود
else{
$paged_result .= '<div class="paged-link-off">بعدی</div>'."\n";
}
//لینک صفحه آخر
if($page <= $paged_last - 1){
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$paged_last.'" title="صفحه آخر">آخر</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه آخر اگر صفحه انتخابی برابر صفحه آخر بود
else{
$paged_result .= '<div class="paged-link-off">آخر</div>'."\n";
}
//اطلاعات صفحات
$paged_result .= '<div class="paged-link-info">» صفحه: '.$page.' از '.$paged_total.'</div>'."\n";
//خروجی
echo $paged_result;
}
else{
echo 'صفحه ای وجود ندارد!'."\n";
}
<style type="text/css">
.paged-link{
display:inline-block;
line-height:14px;
float:right;
margin:2px;
}
.paged-link a{
display:inline-block;
border:#06C 1px solid;
padding:2px;
text-decoration:none;
}
.paged-link a:hover{
border:#900 1px solid;
}
.paged-link-selected{
display:inline-block;
line-height:14px;
float:right;
margin:2px;
}
.paged-link-selected a{
display:inline-block;
border:#900 1px solid;
padding:2px;
text-decoration:none;
}
.paged-link-selected a:hover{
border:#900 1px solid;
}
.paged-link-off{
display:inline-block;
border:#06C 1px solid;
padding:2px;
color:#CCC;
line-height:14px;
float:right;
margin:2px;
}
.paged-link-info{
display:inline-block;
float:left;
padding:2px;
color:#666;
line-height:14px;
margin:2px;
font-size:11px;
}
</style>
<!DOCTYPE HTML>دانلود نمونه فایل های صفحه بندی
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>وبگو | صفحه به صفحه کردن محتوا در PHP</title>
<!-- http://webgoo.ir -->
<link rel="stylesheet" href="paged_style.css">
</head>
<body>
<?php
//تعداد آیتم در هر صفحه
include_once('paged_setting.php');
//نام میزبان
$db_host = "localhost";
//MySQL نام کاربری
$db_user = "root";
//MySQL کلمه عبور
$db_password = "";
//نام پایگاه داده
$db_name = "db_test";
//نام جدول
$tb_name = "tb_test";
//اتصال به سرور و پایگاه داده
$connect = mysql_connect("$db_host", "$db_user", "$db_password")
or die(mysql_error());
//انتخاب دیتابیس
mysql_select_db("$db_name")
or die(mysql_error());
//تنظیم کاراکترها سازگار با فارسی
$set = mysql_query("SET NAMES 'utf8'")
or die(mysql_error());
//دریافت صفحه درخواستی
@$page = mysql_real_escape_string($_GET['page']);
//محاسبه شروع انتخاب نتایج
if(empty($page)){
//پیش فرض
$page = 1;
}
$start = ($page - 1) * $setting['paged_item'];
//اجرای پرس و جوی داینامیک و دریافت مقادیر
$query = mysql_query("SELECT id, title, article FROM ".$tb_name." ORDER BY id ASC LIMIT $start, ".$setting['paged_item']."")
or die(mysql_error());
//چاپ خروجی
while($row = mysql_fetch_array($query)){
$id = $row['id'];
$title = $row['title'];
$article = $row['article'];
echo 'مطلب شماره: '.$id.' '.$title.' '.$article.'<br />'."\n";
}
//پرس و جوی تعداد کل ردیف ها
$total = mysql_query("SELECT id FROM ".$tb_name."")
or die(mysql_error());
//مجموع
$count = mysql_num_rows($total);
//بررسی نیاز به صفحه بندی
if($count - $setting['paged_item'] > 0){
//تعداد صفحات
$paged_total = ceil($count / $setting['paged_item']);
//صفحه آخر
$paged_last = $paged_total;
//صفحات میانی
$paged_middle = $page + 4;
//شروع صفحه بندی
$paged_start = $paged_middle - 4;
//ایجاد لینک صفحه نخست
if($page > 1){
//اگر صفحه درخواستی بزرگتر از 1 بود
$paged_result = '<div class="paged-link"><a href="paged_index.php?page=1" title="صفحه نخست">نخست</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه نخست اگر صفحه درخواستی برابر 1 بود
else{
$paged_result = '<div class="paged-link-off">نخست</div>'."\n";
}
//ایجاد لینک صفحه قبلی
if($page > 1){
//محاسبه لینک صفحه قبلی
$paged_perv = $page - 1;
//ایجاد لینک صفحه قبلی
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$paged_perv.'" title="صفحه قبلی">قبلی</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه قبلی اگر صفحه انتخابی برابر 1 بود
else{
$paged_result .= '<div class="paged-link-off">قبلی</div>'."\n";
}
//ایجاد لینک صفحات میانی، شروع از دو شماره قبل
for ($i=$paged_start-2; $i<=$paged_middle; $i++){
//ایجاد لینک در صورتی که صفر، منفی یا از آخرین صفحه بیشتر نباشد
if ($i > 0 && $i <= $paged_last){
//در حالت انتخاب شده
if($i == $page){
$paged_result .= '<div class="paged-link-selected"><a href="paged_index.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
//در حالت عادی
else{
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$i.'" title="صفحه '.$i.'">'.$i.'</a></div>'."\n";
}
}
}
//نمایش لینک صفحات بعدی
if($page <= $paged_last - 1){
//محاسبه لینک صفحه بعدی
$paged_next = $page + 1;
//ایجاد لینک صفحه بعدی
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$paged_next.'" title="صفحه بعدی">بعدی</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه بعدی اگر صفحه انتخابی برابر صفحه آخر بود
else{
$paged_result .= '<div class="paged-link-off">بعدی</div>'."\n";
}
//لینک صفحه آخر
if($page <= $paged_last - 1){
$paged_result .= '<div class="paged-link"><a href="paged_index.php?page='.$paged_last.'" title="صفحه آخر">آخر</a></div>'."\n";
}
//غیر فعال کردن لینک صفحه آخر اگر صفحه انتخابی برابر صفحه آخر بود
else{
$paged_result .= '<div class="paged-link-off">آخر</div>'."\n";
}
//اطلاعات صفحات
$paged_result .= '<div class="paged-link-info">» صفحه: '.$page.' از '.$paged_total.'</div>'."\n";
//خروجی
echo $paged_result;
}
else{
echo 'صفحه ای وجود ندارد!'."\n";
}
//پایان اتصال
$close = mysql_close($connect);
?>
</body>
</html>