آموزش و سورس صفحه بندی مطالب با Php و MySql
آموزش و سورس صفحه بندی مطالب با Php و MySql
در این پست آموزش صفحه بندی مطالب و محتوا با PHP و MySQL را برایتان قرار داده ایم
یکی از مواردی که دیر یا زود مورد نیاز برنامه نویسان وب خواهد بود، صفحه بندی مطالب و محتوای سایت یا برنامه کاربردی است که در اصطلاح به آن pagination هم می گویند (به معنی تقسیم نمایش محتوای مورد نظر در چند صفحه به جای نمایش آنها در یک صفحه)، در این آموزش قصد داریم تا صفحه بندی مطالب و محتوا را با PHP یاد بگیریم.
در این آموزش ما نیاز به یک پایگاه داده و یک جدول داریم. نام پایگاه داده در این آموزش pagination و نام جدول topic می باشد. که جدول topic دارای فیلدهای TopicId ، Title ، Description و Content می باشد. که فایل SQL آن ضمیمه سورس کد می باشد.
پس از ایجاد جدول، ستون و ردیف های اطلاعات، برنامه ما برای صفحه بندی صحیح به سه پارامتر اولیه احتیاج دارد تعداد آیتم ها در هر صفحه، شماره صفحه درخواستی و شماره id برای تعیین نقطه شروع انتخاب نتایج، این پارامترها از طریق تعریف متغیر setting ، در یافت شماره صفحه از متد GET و تعیین id شروع مشخص می شوند، متغیری که در قسمت تنظیمات برنامه ،متغیر setting به آن نیاز داریم، نمایانگر تعداد آیتم ها در هر صفحه است (به فرض 2 آیتم در هر صفحه)، لذا آن را در یک آرایه تعریف کرده ایم.
$setting = array( 'paged_item' => 2 ;)
پس از اینکه تعداد آیتم ها در هر صفحه را تعیین کردیم، قاعدتا مورد دیگری به ذهن می رسد که همان شماره صفحه درخواستی است، یعنی برنامه ما باید بداند که کاربر قصد فراخوانی چه صفحه ای را دارد تا متناسب با آن نتایج را از پایگاه داده دریافت و نمایش دهد، این پارامتر از طریق آدرس URL صفحه و به صورت متد GET قابل دریافت است، به فرض اگر آدرس لینک صفحه به صورت زیر باشد.
http://iranganj.com/ index.php?page=3
مقادیر صفحه فعلی در پارامتر page وجود دارد (عدد 3) که به صورت زیر قابل دریافت در برنامه است.
$page = mysql_real_escape_string($_GET['page']);
در حالت عادی نیازی به استفاده از تابع mysql_real_escape_string نیست، اما به این جهت که ما از متغیر page در پرس و جوهای دیتابیس استفاده خواهیم کرد، به دلیل ایمن سازی پرس و جو در مقابل حملات MySQL Injection از این تابع استفاده می کنیم.
در آخرین مرحله از تنظیمات اولیه صفحه بندی، نوبت به مشخص کردن شماره id برای شروع یک پرس و جو است، توضیح اینکه در برنامه صفحه بندی از پرس و جویی در دیتابیس خود استفاده خواهیم کرد که با استفاده از LIMIT یک محدوده خاص از ردیف ها را به عنوان نتیجه انتخاب می کند
$query = "SELECT * "; $query .= "FROM topic "; $query .= " ORDER BY TopicId ASC LIMIT $start, " . $setting['paged_item'] . " "; $topic_set = mysqli_query($connection, $query);
سپس باید شماره شروع صفحه را محاسبه کنیم که کدهای آن درون برنامه قرار داده شده است که در بین کدها نیز توضیحات ارائه شده است.
بررسی اولیه برای ایجاد لینک های صفحه بندی
هرچند درک مواردی که تا این لحظه گفتیم به خودی خود اهمیت زیادی دارد، اما مهم تر از آنها نوشتن سیستمی برای ایجاد لینک های داینامیک است تا شماره صفحات و مواردی مانند صفحه قبل، صفحه بعد، صفحه اول و صفحه آخر را به دقت چاپ کند، البته با کسب تجربه و مهارت بیشتر در برنامه نویسی PHP و با اندکی خلاقیت می توان این کار را به شکل های مختلف و به صورت سفارشی انجام داد، اما جهت نمونه یک مورد را در ادامه بررسی می کنیم، به طور خلاصه در این قسمت نیازمند موارد زیر هستیم:
تعداد کل ردیف های موجود در دیتابیس
تعداد کل صفحاتی که ایجاد می شوند
تعداد لینک صفحه در قسمت نمایش صفحات
مقادیر لینک صفحه اول
مقادیر لینک صفحات میانی
مقادیر لینک صفحه آخر
مقادیر لینک صفحه قبل
مقادیر لینک صفحه بعد
تمامی این موارد در کدهای برنامه مشخص بوده و در بالای کدها توضیحاتی کوتاه داده شده است.
در پایان نیز برای زیباتر شدن کار از کدهای CSS استفاده شده تا برنامه ظاهر خوبی داشته باشد.
کدهای کامل برنامه به صورت زیر می باشند.
<html> <head> <meta charset="UTF-8"> <title>صفحه بندی در PHP</title> <link href="style.css" type="text/css" rel="stylesheet"> </head> <bod> <div class="wrapper"> <div class="header"> <a href="http://www.iranganj.ir"><img style="margin-top: 20px;margin-right: 30px;" src="logo.png"></a> </div> <div class="main"> <div class="sidebar"> <ul> <li> <a href="index.php">صفحه اصلی</a> </li> </ul> </div> <div class="content"> <?php // اتصال به پایگاه داده define("DB_SERVER_LOCAL", "localhost"); define("DB_USER_LOCAL", "root"); define("DB_PASS_LOCAL", ""); define("DB_NAME_LOCAL", "pagination"); $connection = mysqli_connect(DB_SERVER_LOCAL, DB_USER_LOCAL, DB_PASS_LOCAL, DB_NAME_LOCAL); mysqli_query($connection, "set names 'utf8'"); if (mysqli_connect_errno()) { die("database connection failed: " . mysqli_connect_error() . "(" . mysqli_connect_errno() . ")" ); } //دریافت صفحه درخواستی @$page = mysqli_real_escape_string($connection, $_GET['page']); //تعداد آیتم در هر صفحه $setting = array( 'paged_item' => 2 ); //محاسبه شروع انتخاب نتایج if (empty($page)) { //پیش فرض $page = 1; } $start = ($page - 1) * $setting['paged_item']; //اجرای پرس و جوی داینامیک و دریافت مقادیر $query = "SELECT * "; $query .= "FROM topic "; $query .= " ORDER BY TopicId ASC LIMIT $start, " . $setting['paged_item'] . " "; $topic_set = mysqli_query($connection, $query); //چاپ خروجی while ($row = mysqli_fetch_assoc($topic_set)) { $topicId = $row['TopicId']; $title = $row['Title']; $content = $row['Content']; echo 'مطلب شماره: ' . $topicId . '<br/>' . $title . '<br/> ' . $content . '<br />' . "\n"; } //پرس و جوی تعداد کل ردیف ها $query = "SELECT * "; $query .= "FROM topic "; $total = mysqli_query($connection, $query); //مجموع $count = mysqli_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="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="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="index.php?page=' . $i . '" title="صفحه ' . $i . '">' . $i . '</a></div>' . "\n"; } //در حالت عادی else { $paged_result .= '<div class="paged-link"><a href="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="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="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"; } //پایان اتصال if (isset($connection)) { mysqli_close($connection); } ?> </div> </div> <div class="footer"> <h4 style="text-align: center;padding: 20px;"><a href="http://www.iranganj.ir">تمامی حقوق متعلق به سایت ایران گنج می باشد</a></h4> </div> </div> </bod> </html>
توجه : تمامی فایل ها در سورس کد موجود می باشند.
نظر / سوال