بسم الله الرحمن الرحيم
الحمدلله ، والصلاة والسلام على أفضلا خلق الله .. سيدنا محمد بن عبدالله .. أما بعد ؛
لقد سألني بعض الإخوة عن كيفية عمل تعدد صفحات في عملية جلب البيانات من القاعدة ..
قف ! فكّر ! وتذكر! ... العملية سهلة جداً.. ابدأ أولاً بفهم الأكواد ثم حاول استخدام الطريقة لصالحك ..
في البداية اود أن أشرح الكود شرح نظري ومن ثم أطرحه بإذن الله تعالى ,..
لنفرض في البداية اننا في الصفحة الاولى .. سيكون رقم الصفحة هو (1) ..
في كل صفحة نريد عرض 20 نتيجة مثلاً .. لو ضربنا رقم الصفحة وهو 1 في عدد النتائج في كل صفحة وهو 20 .. سينتج لدينا رقم 20 .. كيف نحصل على رقم اول تسجيل نريد عرضه ؟ نطرح منه عدد النتائج في كل صفحة ..
إذاً .. 20 - 20 يساوي صفر .. سيبدأ من النتيجة الاولى في الصفحة الاولى ..
في الصفحة الثانية .. نضرب رقم الصفحة بعدد نتائج كل صفحة ثم نطرح عدد نتائج كل صفحة .. ( 2 × 20) - 20 وتساوي 20 .. إذاً سيبدأ بجلب النتائج من بعد النتيجة رقم 20 .. وهو المطلوب ..
المعادلة الرئيسية في هذه الفكرة هي :
( رقم الصفحة * عدد النتائج في كل صفحة ) - عدد النتائج في كل صفحة
الآن وبكل سهولة سنقوم بتطبيق الفكرة عملياً بإذن الله تعالى ..
يمكنك مشاهدة المثال اولاً:
http://www.devpedia.org/examples/pagetest.php
عنوان صفحة التجارب [ كمثال ]:
http://localhost/test.php
في هذه الحالة لم نحدد رقم الصفحة .. سنقوم بتحديده برمجياً ..
كود PHP:
$page = (int) (!isset($_GET["page"]) ? 1 : $_GET["page"]);
قمنا في السطر السابق بتحديد قيمة المتغير $page والذي سيحوي رقم الصفحة الحالية .. نلاحظ في الكود أنه اذا لم يكن قد تم تعريف رقم الصفحة من خلال عنوان الصفحة فإن رقم الصفحة سيكون 1 .. أما اذا تم تعريفه فسيكون رقم الصفحة نفس الرقم الذي تم ارساله في عنوان الصفحة .. وقد أسبقنا الكود بـ (int) لتحويل نوع البيانات إلى int .. فيها نوع من زيادة الحماية ..
إذاً ، إذا قمنا بالدخول إلى هذه الصفحة :
http://localhost/test.php?page=3
عندها ستكون قيمة المتغير هي 3 . .أي ان رقم الصفحة الحالية هو 3 .. لكن ماذا عن هذه :
http://localhost/test.php
هنا ستكون القيمة واحد [ 1 ] .. لاننا لم نحدد رقم الصفحة في العنوان ..
لكن ! ,.., ماذا لو جربنا هذه :
http://localhost/test.php?page=one
في ظل محاولتنا لحماية الصفحة من العدوان الخارجي ... إلا أننا جعلنا هكذا رقم الصفحة يساوي صفراً ..
لنضف الكود التالي بعد السابق حلاً لمشكلة الصفر
:
كود PHP:
$page = ($page == 0 ? 1 : $page);
إذا كان رقم الصفحة يساوي صفراً فسيجعله واحد .. أما إن كان غير ذلك فسيتركه كما هو .. 
بعد أن حددنا رقم الصفحة .. نريد تحديد عدد النتائج التي نريد أن تظهر في كل صفحة .. سنضعها في متغير ولنسمه $perpage .. ونضع فيه القيمة 10 مثلاً لكل صفحة ..
الان .. تذكر معادلتنا السابقة
.. نريد تطبيقها بشكل برمجي... وقيمة نتيجة معادلتنا سوف تكون عبارة عن نقطة بداية جلب البيانات .. ففي الصفحة الاولى عندما تكون القيمة 0 فهذا يعني انا اول نتيجة نريد عرضها هي رقم 1.. وفي الصفحة الثانية القيمة ستكون 20 .. وهذا يعني ايضاً ان اول نتيجة نريد عرضها هي 21 ... وهكذا ..
ماذا لو كتبنا الكود التالي :
كود PHP:
$startpoint = ($page * $perpage) - $perpage;
هنا قمنا بتحديد نقطة بداية جلب النتائج .. و $perpage يحتوي على عدد النتائج التي نريد جلبها .. إذاً ، كل ما علينا الان هو اعداد جملة ( استعلام ) SQL وضبطه بالشكل المطلوب ..
في هذا الاستعلام سنفرض أنا قمنا من قبل بالاتصال بمزود القاعدة واختيار القاعدة المناسبة ، وأن تلك القاعدة تحوي جدولاً باسم table نريد جلب كل نتائجه .. طبعأً بالتدريج في عدة صفحات .. الاستعلام العادي سيكون :
كود PHP:
$sql = "select * from `table`";
هذا الاستعلام بشكله البسيط يقوم بجل جميع سجلات [ صفوف ] الجدول table .. هذا ما نريده .. إلا أننا نريد إضافة شيء بسيط يقوم باختيار مجموعة من الصفوف ما بين اول نتيجة نريدها حسب رقم الصفحة وحسب متغير $startpoint .. ونأخذ بعدها عدد السجلات الموجودة في المتغير $perpage ..
نقوم بإضافة التالي إلى الاستعلام .. مهما كان استعلام جلب النتائج :
كود PHP:
limit $startpoint,$perpage
مع هذه الاضافة .. سيصبح الاستعلام السابق كالتالي:
كود PHP:
$sql = "select * from `table` limit $startpoint,$perpage";
الآن كود تنفيذ الاستعلام بكل بساطة :
كود PHP:
$result = mysql_query($sql);
ثم بالطبع حلقة جلب البيانات ، ومحتوى الحلقة سوف يختلف من استعلام إلى آخر .. ومن جدول إلى آخر .. لكن كمثال وحتى تكون العملية شبه كاملة ، هذا كود تقريبي :
كود PHP:
while ($row = mysql_fetch_array($result)) {
echo $row["name"] ."<br>";
}
هذا على افتراض أن هناك حقل في نفس الجدول اسمه name .. طبعأً الكود داخل الحلقة يمكنك تعديله حسب حاجتك .. 
الان .. بعد النتائج .. علينا عرض أرقام الصفحات على شكل وصلات ..
هل تذكر الاستعلام الأول ؟ أقصد بدون تحديد عدد النتائج المطلوبة .. ؟؟!
هذا الاستعلام سنستخدمه لجلب عدد النتائج كاملة لعمل عدد الصفحات في أسفل النتائج ..
الكود التالي يقوم بتقريب عدد الصفحات عن طريق قسمة عدد النتائج جميعها على عدد النتائج في الصفحة الواحدة ..
كود PHP:
$pagesnum = @ceil(mysql_num_rows(mysql_query("select `id` from `table`")) / $perpage);
مع تغيير اسم الجدول table .. واسم الحقل id إلى حقل قصير او حقل التعداد التلقائي إن وجد ..
بعد أن حصلنا على عدد الصفحات .. نقوم بكل بساطة بوضع جملة تكرار for او while .. هنا اخترنا جملة for ..
كود PHP:
for ($i=1; $i<=$pagesnum; $i++) {
معنى الكود .. انه سيتم تنفيذ الكود الموجود داخل هذه الحلقة ما دام المتغير $i [ الذي قمنا بتحديد قيمته مبدئياً بالقيمة 1 ] أصغر من عدد الصفحات .. ومن ثم يتم زيادة قيمة المتغير 1 ..
وهذا يعني انه سيمر على الصفحات واحدة واحدة ..
الان نضع الكود التالي :
كود PHP:
if ($i != $page) {
$z = "<a href='". $_SERVER['PHP_SELF'] ."?page=$i'>$i</a>";
} else {
$z = "<u>$i</u>";
}
echo "[$z] ";
في البداية نقوم بالتحقق من أن رقم الصفحة الحالية في الحلقة لا تساوي رقم الصفحة الحالية التي نتواجد فيها والمخزن رقمها في المتغير $page ..
اذا تحقق الشرط .. فإننا نقوم بطباعة رقم الصفحة على شكل رابط يحولنا إلى الصفحة التي نضغط عليها ..
أما إذا لم يتحقق الشرط [ أي أن الصفحة التي نريد طباعة رقمها تساوي الصفحة التي نتواجد فيها الان ] فإنه سيتم طباعة رقم الصفحة فقط دونما رابط ..
في النهاية نغلق عداد الحلقة .. بواسطة القوس التالي:
أعتقد أن الفكرة واضحة وتطبيقها لن يصعب بإذن الله تعالى .. أي مشكلة أو استفسار أنا جاهز ..
تحياتي، sBForum
مصدر الدرس:
http://www.devpedia.org/articles/index.php?p=56