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

یکی از مواردی که دیر یا زود مورد نیاز برنامه نویسان وب خواهد بود، صفحه بندی مطالب و محتوای سایت یا برنامه کاربردی است که در اصطلاح به آن 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">» صفحه: '.$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">» صفحه: '.$page.' از '.$paged_total.'</div>'."\n";
//خروجی
echo $paged_result;
}
else{
echo 'صفحه ای وجود ندارد!'."\n";
}
//پایان اتصال
$close = mysql_close($connect);
?>
</body>
</html>
دانلود نمونه فایل های صفحه بندیدسته بندی: آموزش کاربردی » MySQL

ایجاد لینک دانلود مدت دار با PHP و MySQL
آموزش حذف گروهی اطلاعات از MySQL با استفاده از چک باکس
جستجو در مطالب سایت با استفاده از MySQL Full-Text
ساخت فید آر اس اس (RSS Feed) با استفاده از PHP و MySQL
آموزش ساخت فرم تماس با PHP و MySQL
دیدگاه


۱۲:۴۹ ۱۳۹۲/۰۶/۲۷
سلام.
من پست ها رو وارد دیتایس کردم.
حالا میخوام موقع خوندن اونها از آخر به اول بخون تا آخرین مطلب ارسال شده اولین پست در صفحه باشه.
چی کار کنم؟
من پست ها رو وارد دیتایس کردم.
حالا میخوام موقع خوندن اونها از آخر به اول بخون تا آخرین مطلب ارسال شده اولین پست در صفحه باشه.
چی کار کنم؟
سلام
می توانید از پارامتر ASC و DESC در پرس و جوی MySQL برای sort سفارشی استفاده کنید، در این خصوص لطفا به آموزش های مقدماتی بخش MySQL مراجعه نمائید.
می توانید از پارامتر ASC و DESC در پرس و جوی MySQL برای sort سفارشی استفاده کنید، در این خصوص لطفا به آموزش های مقدماتی بخش MySQL مراجعه نمائید.
۲۲:۵۶ ۱۳۹۲/۰۶/۲۵
با سلام خدمت شما مدیر محترم بهترین سایت آموزش php در ایران
من یه سوال فنی دارم خدمتون و خیلی برام مهمه و گیر کردم اساسی من یه صفحه ثبت نام درست کردم که کاربر اطلاعات خودش رو وارد می کنه و به درگاه پرداخت وصل میشه و پرداخت رو انجام میده و سیستم بهش کد رهیگری و تراکنش میده و تمام اطلاعاتش در صورت موفق بود پرداخت در پایگاه داده ثبت میشه
من در قسمت مدیریت که تمام اطلاعات این کاربران ثبت نام کرده رو با یه حلقه تکرار از بانک اطلاعاتی با یک جدول html منظم کردم و مشکل من اینجاست که می خوام کنار هر کدام از این فیلد ها لینک حذف اون فرد یا ویرایشش رو بزارم من هر کاری کردم نتوستم خواهش می کنم کمک کنید ؟؟؟
من یه سوال فنی دارم خدمتون و خیلی برام مهمه و گیر کردم اساسی من یه صفحه ثبت نام درست کردم که کاربر اطلاعات خودش رو وارد می کنه و به درگاه پرداخت وصل میشه و پرداخت رو انجام میده و سیستم بهش کد رهیگری و تراکنش میده و تمام اطلاعاتش در صورت موفق بود پرداخت در پایگاه داده ثبت میشه
من در قسمت مدیریت که تمام اطلاعات این کاربران ثبت نام کرده رو با یه حلقه تکرار از بانک اطلاعاتی با یک جدول html منظم کردم و مشکل من اینجاست که می خوام کنار هر کدام از این فیلد ها لینک حذف اون فرد یا ویرایشش رو بزارم من هر کاری کردم نتوستم خواهش می کنم کمک کنید ؟؟؟
سلام
ایجاد لینک حذف یا ویرایش در صورت آشنایی شما با نحوه کار PHP و MySQL خیلی سخت نیست، کافی است در خروجی، به فرض از ستون id هر تراکنش استفاده کنید و آن را در لینک به صورت داینامیک خروجی دهید، مثال:
ایجاد لینک حذف یا ویرایش در صورت آشنایی شما با نحوه کار PHP و MySQL خیلی سخت نیست، کافی است در خروجی، به فرض از ستون id هر تراکنش استفاده کنید و آن را در لینک به صورت داینامیک خروجی دهید، مثال:
yoursite.com/delete.php?id=$row['id']
که متغیر فرضی row در ایتجا آرایه ای است که نتایج توابعی مانند mysql_fetch_array را در خود دارد و id نام یکی از ستون های دیتابیس است که به صورت یکتا و افزایش خودکار، شماره تراکنش را در خود دارد.سيد عباس
۱۰:۵۴ ۱۳۹۲/۰۶/۱۲
ببخشيد بازم مزاحم شدم ميخواستم ببينم اگر آدرس سايت بصورت
site.com/page.php?recordID=12
باشه مشكلي از لحاظ امنيتي نداره و يه سوال ديگه اينه كه بسياري از سايت ها نقشه سايت خود رو از يك فايل پي اچ پي استفاده مي كنند كه تمامي صفحات در آن وجود دارد لذا نظر شما در مورد اين نوع كار چيست آيا از لحاظ موتور هاي جستجو كار درستي است با تشكرهرچه اطلاعات کمتری از ساختار سایت در اختیار کاربران باشد، از لحاظ امنیتی بهتر است، در مورد لینک های داینامیک در صورت رعایت سایر موارد و امنیت پایگاه داده، صرف داینامیک بودن لینک مشکلی ایجاد نمی کند، هر چند لینک های استاتیک از این لحاظ بهتر هستند.
در مورد سوال دوم، آنچه توسط موتورهای جستجو پیشنهاد می شود، ایجاد نقشه سایت XML است، اما ایجاد لینک ها در یک صفحه برای راهنمایی کاربران می تواند مفید باشد و به موتورهای جستجو در یافتن صفحات سایت کمک کند.
در مورد سوال دوم، آنچه توسط موتورهای جستجو پیشنهاد می شود، ایجاد نقشه سایت XML است، اما ایجاد لینک ها در یک صفحه برای راهنمایی کاربران می تواند مفید باشد و به موتورهای جستجو در یافتن صفحات سایت کمک کند.
مسعود
۰۱:۵۳ ۱۳۹۲/۰۵/۳۱
با سلام . ممنونم از جوابتون
استاد ببخشید اگه خواسته باشیم آیتم هایی که انتخاب میشه از آخر انتخاب بشه باید چی کار کنیم ؟
ORDER BY میخواد ؟
استاد ببخشید اگه خواسته باشیم آیتم هایی که انتخاب میشه از آخر انتخاب بشه باید چی کار کنیم ؟
ORDER BY میخواد ؟
سلام
بله از ORDER BY به همراه ASC یا DESC استفاده کنید (رجوع کنید به آموزش های مقدماتی).
بله از ORDER BY به همراه ASC یا DESC استفاده کنید (رجوع کنید به آموزش های مقدماتی).
مسعود
۲۰:۵۴ ۱۳۹۲/۰۵/۳۰
با سلام . میشه در مورد LIMIT 2,6 یه توضیحی بدین ؟
وقتی LIMIT دو عدد میگیره یعنی چی ؟؟
وقتی LIMIT دو عدد میگیره یعنی چی ؟؟
سلام
عدد اول در LIMIT شماره id است که انتخاب ردیف ها از آن شروع می شود (شامل خود آن شماره نمی شود)، پارامتر دوم تعداد آیتم هایی است که SELECT می شوند.
عدد اول در LIMIT شماره id است که انتخاب ردیف ها از آن شروع می شود (شامل خود آن شماره نمی شود)، پارامتر دوم تعداد آیتم هایی است که SELECT می شوند.
Mohammad
۱۵:۲۵ ۱۳۹۲/۰۵/۲۶
سلام
واقعا کارتون حرف نداره دمتوووووووووون گرم
واقعا کارتون حرف نداره دمتوووووووووون گرم
علی
۲۲:۱۷ ۱۳۹۲/۰۴/۳۱
خیلی ممنونم
فهمیدم چی کار باید کنم
فهمیدم چی کار باید کنم
علی
۱۶:۱۵ ۱۳۹۲/۰۴/۳۱
در صفحه بندی مطالب سایت باید حتماً از پوشه استفاده کرد؟ در همین صفحه ی سایت شما در url یک دسته بندی انجام داده اید اما نمی دانم چطور می شود آدرس url را برای هر صفحه به صورت زیر شاخه ای ایجاد کرد.
منظورم مثل کد زیر است که یک دسته بندی دارد
تشکر
منظورم مثل کد زیر است که یک دسته بندی دارد
mysite.ir/section/lern/html/myfile.pdf
چون می توانم به یک فایل لینک دانلود دهم اما نمی دانم چه طور قسمت های بالایی و موضوعات سرشاخه در url نمایش داده شود. چون در موتور های جستجوگر مهم است.تشکر
سلام
خیر، در واقع اکثر سایت های داینامیک (مبتنی بر پایگاه داده) از فولدری به این منظور استفاده نمی کنند، بلکه اصل لینک ها به صورت داینامیک است (یعنی علامت ? ، = و & در آنها قرار دارد) به طور مثال:
خیر، در واقع اکثر سایت های داینامیک (مبتنی بر پایگاه داده) از فولدری به این منظور استفاده نمی کنند، بلکه اصل لینک ها به صورت داینامیک است (یعنی علامت ? ، = و & در آنها قرار دارد) به طور مثال:
mysite.ir/?section=learn&category=html
اما با استفاده از قابلیتی به نام URL Rewrite می توان آدرس های داینامیک را به صورت استاتیک در آورد، برای کسب اطلاعات بیشتر، در قسمت جستجوی سایت، عبارت "Rewrite" را وارد کنید.شکوفه
۱۷:۱۱ ۱۳۹۲/۰۴/۲۶
سلام. سپاس از اموزش کاربردیتان
امکانش هست مبحث Alphabetical Pagination را هم آموزش بدید؟
پیروز باشید
امکانش هست مبحث Alphabetical Pagination را هم آموزش بدید؟
پیروز باشید
سلام
صفحه بندی الفبایی تفاوت خاصی با عددی ندارد، فقط کافی است در قسمت ORDER BY از یک ستون با مقادیر رشته ای استفاده کنید (به فرض ORDER BY title)، در این حالت MySQL به صورت پیش فرض نتایج را به ترتیب حروف الفبا (انگلیسی) مرتب می کند.
نکته: اگر منظور شما این است که به جای شماره صفحات، از حروف الفبا استفاده شود، باید از این آموزش الگوبرداری کنید و سیستم مورد نظرتان را به صورت الفبایی پیاده سازی کنید، آن سیستم هم مشابه و بر مبنای اصول سیستم فعلی خواهد بود.
صفحه بندی الفبایی تفاوت خاصی با عددی ندارد، فقط کافی است در قسمت ORDER BY از یک ستون با مقادیر رشته ای استفاده کنید (به فرض ORDER BY title)، در این حالت MySQL به صورت پیش فرض نتایج را به ترتیب حروف الفبا (انگلیسی) مرتب می کند.
نکته: اگر منظور شما این است که به جای شماره صفحات، از حروف الفبا استفاده شود، باید از این آموزش الگوبرداری کنید و سیستم مورد نظرتان را به صورت الفبایی پیاده سازی کنید، آن سیستم هم مشابه و بر مبنای اصول سیستم فعلی خواهد بود.
hamed
۱۹:۰۶ ۱۳۹۲/۰۴/۰۸
من فایل نمونه رو طبق اطلاعات دیتابیسم به درستی تغییر دادم ولی تو صفحم این رو بر می گردونه :
Unknown column 'ads' in 'field list'
بر طبق خطای دریافتی، ستونی با نام ads در دیتابیس شما وجود ندارد، در صورتی که در پرس و جوها از این ستون استفاده کرده اید.
hamed
۱۸:۱۷ ۱۳۹۲/۰۴/۰۸
سلام. مرسی از آموزشتون. من یه منوی عمودی دارم تو سایتم که میخوام با کلیک روی هر گزینه از اون مطالب صفحه رو بر اساس گزینه منو بیاره. مثلا وقتی گزینه آموزش رو میزنم پست هایی که تو گروه آموزش هستن لیست بشن. ممنون میشم راهنمایی کنید .
سلام
برای این کار باید علاوه بر آشنایی با سیستم مدیریت محتوای سایت خود، با نحوه انتخاب و نمایش اطلاعات از MySQL آشنا باشید، در این صورت می توان پرس و جوی انتخاب ردیف ها را (با LIKE و...) طوری طراحی کرد که متناسب با پارامتر موجود در آدرس لینک، موارد را انتخاب کند، در واقع انجام این کار نیازمند تسلط نسبی شما بر برنامه نویسی PHP است.
برای این کار باید علاوه بر آشنایی با سیستم مدیریت محتوای سایت خود، با نحوه انتخاب و نمایش اطلاعات از MySQL آشنا باشید، در این صورت می توان پرس و جوی انتخاب ردیف ها را (با LIKE و...) طوری طراحی کرد که متناسب با پارامتر موجود در آدرس لینک، موارد را انتخاب کند، در واقع انجام این کار نیازمند تسلط نسبی شما بر برنامه نویسی PHP است.
۰۹:۰۹ ۱۳۹۲/۰۳/۳۱
سلام
ممنون از مطالب خوبتون
سوالی که برام پیش اومده اینه که معمولا وقتی مطالب رو صفحه بندی می کنیم ، از آخرین مطلب شروع می کنیم به نمایش دادن
مثلا اگه 60 تا مطلب داشته باشیم و هر صفحه قرار باشه 10 تا پست رو نمایش بده صفحه ی یک باید مطالب 50 تا 60 رو نمایش بده
صفحه ی دو مطالب 40 تا 50 و الی آخر
لطفا در مورد کدنویسی اینجور صفحه بندی هم توضیحی بدین
تشکر
ممنون از مطالب خوبتون
سوالی که برام پیش اومده اینه که معمولا وقتی مطالب رو صفحه بندی می کنیم ، از آخرین مطلب شروع می کنیم به نمایش دادن
مثلا اگه 60 تا مطلب داشته باشیم و هر صفحه قرار باشه 10 تا پست رو نمایش بده صفحه ی یک باید مطالب 50 تا 60 رو نمایش بده
صفحه ی دو مطالب 40 تا 50 و الی آخر
لطفا در مورد کدنویسی اینجور صفحه بندی هم توضیحی بدین
تشکر
سلام
همان طور که در آموزش توضیح داده شده، نحوه انتخاب ردیف ها را می توان با ORDER BY و مقادیر ASC یا DESC
تنظیم کرد.
همان طور که در آموزش توضیح داده شده، نحوه انتخاب ردیف ها را می توان با ORDER BY و مقادیر ASC یا DESC
تنظیم کرد.
الیاس
۱۹:۱۸ ۱۳۹۲/۰۳/۲۹
ســــــــــــــــــــــــــــــــــــــــــــــــــلامـــــــــــــــــــــــــــــــــــــ
اســــــــــــــــــــــــــــــــــــــتادـــــــــــــــــــــــــــــــــــــــــــــــــ
کاش بشه در آموزش ها تون جی کئوری را هم بگنجانید
ممنون
راستی انصافا قلم روانی دارین کاش یک کتاب طراحی صفحات وب می نوشتین
اســــــــــــــــــــــــــــــــــــــتادـــــــــــــــــــــــــــــــــــــــــــــــــ
کاش بشه در آموزش ها تون جی کئوری را هم بگنجانید
ممنون
راستی انصافا قلم روانی دارین کاش یک کتاب طراحی صفحات وب می نوشتین
سلام
در مورد آموزش های جی کئوری، در کوتاه مدت امکانپذیر نیست، اما در آینده بخشی برای آن در نظر خواهیم گرفت.
در مورد انتشار کتاب، البته نظر لطف شما است، این مورد نیز جزء برنامه های سایت خواهد بود.
در مورد آموزش های جی کئوری، در کوتاه مدت امکانپذیر نیست، اما در آینده بخشی برای آن در نظر خواهیم گرفت.
در مورد انتشار کتاب، البته نظر لطف شما است، این مورد نیز جزء برنامه های سایت خواهد بود.
hamid
۰۷:۱۸ ۱۳۹۲/۰۳/۱۱
مرسی از این سایت خوب. اگه میشه مباحث
object oriented (oop)
را هم آموزش دهید. ممنوندر آینده نزدیک این کار صورت خواهد گرفت.
مهتاب
۱۰:۳۰ ۱۳۹۲/۰۲/۲۷
سایت فوق العاده ای دارید . من و دوستانم همواره از مطالب مفید شما استفاده میکنیم .کاش در مورد بحث امنیت در php هم یه تاپیک باز میکردید . ممنون
سلام
ممنون از نظر لطف شما، مقاله آن در حال آماده شدن است و در آینده نزدیک منتشر خواهد شد.
ممنون از نظر لطف شما، مقاله آن در حال آماده شدن است و در آینده نزدیک منتشر خواهد شد.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.