نظام تعدد الصفحات [بأسهل الطرق]
مدرج تحت قسم: دروس
لقد سألني بعض الإخوة عن كيفية عمل تعدد صفحات في عملية جلب البيانات من القاعدة. قف! فكّر! وتذكر! العملية سهلة جداً. ابدأ أولاً بفهم الأكواد ثم حاول استخدام الطريقة لصالحك.
في البداية أود أن أشرح الكود شرح نظري ومن ثم أطرحه بإذن الله تعالى، لنفرض في البداية أننا في الصفحة الأولى، سيكون رقم الصفحة هو (1). في كل صفحة نريد عرض 20 نتيجة مثلاً، لو ضربنا رقم الصفحة وهو 1 في عدد النتائج في كل صفحة وهو 20، سينتج لدينا رقم 20، كيف نحصل على رقم أول تسجيل نريد عرضه؟ نطرح منه عدد النتائج في كل صفحة.
إذاً، 20 – 20 يساوي صفر، سيبدأ من النتيجة الأولى في الصفحة الأولى. في الصفحة الثانية نضرب رقم الصفحة بعدد نتائج كل صفحة ثم نطرح عدد نتائج كل صفحة، ( 2 × 20) – 20 وتساوي 20، إذاً سيبدأ بجلب النتائج من بعد النتيجة رقم 20، وهو المطلوب.
المعادلة الرئيسية في هذه الفكرة هي :
( رقم الصفحة * عدد النتائج في كل صفحة ) – عدد النتائج في كل صفحة
الآن وبكل سهولة سنقوم بتطبيق الفكرة عملياً بإذن الله تعالى. عنوان صفحة التجارب كمثال:
http://localhost/test.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
في ظل محاولتنا لحماية الصفحة من العدوان الخارجي، إلا أننا جعلنا هكذا رقم الصفحة يساوي صفراً، لنضف الكود التالي بعد السابق حلاً لمشكلة الصفر:
$page = ($page == 0 ? 1 : $page);
إذا كان رقم الصفحة يساوي صفراً فسيجعله واحد، أما إن كان غير ذلك فسيتركه كما هو.
بعد أن حددنا رقم الصفحة، نريد تحديد عدد النتائج التي نريد أن تظهر في كل صفحة، سنضعها في متغير ولنسمه $perpage ، ونضع فيه القيمة 10 مثلاً لكل صفحة :
$perpage = 10;
الآن، تذكر معادلتنا السابقة. نريد تطبيقها بشكل برمجي، وقيمة نتيجة معادلتنا سوف تكون عبارة عن نقطة بداية جلب البيانات، ففي الصفحة الأولى عندما تكون القيمة 0 فهذا يعني أن أول نتيجة نريد عرضها هي رقم 1، وفي الصفحة الثانية القيمة ستكون 20، وهذا يعني أيضاً أن اول نتيجة نريد عرضها هي 21، وهكذا …
لكن .. ماذا لو كتبنا الكود التالي؟
$startpoint = ($page * $perpage) - $perpage;
هنا قمنا بتحديد نقطة بداية جلب النتائج، و $perpage يحتوي على عدد النتائج التي نريد جلبها، إذاً ، كل ما علينا الآن هو إعداد جملة ( استعلام ) SQL وضبطه بالشكل المطلوب، في هذا الاستعلام سنفرض أنا قمنا من قبل بالاتصال بمزود القاعدة واختيار القاعدة المناسبة، وأن تلك القاعدة تحوي جدولاً باسم table نريد جلب كل نتائجه، طبعاً بالتدريج في عدة صفحات، الاستعلام العادي سيكون.
$sql = "select * from `table`";
هذا الاستعلام بشكله البسيط يقوم بجلب جميع سجلات صفوف الجدول table وهذا ما نريده، إلا أننا نريد إضافة شيء بسيط يقوم باختيار مجموعة من الصفوف ما بين أول نتيجة نريدها حسب رقم الصفحة وحسب متغير $startpoint، ونأخذ بعدها عدد السجلات الموجودة في المتغير $perpage.
نقوم بإضافة التالي إلى الاستعلام (مهما كان استعلام جلب النتائج).
limit $startpoint,$perpage
مع هذه الإضافة سيصبح الاستعلام السابق كالتالي.
$sql = "select * from `table` limit $startpoint,$perpage";
الآن كود تنفيذ الاستعلام بكل بساطة.
$result = mysql_query($sql);
ثم بالطبع حلقة جلب البيانات ، ومحتوى الحلقة سوف يختلف من استعلام إلى آخر، ومن جدول إلى آخر، لكن كمثال وحتى تكون العملية شبه كاملة، هذا كود تقريبي.
while ($row = mysql_fetch_array($result)) {
echo $row["name"] ."
";
}
هذا على افتراض أن هناك حقل في نفس الجدول اسمه name ، طبعاً الكود داخل الحلقة يمكنك تعديله حسب حاجتك.
الآن بعد النتائج، علينا عرض أرقام الصفحات على شكل وصلات، هل تذكر الاستعلام الأول؟ أقصد بدون تحديد عدد النتائج المطلوبة؟ هذا الاستعلام سنستخدمه لجلب عدد النتائج كاملة لصنع عدد الصفحات في أسفل النتائج.
الكود التالي يقوم بتقريب عدد الصفحات عن طريق قسمة عدد النتائج جميعها على عدد النتائج في الصفحة الواحدة.
$pagesnum = @ceil(mysql_num_rows(mysql_query("select `id` from `table`")) / $perpage);
مع تغيير اسم الجدول table ، واسم الحقل id إلى حقل قصير أو حقل التعداد التلقائي إن وجد.
بعد أن حصلنا على عدد الصفحات نقوم بكل بساطة بوضع جملة تكرار for أو while ، هنا اخترنا جملة for.
for ($i=1; $i<=$pagesnum; $i++) {
معنى الكود أنه سيتم تنفيذ الكود الموجود داخل هذه الحلقة ما دام المتغير $i (الذي قمنا بتحديد قيمته مبدئياً بالقيمة 1) أصغر من عدد الصفحات، ومن ثم يتم زيادة قيمة المتغير 1، وهذا يعني أنه سيمر على الصفحات واحدة واحدة.
الآن نضع الكود التالي.
if ($i != $page) {
$z = "<a href="http://www.almashroo.com/wp-admin/%22.%20$_SERVER%5B" ?page="$i'">$i</a>";
} else {
$z = "<u>$i</u>";
}
echo "[$z] ";
في البداية نقوم بالتحقق من أن رقم الصفحة الحالية في الحلقة لا يساوي رقم الصفحة الحالية التي نتواجد فيها والمخزن رقمها في المتغير $page، اذا تحقق الشرط فإننا نقوم بطباعة رقم الصفحة على شكل رابط يحولنا إلى الصفحة التي نضغط عليها، أما إذا لم يتحقق الشرط (أي أن الصفحة التي نريد طباعة رقمها تساوي الصفحة التي نتواجد فيها الآن) فإنه سيتم طباعة رقم الصفحة فقط دونما رابط.
في النهاية نغلق عداد الحلقة بواسطة القوس التالي:
}
أعتقد أن الفكرة واضحة وتطبيقها لن يصعب بإذن الله تعالى، أي مشكلة أو استفسار أنا جاهز.
مقال ذو صلة
التعقيبات
- غير معروف
- غير معروف
- غير معروف
- غير معروف
- محرك بحث متعدد الصفحات في موقع php - سوالف سوفت
- هل تعرف TemplatePower ؟ وكيف تستخدمه ؟ - سوالف سوفت


شكراً لك أخي أشرف بالفعل الطريقة سهلة وواضحة يعني أنا فهمتها :) .
شكراً لك .
تحياتي
فراس
رائع اخي اشرف علي الشرح وان شاء الله مزيد من الدروس :)
اخوك
OmeR4eVeR
السلام عليكم,,
موضوع جميل اخى, صراحة لم يسمح لى الوقت لقرائته لكن سأقراءه وسأرد لك
شرح رااااائع
وانا الموضوع قراته على السريع وان شاء الله برجع وبركز فيييه واشوووف الاسئله … :D
تقبل تحيااااتى .
شكراً اخواني جميعاً .. ومنتظر عودتكم :)
شكرا لك اخي شرحك رائع و لكن فقرة ارقام الصفحات في نهاية النتائج اشكلت علي ان شاء الله عند التطيبق تفهم جيدا
بارك الله فيك
موضوع جميل وفيه جهد
لكن أرى أنة غير فعال مع الصفحات الكثيرة مثل 300 صفحة
ستجد أمامك كمية كبيرة من الأرقام هذة نقطة .
النقطة الثانيه لابد من وضع التالى والسابق والصفحة الأولى والأخيرة للتسهيل
* مثال:
< < [1][2][3]....[4] >> [300]
يمكن تطوير النظام بسهولة .. هذا نظام مبدئي .. [ بأسهل الطرق ] .. حتى يمكن فهمه بسهولة .. :)
موضوع رائع .. شكراً فلقد بحثت عن الطريقه كثيراً ولم تنجح معي إلا طريقتك .. فشكراً لك ..
ماشاء الله تبارك الله الله يزيدك علم وبركة
لكن فعلا شئ يصدع الراس يحتاج لها جلسة
جزاك الله خيراً
كلام يحتاج إلى معامله خاصه ووقت أكبر لفهمه
طيب اخوي وين احط الكود في اي صفحة هل الرئيسية ام الصفحة التي اريدها انا؟؟
جزاك الله خير على الموضوع واتمنى تعلمنا المزيد
واتمنى تعليم كيفيه سحب التصميم من فوتوشوب الى فرونت بيج
أخي الكريم شكرا علي الكود المفيد
لكن معلش انا مبتدء وكان عندي مشكلة
وهي
في حالة الأستعلام عن شيئين معا ما يطلع نتائج
مثال
$sql = “select * from `books`where cid=’$cid’ & flag=1″;
علما بأن cid هو أسم القسم و flag هو حالة الكتاب هل هو نشط ام لا
اتمني ان أكون وضحت مشكلتي
واتمنا منكم المساعدة بأقصي سرعة
اعتذر اخي على التأخير .. أعتقد الحل في تغيير متغير الاستعلام $sql اجعل المتغيرات مختلفة يا رعاك الله …
وشكراً للاخوان في الاعلى ;)
السلام عليكم
بعد استخدام هذا الكود السهل والأكثر من رائع بشكل رسمي في كثير من مواقعنا .. نرجوا ان تتم اضافة عدد الأرقام في الصفحة .. حيث ان جميع ارقام الصفحات تظهر .. حتى ان بعض الصفحات وصلت الى 300 رقم !!!!!!! نود منكم حفظكم الله فضلا لا امرا اضافة عدد الارقام في الكود .. مهم جدا جدا جدا .. ولكم جزيل الشكل
مثال على ما تم ذكره
في الكود الحالي: 1 2 3 4 5 6 7 8 9 10 … الخ إلى ما لا نهاية
طلب الاضافة كالتالي :
الصفحات (105) : 1 2 3 4 5 6 7 .. [التالي]
شكرا
هناك مشكلة بالسطر
for ($i=1; $i<=$pagesnum; $i++) {
وهذا هو نص الخطا
Parse error: syntax error, unexpected T_STRING in /home/haboush/public_html/hab_test/show_formulations.php on line 151
طيب ممكن كود كلف النوذج كامل
موضوع رااائع و حقا افادنى كثيراااا
وبصراحه لم اكن انوى الرد ولكن الموضع حقاا يستحق الرد والشكرا لك
جعلة الله فى ميزان حسناتك
انا عندي استفسار هذا رابط ليش ما يكون صحيح تضغط هليه ينتقل مباشرة الى الموقع المطلوب ما (يعطيك صفحة خاطئة) ما هي الطريقة الصحيحة لكتابة مثل هذا الموقع
الرابط :
[url]http://www.uniquebux.info/index.php?r=sherefesam[/url]
ما هي الطريقة الصحيحة لكتابة هذا الرابط .