آموزش و سورس صفحه بندی مطالب با Php و MySql
1 0

آموزش و سورس صفحه بندی مطالب با 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">&raquo; صفحه: ' . $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>

توجه : تمامی فایل ها در سورس کد موجود می باشند.

دانلود

نویسنده حسین فتحی
گروه مطلب PHP
نوع مطلب سورس کد و آموزش
تاریخ انتشار ۳۰ بهمن ۱۳۹۳
منبع ایران گنج
تعداد نظرات ۴
قیمت کاربران VIP
توضیح توجه:
  • زمانی که روی لینک دانلود کلیک می کنید لینک دانلود به مدت 24 ساعت معتبر خواهد بود
  • لینک های دانلود دوره های آموزشی تا پایان دوره قابل دانلود می باشد.
  • برای خارج کردن فایل ها از حالت فشرده از ورژن جدید نرم افزار winrar استفاده کنید.
  • برای خارج کردن فایل ها از حالت فشرده لینک های دانلودی که چندین قسمت می باشند فقط قسمت اول را از حالت فشرده خارج کنید.
  • لطفا توضیحات نوشته شده برای مطالب را با دقت بخوانید.
  • برای نمایش فیلم ها می توانید از نرم افزار هایی مانند Km Player , VLC Player یا Media Player Classic استفاده کنید.
خرید VIP
امکان خرید از درگاه های بانکی و حساب مجازی

برای دانلود بعد از خرید به همین صفحه برگردید تا لینک های دانلود نمایش داده شود

نظر / سوال

Captcha
نظرات کاربران

  • زم

    ممنون بابت پست مفیدتون. کارم راه افتاد. خیلی خیلی ممنونم

    پاسخ
    • حسین فتحی

      با سلام خدمت شما کاربر گرامی

      موفق باشید

      پاسخ
  • ali

    لطفا همین برنامه را برای asp.net هم بزارید

    پاسخ
    • مدیر

      با سلام و درود به شما کاربر گرامی

      این آموزش با Asp.net نیز در سایت وجود دارد.

      پاسخ