article

صفحه بندی مطالب و محتوا با PHP و MySQL

mysql-php-pagination

یکی از مواردی که دیر یا زود مورد نیاز برنامه نویسان وب خواهد بود، صفحه بندی مطالب و محتوای سایت یا برنامه کاربردی است که در اصطلاح به آن pagination هم می گویند (به معنی تقسیم نمایش محتوای مورد نظر در چند صفحه به جای نمایش آنها در یک صفحه)، ناگفته پیدا است که فواید و لزوم این کار در دسته بندی بهتر و ایجاد محیط کاربری (UI یا User Interface) حرفه ای تر است، البته به جهت پیچیده گی ظاهری این امکان، ممکن است در نگاه نخست طراحی صحیح آن کمی مبهم به نظر برسد، اما با کمی راهنمایی و تمرکز می توان راه حل مشکل را پیدا کرد، به هر صورت در این آموزش قصد داریم تا با هم این مشکل را یک بار برای همیشه حل کنیم!، لذا اگر شما هم علاقمند هستید تا برنامه هایتان را به این روش طراحی کنید، با ادامه مطلب همراه ما باشید.

دیتابیس، جداول و ستون ها


برای صفحه به صفحه کردن مطالب و محتوا، قبل از هر چیز به دیتابیس، جداول و ستون هایی احتیاج داریم که درون خود ردیف هایی از اطلاعات را ثبت کرده باشند، به طور مثال در نمونه کد زیر پرس و جوی فرضی ایجاد یک جدول در پایگاه داده db_test را تنظیم کرده ایم که با اجرای آن در یک فایل PHP، ستون و ردیف های نمونه به دیتابیس افزوده خواهند شد (ساخت دیتابیس، جدول و ستون ها صرفا جهت نمونه است، لذا اگر از قبل مشابه این موارد در دیتابیس برنامه شما وجود دارد، نیازی به ایجاد دوباره آنها نیست).
<?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);
?>
نکته 1: به یاد داشته باشیم که قبل از اجرای پرس و جو، باید از طریق برنامه phpMyAdmin دیتابیس db_test را با یونیکد utf8_general_ci ساخته باشیم.
نکته 2: به جهت اینکه آموزش حاضر برای عموم قابل استفاده باشد، از اکستنشن (Extension) اولیه PHP یعنی mysql استفاده شده است، با شبیه سازی پرس و جوها می توانید از PDO یا mysqli نیز استفاده کنید.

تنظیمات اولیه صفحه بندی


پس از ایجاد جدول، ستون و ردیف های اطلاعات، برنامه ما برای صفحه بندی صحیح به سه پارامتر اولیه احتیاج دارد (تعداد آیتم ها در هر صفحه، شماره صفحه درخواستی و شماره id برای تعیین نقطه شروع انتخاب نتایج)، این پارامترها از طریق تعریف متغیر setting (نامی انتخابی و فرضی است)، در یافت شماره صفحه از متد GET و تعیین id شروع (در ادامه خواهیم گفت) مشخص می شوند، متغیری که در قسمت تنظیمات برنامه (متغیر setting) به آن نیاز داریم، نمایانگر تعداد آیتم ها در هر صفحه است (به فرض 2 آیتم در هر صفحه)، لذا در یک فایل php به صورت زیر آن را تعریف می کنیم.
<?php
//تعداد آیتم در هر صفحه
$setting = array(
'paged_item' => 2
);
?>
همان طور که گفتیم، مقادیر این متغیر مشخص کننده این است که در هر صفحه چه تعداد آیتم نمایش داده می شود.
نکته: در اینجا ما از روش آرایه استفاده کرده ایم که به لحاظ کاربردی و اصول برنامه نویسی بهتر است، لذا استفاده از روش های دیگر مانند تعریف مستقیم متغیر و... نیز امکان پذیر است و محدودیتی از این لحاظ وجود ندارد، مهم این است که ما یک متغیر با مقادیری مشخص در اختیار برنامه قرار دهیم تا از آن استفاده کند.
پس از اینکه تعداد آیتم ها در هر صفحه را تعیین کردیم، قاعدتا مورد دیگری به ذهن می رسد که همان شماره صفحه درخواستی است، یعنی برنامه ما باید بداند که کاربر قصد فراخوانی چه صفحه ای را دارد تا متناسب با آن نتایج را از پایگاه داده دریافت و نمایش دهد، این پارامتر از طریق آدرس URL صفحه و به صورت متد GET قابل دریافت است، به فرض اگر آدرس لینک صفحه به صورت زیر باشد.
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 از این تابع استفاده می کنیم.
در آخرین مرحله از تنظیمات اولیه صفحه بندی، نوبت به مشخص کردن شماره id برای شروع یک پرس و جو است، توضیح اینکه در برنامه صفحه بندی از پرس و جویی در دیتابیس خود استفاده خواهیم کرد که با استفاده از LIMIT یک محدوده خاص از ردیف ها را به عنوان نتیجه انتخاب می کند، به فرض نتایج از ردیف شماره 4 به تعداد 2 (تعداد را قبلا در متغیر فرضی setting به صورت آرایه مشخص کردیم)، در این حالت پرس و جوی ما با LIMIT به شکل نمونه زیر خواهد بود.
$query = mysql_query("SELECT id, title, article FROM ".$tb_name." ORDER BY id ASC LIMIT 4, 2")
or die(mysql_error());
ملاحظه می کنید که عدد 4 به عنوان شماره id برای شروع محدوده انتخاب ردیف ها در نظر گرفته شده است (نتایج از 5 شروع شده و شامل خود 4 نمی شود)، اما از آنجایی که ما به دنبال نوشتن یک برنامه داینامیک هستیم که با رفتار کاربر خود را وقف دهد، لذا این عدد نیز باید به صورت داینامیک ایجاد شود، بدین منظور از کد زیر استفاده می کنیم.
//محاسبه شروع انتخاب نتایج
if(empty($page)){
    //پیش فرض
    $page = 1;
}
$start = ($page - 1) * $setting['paged_item'];
توضیح:
- به صورت ساده، کاری که کد بالا برایمان انجام می دهد این است که عدد شروع را برای هر پرس و جو با توجه به صفحه ای که کاربر انتخاب می کند و تعداد آیتم ها در هر صفحه مشخص می کند، به فرض اگر صفحه انتخابی کاربر 3 باشد و تعداد آیتم ها در هر صفحه عدد 2، شماره id شروع با کد بالا به صورت زیر خواهد بود.
$start = (3 - 1) * 2;
که نتیجه برابر 4 خواهد بود و لذا انتخاب ردیف ها از شماره 4 (شامل id شماره 4 نمی شود) به تعداد 2 مورد انجام می شود ( LIMIT 4, 2).
نکته: مشابه همین قابلیت در برنامه phpMyAdmin برای نمایش قسمت خاصی از ردیف ها وجود دارد و جهت آشنایی بیشتر می توانید آن را امتحان کنید.

نحوه پرس و جو از دیتابیس در هنگام صفحه بندی


همان طور که در قسمت تنظیمات اولیه دیدیم، برای اینکه بتوانیم سیستم صفحه بندی را به نحو صحیح ایجاد کنیم، پرس و جوی اصلی ما باید از قابلیت LIMIT با دو عدد (id شروع انتخاب ردیف ها و تعداد آیتم) استفاده کند، از آنجایی که سیستم ما به صورت داینامیک عمل خواهد کرد، لذا به جای قرار دادن مستقیم اعداد، باید از متغیرهایی که مقادیر را در خود دارند استفاده کنیم، به مثال زیر توجه کنید.
//اجرای پرس و جوی داینامیک و دریافت مقادیر
$query = mysql_query("SELECT id, title, article FROM ".$tb_name." ORDER BY id ASC LIMIT $start, ".$setting['paged_item']."")
or die(mysql_error());
توضیح:
- با توجه به این مثال، اگر کاربر از طریق متد GET صفحه ای را انتخاب نکرده باشد، به صورت پیش فرض صفحه شماره 1 انتخاب می شود (page = 1)، لذا شماره id از صفر (شامل خود صفر نمی شود) شروع و به 2 مورد ختم می شود (یعنی id شماره 1 و 2 برای صفحه اول انتخاب می شوند).
- قسمت LIMIT در این مثال (با فرض صفحه 1) به صورت LIMIT 0, 2 است، یعنی id شماره 1 و 2 انتخاب می شود، اما اگر نوع ORDER BY به صورت DESC باشد، انتخاب از آخر و بیشترین مقدار انجام می شود و id شماره 5 و 4 انتخاب می شوند.

بررسی اولیه برای ایجاد لینک های صفحه بندی


هرچند درک مواردی که تا این لحظه گفتیم به خودی خود اهمیت زیادی دارد، اما مهم تر از آنها نوشتن سیستمی برای ایجاد لینک های داینامیک است تا شماره صفحات و مواردی مانند صفحه قبل، صفحه بعد، صفحه اول و صفحه آخر را به دقت چاپ کند، البته با کسب تجربه و مهارت بیشتر در برنامه نویسی PHP و با اندکی خلاقیت می توان این کار را به شکل های مختلف و به صورت سفارشی انجام داد، اما جهت نمونه یک مورد را در ادامه بررسی می کنیم، به طور خلاصه در این قسمت نیازمند موارد زیر هستیم:
- تعداد کل ردیف های موجود در دیتابیس (به فرض 5 مورد).
- تعداد کل صفحاتی که ایجاد می شوند (به فرض 3 صفحه).
- تعداد لینک صفحه در قسمت نمایش صفحات (به فرض لینک 4 صفحه).
- مقادیر لینک صفحه اول (به فرض 1).
- مقادیر لینک صفحات میانی (به فرض 2).
- مقادیر لینک صفحه آخر (به فرض 3).
- مقادیر لینک صفحه قبل (در صورت وجود).
- مقادیر لینک صفحه بعد (در صورت وجود).
برای به دست آوردن تعداد کل ردیف های موجود در دیتابیس یک پرس و جو مشابه پرس و جوی اصلی برنامه می نویسیم، با این تفاوت که این بار از LIMIT استفاده نخواهیم کرد (تا همه موارد انتخاب شوند)، به مثال زیر توجه کنید.
//پرس و جو تعداد کل ردیف ها
$total = mysql_query("SELECT id FROM ".$tb_name."")
or die(mysql_error());
//مجموع
$count = mysql_num_rows($total);
نکته: برای به دست آوردن تعداد کل ردیف ها می توان از روش های مختلفی (مانند استفاده از تابع COUNT که جزء توابع تجمعی یا aggregation در MySQL است) نیز استفاده کرد.
پس از اینکه تعداد کل ردیف ها را به دست آوردیم، باید بررسی کنیم و ببینیم که آیا نیاز به صفحه بندی است یا خیر، به طور مثال اگر تعداد آیتم های دیتابیس، از تعداد آیتم های بخش تنظیمات کمتر باشد، نیازی به صفحه بندی نیست، چون در واقع صفحه ای وجود ندارد، اما اگر این طور نبود حداقل دو صفحه خواهیم داشت، به هر صورت این هدف با مقایسه زیر دست یافتنی است.
//بررسی نیاز به صفحه بندی
if($count - $setting['paged_item'] > 0){
}
else{
    echo 'صفحه ای وجود ندارد!';
}
با فرض وجود صفحات، تعداد آنها را به صورت زیر محاسبه می کنیم.
//بررسی نیاز به صفحه بندی
if($count - $setting['paged_item'] > 0){
    //تعداد صفحه
    $paged_total = ceil($count / $setting['paged_item']);
}
نکته: تعداد صفحات را با تقسیم تعداد ردیف های موجود در دیتابیس (در اینجا 5) بر تعداد آیتم در هر صفحه (در اینجا 2) و با گرد کردن توسط تابع ceil به دست می آوریم (نتیجه برابر 3 می شود).
پس از مشخص شدن تعداد کل صفحات، صفحه آخر ما همان تعداد کل صفحات است (به طور مثال در اینجا چون 3 صفحه داریم، آخرین صفحه می شود 3).
صفحه اول همیشه صفحه 1 است، لذا نیاز به تعریف آن نیست، اما صفحات میانی و قبل و بعد باید به صورت داینامیک ساخته شوند که در ادامه خواهیم دید.
برای ادامه کار، دو پارامتر زیر را نیز به کد خود اضافه می کنیم.
//بررسی نیاز به صفحه بندی
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;
}
در اینجا شروع صفحه بندی به برنامه ما کمک می کند تا صفحات بعدی و قبلی را از صفحه انتخابی کاربر محاسبه کند.
قسمت مربوط به صفحات میانی، تعداد صفحات بعدی (4 صفحه بعدی) را با توجه به صفحه انتخابی کاربر مشخص می کند.
نکته: درک این قسمت ممکن است در نگاه نخست کمی پیچیده به نظر برسد، اگر این طور بود، تنها کافی است از نمونه کدها پیروی کنید، نیازی نیست الزاما مفهوم آنها را نیز در نگاه نخست متوجه شوید.

ایجاد لینک های صفحه به صفحه


در قسمت پایانی کار لینک صفحات را با استفاده از بلاک های div یا span و استایل CSS در کنار هم قرار می دهیم تا کاربر بتواند با انتخاب آنها، بین صفحات مختلف یک مورد را انتخاب کند.
//بررسی نیاز به صفحه بندی
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">&raquo; صفحه: '.$page.' از '.$paged_total.'</div>'."\n";
    //خروجی
    echo $paged_result;                
}
else{
    echo 'صفحه ای وجود ندارد!'."\n";
}
در کدهای بالا به صورت داینامیک لینک صفحاتی که باید به کاربر نشان داده شود را ایجاد و به متغیر فرضی paged_result آن را اختصاص داده ایم، مسلما برای اینکه لینک ها به درستی ایجاد شوند، نیاز به پاره ای محاسبات و استفاده از حلقه های for است که به جهت مقدماتی بودن مبحث، از تکرار آن صرف نظر می کنیم.
نکته: با خروجی گرفتن از متغیر paged_result، می توانید لینک صفحات را نمایش دهید.

استایل CSS برای  بلاک های صفحه بندی


همان طور که گفتیم، لینک های صفحات در بلاک های div یا span ساخته می شوند که برای نمایش صحیح آنها نیاز به استایل CSS است، این استایل را برای بلاک های نمونه بالا به صورت زیر تنظیم کرده ایم.
<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>

نتیجه نهایی صفحه بندی و دانلود فایل ها


برای جمع بندی مباحثی که مطرح کردیم، بد نیست نمونه کدها را به صورت کلی در یک فایل قرار دهیم، ضمن اینکه برای تست و راحتی بیشتر، کدها و مثال مطرح شده در قالب یک فایل zip جهت دانلود قرار داده شده است.
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>وبگو | صفحه به صفحه کردن محتوا در PHP</title>
<!-- https://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">&raquo; صفحه: '.$page.' از '.$paged_total.'</div>'."\n";
    //خروجی
    echo $paged_result;                
}
else{
    echo 'صفحه ای وجود ندارد!'."\n";
}

//پایان اتصال
$close = mysql_close($connect);
?>
</body>
</html>
دانلود نمونه فایل های صفحه بندی
sectionدسته بندی: آموزش کاربردی » MySQL
related مطالب بیشتر:
» آموزش ساخت فرم عضویت در سایت با PHP و MySQL
» آموزش ساخت فرم تماس با PHP و MySQL
» جستجو در مطالب سایت با استفاده از MySQL Full-Text
» آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
» ایجاد لینک دانلود مدت دار با PHP و MySQL
commentنظرات (۸۵ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: saeid
زمان: ۱۴:۳۹:۱۰ - تاریخ: ۱۳۹۳/۰۳/۰۷
این رو یادم رفت بگم اگر نیاز بود و هیچ ایردای از جانب شما نداشت من یک فیلم کوچیک از این error میگریم و کد خودم رو هم توی اون فیلم و کلاً سایتم رو توی اون نشون میدم نمیدونم شاید مشکلم رو واضح تر بتونم بگم
بازم ممنون
پاسخ: 
صرف دیدن فیلم مشکل کفایت نمی کند، باید تست شود!
نویسنده: saeid
زمان: ۲۱:۴۵:۳۴ - تاریخ: ۱۳۹۳/۰۳/۰۷
با سلامی مجدد
بله همان طور که عرض کردید من برای مقادیر انگلیسی هم چک کردم به درستی و بدون هیچ گونه error کار می کرد. پس نتیجه می گیریم که با کاراکتر فارسی مشکل داره
اما نمی دونم چرا فقط توی ie این مشکل پیش میاد.
از پاسخ دقیقتان ممنون و بی نهایت سپاسگذارم
باید یه جوری این مشکل را حل کنم
بازم ممنونم
پاسخ: 
سلام
متاسفانه این مرورگر در پردازش لینک های فارسی (و در کل کاراکترهای utf-8) ساز مخالف می زند، سعی کنید برای ایجاد لینک های فارسی، از توابعی مانند rawurlencode استفاده کنید، البته کماکان حل مشکل نیاز به بررسی بیشتری دارد.
نویسنده: محمد رضا
زمان: ۱۷:۴۸:۳۰ - تاریخ: ۱۳۹۳/۰۳/۲۵
سلام. وقت بخیر
مهندس من یه سری اطلاعات داخل جدول دیتابیس دارم حالا میخوام اطلاعات یک فیلد رو داخل کمبو باکس نمایش بدم با نمایش اطلاعات رو صفحه مشکلی ندارم اما همون اطلاعات که با پی اچ پی فراخوانی میشن چطور مثلا کل رکورد اون فیلد رو تو کمبو باکس نمایش بدم؟
پاسخ: 
سلام
باید در هنگام چاپ خروجی در PHP، تگ های HTML مربوط به باکس را هم در حلقه foreach (یا هر روش دیگری) تعریف کنید، به عبارتی خروجی دستورات PHP شما باید ترکیبی از اطلاعات دیتابیس به اضافه تگ هایی باشد که برای ایجاد باکس نیاز است؛ اطلاعات دیتابیس صرفا مواد خامی هستند که می توان در PHP به هر نحو دلخواه از آنها استفاده نمود و در نهایت خروجی HTML تولید کرد، لذا با درک خروجی HTML صفحه وب مد نظرتان، می توانید همین کار را با MySQL و PHP انجام دهید (یک Select Box به صورت HTML بسازید و سعی کنید همان را این بار با PHP و MySQL خروجی بگیرید).
نویسنده: محمد رضا
زمان: ۰۰:۴۱:۳۷ - تاریخ: ۱۳۹۳/۰۳/۲۶
ممنون استاد حل شد
نویسنده: محمد رضا
زمان: ۰۱:۲۶:۰۰ - تاریخ: ۱۳۹۳/۰۳/۲۶
استاد واسه select box از دستور زیز استفاده کردم
<?php
while($row = mysql_fetch_assoc($dbresult)) {
echo '<option value="'.$row['name'].'">'.$row['name'].'</option>';
}
?>
اما نمیدونم چطور بگم هر وقت هر ایتمی انتخاب شد شماره موبایل همون ایتم رو نشون بده ممنون میشم راهنمایی کنید
پاسخ: 
برای اینگونه موارد نیاز به استفاده از رویداد در جاوا اسکریپت (برای تگ select) و به همراه آن استفاده از Ajax است، به طور مثال با رویداد onchange می توان مقدار انتخاب شده را به یک تابع جاوا اسکریپتی داد و با Ajax درخواست را به سرور (کدهای PHP) ارسال و از نتیجه بازگشتی استفاده نمود، به هر صورت این مباحث توضیحات مفصلی دارند که در جای خود آموزش داده شده اند (رجوع کنید به آموزش های Ajax).
نویسنده: محمد رضا
زمان: ۲۱:۵۶:۱۷ - تاریخ: ۱۳۹۳/۰۳/۲۶
استاد اگه امکان داره با کدی مثال بزنید راستش خیلی گیر این کد هستم زمان هم خیلی کم دارم تا بخوام تمام قسمت های ایجکس رو بخونم
پاسخ: 
این حالت از چند قسمت مختلف تشکیل می شود و نمی توان یک کد کوتاه برای آن مثال زد، در صورت آشنایی مقدماتی با جاوا اسکریپت، با یک مرور سطحی بخش Ajax می توانید مراحل را طراحی کنید.
نویسنده: محمد رضا
زمان: ۱۶:۵۱:۳۶ - تاریخ: ۱۳۹۳/۰۳/۲۷
سلام مهندس
من تونستم با ایجکس یک درخواست بفرستم سمت سرور و نتیجه ای که برگردوند درست بود حالا چطور با چه کدی میتونم جوابی که ایجکس گرفته و ریخته توی یه متغیر من اون رو انتقال بدم به یه صفحه دیگه و توی محیط php با یه متغیر دیگه چکش کنم و ازش پرینت بگیرم. ممنون میشم راهنمایی کنید/
پاسخ: 
سلام
دقیقا نمی دانیم چه هدفی دارید و چطور کدنویسی کرده اید، اما در کل اگر نیاز به ارسال درخواست مجدد به سرور بدون رفرش صفحه است، باید مجددا از Ajax استفاده کنید، اگر فرم HTML باید تنظیم و ارسال شود، باید با جاوا اسکریپت آشنا باشید و پس از تنظیم فیلدهای فرم بر اساس پاسخ برگشتی، متد submit را اجرا کنید.
متاسفانه به نظر بدون اینکه مراحل مقدماتی را خوب مطالعه کنید قصد ایجاد یک برنامه کاربردی را دارید که این کار را هم برای شما و هم برای ما سخت می کند!
نویسنده: محمد رضا
زمان: ۱۷:۳۲:۳۹ - تاریخ: ۱۳۹۳/۰۳/۲۷
مهندس جان من مراحل زیر رو انجام دادم
توی دیتابیسم یه جدول دارم که از سه فیلد تشکیل شده - نام - آدرس - شماره تماس حالا با پی اچ پی به شکل زیر اطلاعات مربوط به نام رو ریختم توی select box
  while($row = mysql_fetch_assoc($dbresult)) {
echo '<option value="'.$row['name'].'">'.$row['name'].'</option>';
}
حالا اومدم با ایجکس نام رو سمت سرور فرستادم به شکل زیر
$(function(){$("#cat").change(function(){  var cat = $(this).val();   
$.ajax({url:'cat.php',type:'post',data:{name:cat},}).done(function(resp){ var s=resp;
alert(s) ;}).fail(function(jqXHR,textStatus){alert(textStatus);});
});
});
صفحه cat.php هم به شکل زیر
$name = $_POST["name"]; $servername="localhost";$dbname="afrad";$user="root";$pass="";$link=mysql_connect($servername,$user,$pass) or die("خطا در اتصال به پايگاه داده");
mysql_select_db($dbname,$link) or die("خطا در انتخاب پايگاه داده");mysql_query("SET NAMES utf8");
$sql= "SELECT * FROM tb_name where name='$name'" ; $result3 = mysql_query($sql,$link); if( $row = mysql_fetch_assoc($result3)){
$_SESSION['neshani1']= $row['address1']; $_SESSION['neshani2']= $row['address2']; echo $row['address1'] ;
} else { echo" error";
}
توی صفحه cat دستورات درست اجرا میشه حالا میخوام از صفحه cat سشن بگیرم و ببرم توی یه صفحه دیگه اما به خاطر خط اول این صفحه ارور میده لطفا راهنمایی کنید چطور میتونم اطلاعات مربوط به نام رو از صفحه cat انتقال بدم به یه صفحه دیگه تو محیط php و یا میشه خروجی که ایجکس میده و میریزه توی یه متغیر اون انتقال داد به یه صفحه دیگه و مقدارش رو ریخت توی یه متغیر و با کد پی اچ پی پرینتش گرفت
پاسخ: 
این بستگی به نحوه تعریف ساختار دارد، هم می توان سشن تنظیم کرد و بین صفحات PHP اطلاعات را رد و بدل نمود (دقیقا متوجه نشدیم منظورتان از خطا چه خطایی است؟) هم می توان با جاوا اسکریپت یا PHP کوکی تنظیم کرد و از اطلاعات آن در صفحات مختلف استفاده نمود و هم می توان اطلاعات را به صورت پارامترهایی از طریق متد GET و در آدرس لینک صفحات گنجاند و بین صفحات منتقل کرد، راه حل دیگر که در مواردی مانند درگاه پرداخت استفاده می شود، تنظیم فرم HTML یا استفاده از توابعی مانند curl است.
نویسنده: محمد
زمان: ۰۸:۳۴:۲۰ - تاریخ: ۱۳۹۳/۰۴/۱۶
بسیار متشکرم.
نویسنده: zahra
زمان: ۱۷:۴۵:۱۲ - تاریخ: ۱۳۹۳/۰۴/۲۰
سلام. من یک صفحه دارم که قراره 10 موزیک جدید اضافه شده به دیتابیس رو نشون بده, حالا برای صفحه ی بعد چکار کنم که 10 تای قدیمی تر رو نشون بده؟؟
ممنون میشم راهنمایی کنید
پاسخ: 
سلام
با درک آموزش حاضر هر نوع محتوایی را می توان صفحه بندی نمود، مهم نیست کد یا آدرس آهنگ باشد یا متن ساده (منتهی باید با نحوه ایجاد سیستم های داینامیک تحت وب آشنا باشید).
نویسنده: مهدیه
زمان: ۱۲:۲۷:۲۵ - تاریخ: ۱۳۹۳/۰۵/۱۳
با سلام و احترام و تشکر زیاد
از شما برای تمامی زحماتتان متشکرم
یک سوال داشتم خدمتتون و این است که اگر بخواهیم برای نمایش نتایج جستجو چند فیلدی صفحه بندی داشته باشیم باید چگونه این کار را انجام دهیم. ممنون میشم اگر راهنمایی کنید.
پاسخ: 
سلام
الگوریتم ایجاد صفحه بندی و نمونه ای از این کار در آموزش حاضر ارائه شده، با درک این مطلب به راحتی می توان هر سیستم داینامیک مشابه ای را ایجاد کرد و تفاوتی نمی کند که هدف جستجو باشد یا نمایش مطالب و... در واقع شما در هنگام نمایش نتایج باید از پارامترهای موجود در لینک جستجو که به صورت متد GET دریافت می شود استفاده کنید و در لینک های صفحه بندی نیز آن پارامترها را برای انتقال بین صفحات چاپ کنید، سایر موارد به میزان آشنایی شما با مدیریت پرس و جوهای MySQL و به طور کلی کار با PHP برمی گردد که در اینجا نمی توان کمک بیشتری کرد.
نویسنده: مهدیه
زمان: ۱۲:۱۰:۰۲ - تاریخ: ۱۳۹۳/۰۵/۱۶
با سلام و احترام خدمت استاد
اگر بخواهم که تعداد حدود 30 تا از جدیدترین اطلاعات ثبتی را از پایگاه داده فرابخوانم و این تعداد را صفحه بندی کنم که در هر صفحه 5 عدد را نمایش بدهد چگونه باید اینکار را کرد
پاسخ: 
سلام
ابتدا باید تعداد کل نتایج را به صورت دستی 30 عدد در نظر بگیرید، سپس تعداد آیتم در هر صفحه را نیز 5 مورد قرار دهید، در کل با درک آموزش حاضر به راحتی می توانید با تغییر چند قسمت به هدفتان برسید.
نویسنده: امین
زمان: ۰۴:۴۴:۱۳ - تاریخ: ۱۳۹۳/۰۶/۰۴
سلام و خسته نباشید
ببخشید فهمیدن این مطلب برای من کمی سخت است من از کد زیر برای فراخوانی استفاده میکنم امکانش هست شما صفحه بندیش کنید
حذف شد!
پاسخ: 
سلام
متاسفانه خیر! صفحه بندی نیاز به بررسی ساختار کل برنامه دارد و یک کار زمانبر است.
زمان: ۲۳:۳۲:۲۷ - تاریخ: ۱۳۹۳/۰۶/۱۸
استاد من یه کدی دارم مانند شکل ذیل چطور میتونم این کدی که اصلا ارتباطی با دیتابیس نداره رو صفحه بندی کنم
حذف شد
با تشکر
پاسخ: 
توضیح کار چندان ساده و کوتاه نیست! در حد راهنمایی و تا آنجا که از کدهایتان برداشت کردیم، باید ابتدا نحوه صفحه بندی معمول را خوب درک کرده و سعی کنید همین حالت را بدون دیتابیس ایجاد کنید، به طور مثال به جای محاسبه تمام ردیف ها از دیتابیس، در اینجا تعداد کل اعضای آرایه محاسبه می شود، یا به جای انتخاب ردیف 1 تا 10 در اینحا در صفحه اول کلید 0 تا 9 از آرایه انتخاب می شود و ...
قاعدتا برای تعریف این شرایط باید برنامه نویسی بلد باشید و بتوانید با توجه به پارمترها، خروجی متفاوت ایجاد کنید.
نویسنده: ali
زمان: ۰۱:۴۸:۳۵ - تاریخ: ۱۳۹۳/۰۶/۳۰
خیلی عالی بود.
تشکر
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- مواردی که به کلی خارج از موضوع این مطلب هستند را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم، غیرضروری و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ خاصی داده نخواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- تمام یادداشت ها بررسی و برای هر کاربر زمان مشخصی جهت پاسخگویی در نظر گرفته می شود، لذا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.




1 × 3
 refresh
نکته:
با توجه به تاریخ نگارش آموزش های سایت و پیشرفت تکنولوژی های مرتبط با وب در سالیان اخیر، محتوای برخی از مطالب قدیمی ممکن است نیاز به ویرایش و به روزرسانی داشته باشد که این کار هم زمان با تهیه نسخه جدید «وبگو» به مرور در حال انجام است، لطفا در استفاده از مطالب سایت به این نکته دقت داشته و حتی المقدور از چند منبع مختلف استفاده نمائید.
آخرین دیدگاه ها
form adel
در:
سلام با تشکر از سایت خوب شما. یه سوال داشتم چگونه تمام این کدها را در جاوا اسکریپت همزمان قرار دهیم. من مثلا دستور این...
۲۱:۲۵:۴۰ ۱۳۹۸/۰۸/۲۴

form یه سوال کننده
در:
سلام. ببخشید چطور میشه ایمیل هایی رو میفرستن که ریپلای زدن رو ایمیلی که از طرف ما نبوده بیشتر تو تبلیغات دیدم امیدوارم منظورم و...
۰۳:۲۳:۰۸ ۱۳۹۸/۰۸/۲۴

form پرتو
در:
با عرض سلام و خسته نباشید امیدوارم حالتون خوب باشه من دو سه سال پیش وبلاگم رو حذف کردم ایا امکانش هست برگرده؟ ادرس...
۱۴:۵۵:۵۲ ۱۳۹۸/۰۸/۲۰

form علی
در:
سلام من نمی تونم html tag رو چطور در وبلاگم قرار بدم وبلاگم اینه
tagtak.blog.ir
۱۰:۲۳:۳۴ ۱۳۹۸/۰۸/۲۰

form حمید
در:
سلام. خسته نباشید. من میخاستم استایل فیلدهای فرمم رو تغییر بدم منتهی نمیدونم از چه کدهایی باید استفاده کنم. برای اینکه فرمی به شکل...
۱۰:۳۶:۱۹ ۱۳۹۸/۰۸/۱۹

form سمیه
در:
سلام ممنون بابت آموزش مفیدتون توی تگ ها هرچیزی که در تگ head قرار بگیره نمایش داده نمیشه، اما ممنون میشم...
۲۰:۴۹:۲۳ ۱۳۹۸/۰۸/۱۷

form استادمجازی
در:
سلام. از ادمین عزیز و همگی دعوت می کنم آموزش های خوبتون را بصورت آموزش ویدیویی یا صوتی و... در سایت ostadmajazi.com استادمجازی ...
۲۲:۱۲:۲۳ ۱۳۹۸/۰۸/۱۳

form mohamad
در:
سلام و خسته نباشید ، توی فرمی که ساختم چند تا drop down دارم که میخوام با php براشون شرط بذارم به طوری...
۱۳:۵۱:۳۴ ۱۳۹۸/۰۸/۱۰

form رضا
در:
خسته نباشید این جلسه آخر html بود؟؟؟؟
۰۱:۱۵:۰۷ ۱۳۹۸/۰۸/۱۰

form امیرمحمد
در:
سلام و خسته نباشید استاد بنده میخوام بین دو کد زیر که مشخص کردم رو به دست بیارم
// ---------------------set سلام...
۱۹:۳۰:۵۳ ۱۳۹۸/۰۸/۰۸

form حجت
در:
خیلی ممنونم از لطف شما. اوکی شد.
۱۰:۲۸:۳۵ ۱۳۹۸/۰۸/۰۶

form میلاد
در:
آشنایی نسبی با css, php و ajax دارم و نمیخام از library های موجود در نت استفاده کنم. خواستم با همین متد که انصافا روان...
۲۳:۲۲:۵۵ ۱۳۹۸/۰۸/۰۵

form عرفان
در:
با سلام. مدتی بود که بدلایل مشکلات زیاد نتونستم به وبلاگم رسیدگی کنم ولی وقتی برگشتم میبینم که هزاران بازدید داشتم و همشونم به زبان...
۲۲:۴۹:۴۴ ۱۳۹۸/۰۸/۰۵

form raha
در:
سلام وقتتون بخیر ببخشید علامت @ در کل به چه معناست ممنون میشم پاسخ دهید
۲۰:۱۲:۵۹ ۱۳۹۸/۰۸/۰۵

form میلاد
در:
باسلام تشکر از مطالب روان و پرکاربردتان. در خصوص آموزش مذکور، نحوه و ترفند نمایش محور عمودی در سمت چپ نمودار (مشابه...
۰۲:۳۸:۴۰ ۱۳۹۸/۰۸/۰۵