إستخراج المتغير من الـ DB

تعدد الصفحات ( ط 1 )


في البداية يجب ان يكون هناك حدود لصفحة
اي نقطة بداية ونقطة نهاية نريد ان تعرض السجلات الموجودة في القاعدة من نقطة البداية الى نقطة النهاية
وعلى هذا الاساس نضع متغيرين
الاول البداية $start
ونتركة بدون قيمة
والثاني العدد الذي ترغب ان يكون حد النهاية في عرض السجلات
$perpage="10"; نضع القيمة حسب الرغبة
الان نبداء استخراج البينات لكن هناك شرط بسيط سوف نضعة

كود

if(!isset($start))
{
$start = 0;
}




نقوم بتمرير قيمة start على الدالة isset والقصد فحص المتغير ان لم يكن لة قيمة نعيد تعيينة عند الصفر
لانة في كل صفحة سوف ياخذ قيمة جديدة
الخطوة الثانية
استخراج البينات

كود

$result = mysql_query("SELECT * FROM $table ORDER BY id DESC LIMIT $start,$perpage");



كود الاستعلام السابق كان محدد بنقطة بداية ونهاية بستخدام كلمة LIMIT وضع الاستعلام في متغير result

ثم نعود مرة اخرى لستعلام قاعدة البينات لمعرفة مجموع عدد السجلات داخلها

كود

$page_result = mysql_query("SELECT * FROM $table ORDER BY id DESC");
$numrows=mysql_num_rows($page_result);


وقمنا بتمريرة على الدالة mysql_num_rows لتعطينا العدد الكلي لسجلات الموجودة . واصبح العدد الكل في متغير numrows سوف نستخدمة في العمليات الحسابية بعد قليل
لكن قبل استخدامة نريد ان نحدد قيمة لكل من
الصفحة السابقة والصفحة التالية

كود

$previous_page=$start - $perpage;
$next_page=$start + $perpage;


الصفحة السابقة previous_page هي قيمة البداية ناقص قمية الحد النهائي للعرض
اما الصفحة التالية next_page هي قيمة البداية زائد قيمة الحد النهائي للعرض

نبداء الان في العمليات الحسابية والشروط
لدينا اربع شروط
الشرط الاول

كود

if(($start > 0) || ($numrows > ($start + $perpage)))
{echo "<p align=center>";
}


الشرط السابق : لتحقق من قيمة start هل هي اكبر من الصفر وهل قمية numrows اكبر من مجموع start وا perpage وستخدمنا العامل المنطقي ||
الفائدة منة يعطينا النتيجة صح اذا تحققت الاختبارين
وخطاء اذا لم يتححق احد الاختبارات السابقة او كلاهما
اذا تحقق الشرط نبداء في طباعة الفقرة
الفائدة منة حتى لا يقوم باظهار كلمة السابق والتالي
حتى ولو لم يكن هناك سجلات تعرض .

الشرط الثاني

كود

if($start > 0)
{
echo "<a href=$PHP_SELF?start=$previous_page><<السابق</a> \n";
}


الشرط السابق : نتحقق من قيمة start اذا كانت اكبر من الصفر نقوم بطباعة رابط الصفحة السابقة
السبب لانة لا يوجد صفحة سابقة اذا كانت قيمة start تساوي صفر والدالة PHP_SELF تعني نفس الملف ليس ضروري كتابت اسم ملفك بتحديد ( يعني خلها زي ما هي )

الشرط الثالث

كود


if($numrows > ($start + $perpage))
{
echo "<a href=$PHP_SELF?start=$next_page>التالي>></a>\n";
}


الشرط السابق : اذا كانت قيمة المتغير numrows اكبر من مجموع حد البداية والنهاية للعرض يطبع
الصفحة التالية لانة لن يكون هناك صفحة تالية اذا كان المجموع اقل من عدد السجلات .

الشرط الرابع

كود

if(($start > 0) || ($numrows > ($start + $perpage)))
{
echo "</p>";
}


نفس الشرط الاول ونطبع اغلاق الفقرة

نهاية عملية تعدد الصفحات ونعود ألى استخراج النتيجة

كود

while($row = mysql_fetch_array($result))
{


وأكمل باقي برنامجك

اليكم كامل الكود

كود

$perpage="10";
if(!isset($start)){$start = 0;}
$result = mysql_query("SELECT * FROM $table ORDER BY id DESC LIMIT $start,$perpage");
$page_result = mysql_query("SELECT * FROM $table ORDER BY id DESC");
$previous_page=$start - $perpage;
$next_page=$start + $perpage;
if(($start > 0) || ($numrows > ($start + $perpage))){echo "<p align=center>";}
if($start > 0){echo "<a href=$PHP_SELF?start=$previous_page><<السابق</a> \n";}
if($numrows > ($start + $perpage)){echo "<a href=$PHP_SELF?start=$next_page>التالي>></a>\n";}
if(($start > 0) || ($numrows > ($start + $perpage))){echo "</p>";}


لا يحتاج هذا الكود اي تعديل إلى في الاستعلامات يجب ان تتناسب مع الجداول لديك ومفايتح الجداول


تعدد الصفحات ( ط 2 )

نظرة سريعة على بداية الكود الجديد لإنشاء تعدد لصفحات
perpage
وضعنا متغير للبداية وهو start وأعطيناه القيمة صفر إذا لم يكن له قيمة
ثم وضعنا متغير أخر perpage وهو الحد الأعلى للعدد السجلات في كل صفحة وأعطيناه القيمة عشرة وقمنا باستعلام قاعدة البينات مرتين
المرة الأولى لاستخراج السجلات وأضفنا حدود لهذا الاستعلام
والمرة الثانية لمعرفة عدد جميع السجلات في القاعدة .. ( كل هذا شرح بتفصيل في الدرس الأول )

كود

if ($numrows>$perpage){
echo "<p align=center>";


لاحظ ان الجملة السابقة تركناها مفتوحة { ولن نغلقها حتى ننتهي
وهذا الشرط : يتحقق من ان عدد السجلات اكبر من الحد الأعلى لعرض السجلات في الصفحة. إذا كان عدد السجلات اكبر يـبدأ تطبيق العملية
ويبدأ التطبيق بطباعة بداية فقرة تكون في منتصف الصفحة .

نقوم بحساب الصفحات السابقة تماما كما فعلاً في الشرط الثاني في الطريقة الأولى

كود

if($start >0)
{
$previouspage = $start - $perpage;
echo "<a href=$PHP_SELF?start=$previouspage>السابق</a>\n";
}


تحقق بنفسك من الدرس السابق

ثم نجري عملية حسابية نستخدم فيها دالة مفيدة
وهي intval وظيفتها إعادة تعيين المتغير ...( واحدة من ثلاث دوال بنفس الوظيفة )

كود

$pages=intval($numrows/$perpage);



لان قيمة المتغير pages تتغير في كل مرة و بهذا الأسلوب نعيدها إلا القيمة السابقة .
ملاحظة : المتغير pages يساوي العدد الكلي على الحد الأعلى , افترض ان العدد الكي 17 تقسيم الحد الأعلى 10 , يوجد هناك باقي للقسمة

هنا يوجد لدينا مشكلة ولحل هذه المشكلة نضع شرط إضافي

كود

if ($numrows%$perpage)
{
$pages++;
}


الفائدة من هذا الشرط يضيف باقي القسمة الى عدد الصفحات حتى ينتج معنى رقم صحيح

إلى هنا تخلصنا من كل ما يعيق العملية .... ونبدأ في استخدام الحلقة التكرارية for

كود

for ($i = 1; $i <= $pages; $i++) {


من المفروض ان تكون هذه التركيبة معروفة لديك قبل الشروع في مثل هذا النوع من الدروس ..
يأخذ الحرف I قيمة بداية وهنا يبدأ من الرقم واحد ثم يأتي شرط التكرار ليتحقق هل عدد الصفحات اصغر او يساوي من المتغير I
الان نقوم بعملية حسابية ..

كود

$nextpag = $perpage*($i-1);


ركز في هذا السطر وهو لتحديد الصفحة التالية
نظرب الحد الأعلى في المتغير I ناقص واحد فإذا كان المتغير I يساوي واحد, اصبح ناتج الضرب يساوي صفر وبهذا لا يكون لدينا صفحة تالية

أما اذا كان المتغير I اكبر من واحد لنفرض 2 وقمنا بطرح 1 اصبح ناتج الضرب يساوي قيمة المتيغر perpage

الان نضع شرط بسيط اذا تحقق يطبع الصفحة الحالية ولن تكون على شكل رابط , وهي الصفحة التي نتاوجد فيها اذا لم يتحقق يطبع باقي الصفحات عبارة عن روابط تؤدي الى محتوياتها


كود

if ($nextpag == $start)
{
echo "<font size=2 face=tahoma><b>$i</b></font>&nbsp;\n";
}
else
{
echo "<a href=$PHP_SELF?start=$nextpag>[$i]</a>&nbsp;\n";
}
}


ذا كانت قيمة nextpag مساوية لقيمة start يطبع لنا رقم الصفحة طباعة عادية
وإذا لم تكن مساوية يطبع لنا رقم الصفحة عبارة عن رابط يؤدي لمحتوياتها
هنا انهينا الجزء الاكثر اهمية ولم يبقى غير تحديت التالي

كود

if (! ( ($start/$perpage) == ($pages - 1) ) && ($pages != 1) )
{
$nextpag = $start+$perpage;
echo "<a href=$PHP_SELF?start=$nextpag>>></a>\n";


هذا الشرط يتحقق من أمرين الامر الأول كي لا تتم طباعة كلمة التالي عندما نكون في اخر صفحة والامر الثاني لا يطبع كلمة التالي إذا لم يكن هناك إلا صفحة واحدة
اذا تحقق الشرط يطبع كلمة التالي

واخيرا نقفل الفقرة
ونقفل الشرط الاول في العملية من البداية


كود

echo "</p>";
}



بقي طريقة ثالثة لا ادري هل يتم شرحها ام لا
لان ما تم شرحه يفي بالغرض وبقي عدة طرق إضافية
مثلا يتصفح المتصفح باختيار عدد السجلات التي تعرض وعلى اساس هذا العدد يتكون صفحات ... لا اضن ان هناك حاجة لمثل هذه الأساليب

 

تعدد الصفحات ( ط 3 )



إستخراج المتغير من الـ DB
     

في البداية سنجري الاتصال بقاعدة البينات لكي نتمكن من جلب الإستعلام .


Code ..

<?
$result
= mysql_query("SELECT * FROM rafia_forum
WHERE id='$id'"
);
?>


هذا الاستعلام يستخرج سجل من الجدول rafia_forum وهو الذي تمت التجربة عليه .

يحدد هذا السجل رقمه التسلسلي وهو المتغير id ، لتجربة الإستعلام قم بتبديل هذا المتغير برقم احد السجلات الموجودة في قاعدة بياناتك وقم بتعديل إسم الجدول لما يناسبك .

الان نقوم باستخراج كل الحقول الموجودة في هذا السجل
كما يلي :


Code ..

<?
$row
= mysql_fetch_array($result);
?>


- ملاحظة :
لم نستخدم الحلقات في عملية استخراج النتيجة وهذا ما يقع فيه الكثير من الاخوة , لان الاستعلام على حقل واحد فقط , يكفي ان نضع الحقل في مصفوفة بشكل مباشر .

قبل معالجة البينات نتأكد من أن القيمة لعدد الاسطر موجودة , إن لم تكن تاخذ القيمة صفر :


Code ..

<?
if(!isset($line)){$line = 0;}
?>


بعد ذلك نضع متغير يحمل قيمة عدد الاسطر في كل صفحة :


Code ..

<?
$perpage
= "10";
?>


ثم نقوم بتحرير الحقل الذي نريد تقسيمه لعدة أسطر من المتغير row :


Code ..

<?
$post
= $row["post"];
?>




عملية التقسيم
     
الان نقوم بتقسيم المتغير post إلى اقسام بحسب عدد الاسطر :


Code ..

<?
$expline
= explode("\n",$post);
?>


استخدمنا الدالة explode في التقسيم على أساس
n \ حرف السطر الجديد هو غير مرئي لكنه يأتي في نهاية كل سطر معبراً عن بداية سطر جديد ،ووضعنا الناتج من التقسيم في مصفوفة : expline .

تذكير :
explode : تقوم بتقسيم السلسلة وتحويلها الى مصفوفة .

الان نقوم بحساب عدد عناصر المصفوفة بستخدام الدالة
count :


Code ..

<?
$countlin
= count($expline);
?>


countlin هو المتغير الذي حفظنا فيه مجموع عدد الاسطر ، الان نقوم بتجهيز العملية الحسابية في تقسيم الصفحات ..

( راجع الدرس الاول )


Code ..

<?
//تعيين رقم الصفحة السابقة  بناء على عدد الاسطر
$previouspage = $line - $perpage;
//تعيين رقم الصفحة التالية
$nextpage = $line + $perpage;
?>


إلى هنا سنكون قد جهزنا جميع المتغيرات التي سوف تساعدنا في تقسيم العرض ولذلك سنبدأ في التقسيم .

نقوم بعرض الاسطر انطلاقاً من نقطة معينة في المتغير line وحتى نقطة نهاية معينة في المتغير nextpage مستخدمين في ذلك حلقة التكرار for :


Code ..

<?
for ( $i = $line; $i< $nextpage; $i++)
{
    echo
"$expline[$i]<br>";
}
?>


- ملاحظة :
اثناء الطباعة ستجد <br> في النهاية وهي شرط اساسي لنجاح العملية اما في البداية او النهاية ، لن تضطر لإستخدام الدالة nl2br ، السبب لان التعامل مع مصفوفة ، اعني مقسمة في اسطر جاهزة .

انتهينا ولم يبقى الى اظهار كلمة السابق والتالي ، مستخدمين في ذلك اربع شروط تم شرحها في الدرس الاول :


Code ..

<?
if(($line > 0) || ($countlin > ($line + $perpage)))
{
    echo
"<p align=center>";
}
if(
$line > 0)
{
    echo
"<a href=$PHP_SELF?line=$previouspage>
<<السابق</a>\n"
;
}
if(
$countlin >($line + $perpage))
{
    echo
"<a href=$PHP_SELF?line=$nextpage>
التالي>></a>\n"
;
}
if((
$line > 0) || ($countlin > ($line + $perpage)))
{
    echo
"</p>";
}
?>