الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس تصميم جدول الاقسام الرئيسية والفرعية مهما نزلت

بدأه DeaD SouL في 18 فبراير 2009 · 9 رد · 2,963 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

اعزائي ،،بالأمس رأيت موضوع كتبه ayoub henie يسأل فيه عن طريقة عمل الاقسام الفرعية ذات الدرجة الثانية..

وبسبب العطل الذي كان بالمنتدى لم استطع اضافة رد.. كما ان جميع المواضيع والردود وكل ما حصل في الامس قد تم مسحه.. وذلك نتيجة استرجاع اجدد نسخه احتياطيه (على ما اعتقد) المهم.. فقلت لنفسي بما انه لم يعد كتابة الموضوع.. فلماذا لا اطرحه كموضوع مستقل وذلك لتعم الفائده للاخوة المبتدئين

بفرض انه لدينا شجرة الاقسام التالية ونريد حفظها بشكلها في القاعده

  • الجدوع المشتركه
    • الجدع مشترك علمي
      • التربية الإسلاميه
      • التربيه الاجتماعية
      • الرياضيات
      • الاعلاميات

      [*]الجدع مشترك أدبي

      [*]الجدع مشترك تقني

    [*]الاولى بكالوريا

    [*]الثانية بكالوريا

الفكرة باختصار شديد

هي ان تقوم باضافة جدول جديد في القاعده يحتوي على الاقل على 3 حقول وهم

cat_child_id

cat_parent_id

cat_name

يقصد بالحقل الاول: حقل الفرع.. اي القسم الجديد الذي تود اضافته

ويقصد بالحقل الثاني: حقل الأصل.. اي القسم الذي يحتوي على اقسام فرعية بداخله

واخيرا الحقل الاخير: يقصد به اسم هذا القسم

اذا سيكون شكل الجدول هكذا

CREATE TABLE IF NOT EXISTS `categories` (
  `cat_child_id` int(11) NOT NULL auto_increment,
  `cat_parent_id` int(11) NOT NULL default '0',
  `cat_name` varchar(50) NOT NULL,
  PRIMARY KEY  (`cat_child_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

ففي المثال السابق ستكون الاقسام الرئيسية التاليه

الجدوع المشتركه ، الاولى بكالوريا ، الثانيه بكالوريا

يحملون الـ cat_parent_id = 0

والسبب لأنهم هم الاصل اي الاقسام الرئيسية

وكل قسم فرعي جديد تود اضافته تضع في حقل cat_parent_id الخاص به

قيمة ال cat_child_id الخاص بالقسم الذي تود ان ينتمي إليه

وبتطيق المثال السابق فسيكون كالتالي

INSERT INTO `categories` (`cat_child_id`, `cat_parent_id`, `cat_name`) VALUES
(1, 0, 'الجدوع المشتركه'),
(2, 0, 'الأولى بكالوريا'),
(3, 0, 'الثانية بكالوريا'),
(4, 1, 'الجدع مشترك علمي'),
(5, 1, 'الجدع مشترك أدبي'),
(6, 1, 'الجدع مشترك تقني'),
(7, 4, 'التربية الاسلاميه'),
(8, 4, 'التربيه الاجتماعيه'),
(9, 4, 'الرياضيات'),
(10, 4, 'الاعلاميات');

وبـتتبع قيمة حقل ال cat_parent_id ستعلم القسم الذي ينتمي إليه الى أن تصل الى القسم الرئيسي

فبهذه الطريقه تستطيع إضافه اقسام فرعية غير متناهية مهما نزلت

ويبقى عليك كتابة مصدر الphp لكي تتمكن من الاستعلام عن الاقسام التي تود عرضها.. وهكذا

بالتوفيق

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#2

شرح بسيط ورائع

جزاك الله خيرا ... ليكتمل الموضوع قمت بعمل دوال لتسهيل وصول الفكرة وتطبيقها

هذه هي الدوال :

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

function add_to_tree($parent,$parent_name) {
	$result = mysql_query('INSERT INTO `tahlilcom`.`categories` (`cat_parent_id` ,`cat_name`)
						   VALUES ("'.$parent.'", "'.$parent_name.'")');
	return 1;
}

لداله الثانيه : لعرض الأطفال التابعين لأم وتأخذ متغير واحد وهو رقم الأم

function display_children($parent) {
  $result = mysql_query('SELECT * FROM `categories` '.
						'WHERE `cat_parent_id`="'.$parent.'";');
   while ($row = mysql_fetch_array($result)) {
	   $result_this[$row['cat_child_id']]=$row['cat_name'];
   }
   return $result_this;
}

الداله الثالثه : لعرض شجرة الأم يعني العائله كامله بما فيهم الأطفال والأحفاد وتأخذ متغير واحد وهو رقم الأم

function display_tree($root) {
   $result = mysql_query('SELECT * FROM `categories` where `cat_parent_id`='.$root);
   while ($row = mysql_fetch_array($result)) {
	   $tree1[$row['cat_child_id']]=$row['cat_name'];
	   $tree=display_children($row['cat_child_id']);
	   if(is_array($tree)){
		 foreach($tree as $key=>$val){
		   $tree1[$key]=$val;
			$tree1x=display_children($key);
			if(is_array($tree1x)){foreach($tree1x as $key2=>$val2){ $tree1[$key2]=$val2; }}

		 }
	   }
   }
return $tree1;
}

نأتي للتطبيق :

نقوم بعمل جدول كما ذكر أخونا الكريم DeaD SouL في أول مشاركة ثم نقوم بعمل كونيكشن لقعدة البيانات

$link = mysql_connect("localhost", "root", "")or die ('I cannot connect to the database because: ' . mysql_error());
$db_selected = mysql_select_db("mydata", $link);

لإضافة البيانات التي أوردها أخونا DeaD SouL نكتب

 add_to_tree(0,"الجدوع المشتركه")
 add_to_tree(0," الاولى بكالوريا")
 add_to_tree(0,"الثانية بكالوريا")
 add_to_tree(1,"الجدع مشترك علمي")
 add_to_tree(1,"الجدع مشترك أدبي")
 add_to_tree(1,"الجدع مشترك تقني")
 add_to_tree(4,"التربية الإسلاميه")
 add_to_tree(4,"التربيه الاجتماعية")
 add_to_tree(4,"الرياضيات")
 add_to_tree(4," الاعلاميات")

لعرض الأطقال تحت الأم (الجدع مشترك علمي)

$arr=display_children(4);
print_r($arr);
____النتيجة ____
Array
(
	[7] => التربية الإسلاميه
	[8] => التربيه الاجتماعية
	[9] => الرياضيات
	[10] =>  الاعلاميات
)

لعرض الشجرة كامله

$arr=display_tree(0);
print_r($arr);
__النتيجة ___
Array
(
	[1] => الجدوع المشتركه
	[4] => الجدع مشترك علمي

	[7] => التربية الإسلاميه
	[8] => التربيه الاجتماعية
	[9] => الرياضيات
	[10] =>  الاعلاميات
	[5] => الجدع مشترك أدبي

	[6] => الجدع مشترك تقني
	[2] =>  الاولى بكالوريا
	[3] => الثانية بكالوريا
)

أتمنى أن تنتفعوا بلكود وجزا الله خيرا الأخ DeaD SouL فقد أفادني كثيرا في عملي والطريقة التي ذكرها أخونا Ryn صراحة معقدة ولا أعتقد أنها أفضل

شكرا لجميع من شارك وجزاكم الله خير

_______ سبب التعديل ____________

تم تعديل المشاركة الثانيه ليكون الموضوع مكتمل لمن يقرأه أول مرة

________ سبب التعديل ____________

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

تم تعديل هذه المشاركة بواسطة bastr3 في 1 مارس 2009 في 02:46

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#3

وجزاك الله كل خير

شكرا لمرورك عزيزي

واعتذر عن التأخير

بالتوفيق

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#4

شرح جميل، لكن برأيي من الافضل استخدام فكرة مثل المشروحة هنا http://www.sitepoint.com/article/hierarchi...ata-database/2/ مما يعطينا استعلامات افضل وكود اسرع، قد يكون اصعب للمبتدئين، مجرد فكرة على أي حال

تم تعديل هذه المشاركة بواسطة Ryn في 22 فبراير 2009 في 12:19

php5-zce-logo-new.gif

CCNA, CCNA Security, CCNP

#5

اخي العزيز Dead

اعتقد بانه سيكون هناك صعوبه في عمليه الاستعلام من القاعدة باستخدام الامر (Select)...

و شكرا...

#6
Ryn كتب:
شرح جميل، لكن برأيي من الافضل استخدام فكرة مثل المشروحة هنا http://www.sitepoint.com/article/hierarchi...ata-database/2/ مما يعطينا استعلامات افضل وكود اسرع، قد يكون اصعب للمبتدئين، مجرد فكرة على أي حال

عزيزي Ryn شكرا لمداخلتك

الطريقة التي اشرت اليها... لم اقرأها من قبل فقط القيت نظرة سريعه عليها ، تبدو جميله

كما انها معقده بعض الشيء.. اضف الى ذلك ان حقل ال parent الخاص بها يعتمد على اسم القسم.. وهذا غير عملي بتاتا

والسبب.. ماذ لو كان لديك قسمان رئيسيان وهما لغة php ، لغة asp.net

وفي كل منها يحتوي على الاقسام التالي : دروس ، دوال مشروحه

وفي قسم الدروس يحتوي على : دروس مبتدئه ، دروس متقدمه..

فهذا يعني انه سيحصل تضارب.. هل قسم "دروس مبتدئه" تنتمي الى دروس لغة php ام دروس لغة asp.net

لأن كلا من القسمان الفرعيان يحملان نفس الاسم وهو "دروس".. هذا بالنسبة لل parent

كذلك هو الحال في عملية الاضافه الجديده على احد الاقسام سواء كان قسم رئيسي او فرعي.. فهنا تحتاج لاجراء عملية معالجه

لجميع الاقسام الموجوده لتقم بتعديل ارقام ال left & right

وهكذا لن نكون تفادينا الغرض الذي في سبيله قمنا بهذه الفكرة وهو:

اقتباس
مما يعطينا استعلامات افضل وكود اسرع

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

والطريقة هي بتعديل حقل ال parent لكي نقوم بحفظ معرفات الاقسام في اي ان نحفظ اكثر من قسم في عوضا عن قسم واحد فقط

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

اسعدني مرورك وشكرا على الوصله

بالتوفيق

العيافـي كتب:
اخي العزيز Dead

اعتقد بانه سيكون هناك صعوبه في عمليه الاستعلام من القاعدة باستخدام الامر (Select)...

و شكرا...

عزيزي العيافـي

اتمنى التوضيح..

ماذا تقصد بالصعوبه..؟؟

شكرا لمرورك

بالتوفيق

أعتذر وبشده عن انقطاعي.. وذلك بسبب مشروعي الجديد

-------------------

100(سبحان الله وبحمده، سبحان الله العظيم) = 0 سيئة

-------------------

dssighg7.png

#7

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

بالنسبة لاحتواء حقل paren على العنوان هذا لعدم وجودid... وهذا للتسهيل فقط

بالنسبة للاضافة والحذف الحل سهل كله في الموضوع

اعتقد كان دافعي للاساسي لاعتمادها بدون left و right عرض المعلومات بشكل شجرة وبدون معرفة العمق مكلفة جدا

php5-zce-logo-new.gif

CCNA, CCNA Security, CCNP

#8

لحل النزاع أعتقد أن الموضوع يحتاج إلى تكمله

أقصد مثال لعملية عرض النتائج والحذف :)

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

إستخدمت طريقه حقل واحد للتفرعات والأقسام وكانت كنظام اللينك يعني في مثال الأخ لو نريد تطبيقه على ماقمت به ستكون النتيجه :

* الجدوع المشتركه \ الجدع مشترك علمي \

* الجدوع المشتركه \ الجدع مشترك علمي \ التربية الإسلاميه

* الجدوع المشتركه \ الجدع مشترك علمي \ التربيه الاجتماعية

* الجدوع المشتركه \ الجدع مشترك علمي \ الرياضيات

* الجدوع المشتركه \ الجدع مشترك علمي \ الاعلاميات

* الجدوع المشتركه \ الجدع مشترك أدبي \

* الجدوع المشتركه \ الجدع مشترك تقني \

* الجدوع المشتركه \ الجدع مشترك تقني \ الاولى بكالوريا

* الجدوع المشتركه \ الجدع مشترك تقني \ الثانية بكالوريا

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

مع طريقه الأخ DeaD SouL أعتقد الوضع سهل جدا في كل النواحي

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

#9

تم تعديل المشاركة الثانيه ليكون الموضوع مكتمل لمن يقرأه أول مرة

تم تعديل هذه المشاركة بواسطة bastr3 في 1 مارس 2009 في 02:48

CMS Sfhati , Website Generator


نظام إدارة المحتوى صفحتي ... جربه الآن 


 


small-logo.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…