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

صفحة Php لاسترجاع بيانات

بدأه Mohammad Hussein في 7 يونيو 2008 · 16 رد · 1,481 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

في الحقيقة, اعمل على برنامج, يعمل على ارشفة البريد و الايميلات .

من خلال صفحة و يب , و لا اعني oracle SQL !!!

و انا بحاجة للمساعدة في عمل استرجاع معلومات مترابطة Parent, child , و للتوضيح:

لدي الجدول التالي كما في الصورة:

من خلال صفحة PHP مع MYSQL

table.JPG

ما انا بحاجة الية, كيف يمككني طباعة المعلومات الخاصة , مثلا

الرسالة رقم 1 , ليس لها اي ارتباط no parent .

الرسالة رقم seq_id 2 , لها ارتباط مع رسالة رقم 1 refere_id

الرسالة رقم seq_id 3 , لها ارتباط مع رسالة رقم 2 refere_id

الرسالة رقم seq_id 4 , لها ارتباط مع رسالة رقم 3 refere_id

الرسالة رقم seq_id 5 ,ليس لها ارتباط

و هكذا ...

رسالة رقم 7 لها ارتباط مع رسالة سابقة

كيف يمكنني طباعة المعلومات الخاصة بالرسالة و الرسائل السابقة المرتبطة بها فقط .

كل رسالة و ما هو منبثق عنها و مرتبط فيها تسلسليا او تاريخيا..

محاولة سابقة:

mysql_select_db($database_config, $config);

$query_action = "SELECT seq_id, refere_id , is_refere, subject  FROM letter  where seq_id=$letter_number or refereto=$letter_number ";
$action = mysql_query($query_action, $config) or die(mysql_error());

<table width="1006" border="0" align="center" dir="rtl">
  <tr class="menupath">

	<td width="56"> <div align="center">seq</div></td>
	<td width="100"><div align="center">refere id </div></td>
	   <td width="123"><div align="center">subject</div></td>

	<td width="80"><div align="center"></div></td>
  </tr>
  <?php  if($row_action = mysql_fetch_assoc($action)) do { ?>
	<tr class="td_text_y">

	  <td><div align="center"><? if($row_action['isreplied']==1) echo "Yes"; else echo "No"; ?></div></td>
	  <td><div align="center"><?php echo $row_action['seq_id']; ?></div></td>
	  <td align="center"><?=$row_action['subjecy']  ?></td>
	  <td><div align="center">
 <?php } while ($row_action = mysql_fetch_assoc($action)); ?>
</table>

شكرا لكم جزيلا

#2

الذي فهمته منك انك تريد شيء من هاذا القبيل ؟

if($row[Is_refere] == 0)
{
 echo "الرسالة رقم ".$row[seq_id]." , ليس لها اي ارتباط";
}
elseif($row[Is_refere] == 1)
{
 echo" لرسالة رقم ".$row[seq_id]."ها ارتباط مع رسالة رقم ".$row[refere_id];

}
#3

لا اخي احمد

انا بحاجة لطباعة جميع nodes او البيانات الي الها parent و بيتبع الها child

شي بيشبة الشجرة tree , او مش عارف يمكن اسمة recursive

يعني

الرسالة رقم 1 ما الها شيء اعلي , parent , هي نفسها parent

الرسالة رقم 2 هي child و مرتبطة برسالة رقم 1 و الي هي parent

كيف ممكن اطيع تقرير بيضم الرسالتين , 1 و 2 ....؟

يعني اطيع الرسالة الرئيسة , parent , و كل الي بينبثق عنها ؟ childs

شكرا لكم

#5

نعم اخي محمد , لكن للجدول الموجود في الاعلى , tree view يعمل على طباعة جميع nodes المرتبطة ب parent

#6

مرحبا يا جماعة

ما في حدا يساعدنا للاهمية ؟

الموضوع مهم بالنسبة النا

شكرا

#7

اولاً , اخي الكريم , عليك بالصبر , قمت بوضع موضوعك امس , وتريد الاجابة مباشرة , وكأنك في فندق خمس نجوم ! ..

بالنسبه لموضوعك , توجد عده حلول للمسأله هذه , من بينها استخدام الاستدعاء الذاتي Recursive .

الفكرة عن طريق الاستدعاء الذاتي , انك ستقوم بعمل داله , تقوم بالبحث عن كل الـ child للـ parent المعطى , ولكل child ايضاَ تقوم بالبحث عن الـ child الخاص به , وهكذا الا ان يتم الانتهاء من المرور على جميع البيانات في الجدول . ولكن نقطه مهمه وهي ان استخدام الاستدعاء الذاتي في PHP خاصه غير محبذ بسبب ان الاستدعاء الذاتي يستهلك ذاكرة اكبر بسبب طبيعة عمل الاستدعاء الذاتي .

عموماً , هذا برنامج بسيط يوضح هذه الفكرة , حاول ان تطبقه وتفهمه جيداً ..

<?php
$host="127.0.0.1"; 
$username=""root";" 
$password=""; 
$db_name=""test";


 // Connect to server and select databse.
mysql_connect($host, $username, $password)or die("cannot connect");
mysql_select_db($db_name)or die("cannot select DB");


 function tree($p_id,$level) {
 //Run the query
 $sql="SELECT * FROM tree where ref_id ".($p_id==Null ? 'IS NULL' : '='.$p_id);

 $result=mysql_query($sql);

  while ($row=mysql_fetch_array($result)) {
	echo str_repeat(' ',$level).'|-'.$row[0]."\n";
	tree($row[0],$level+1);
	}
}
?>
<h2>
<pre>
<?php
//Call by the root
tree(NULL,0);
?>
</pre>
</h2>

لاحظ ان الفكرة كلها تتلخص في الاسطر القليله هذه :

while ($row=mysql_fetch_array($result)) {
	echo str_repeat(' ',$level).'|-'.$row[0]."\n";
	tree($row[0],$level+1);
	}

بالتوفيق ..

تم تعديل هذه المشاركة بواسطة محمد معاشر في 8 يونيو 2008 في 10:02

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#8

شكرا كتير الك اخي محمد و صبركم علينا..

انا جربت الكود بس النتيجة عندي صفحة بيضة .. و ما حصلت على نتيجة

هاي الي انا عملتو , الجدول فيتوا المعلومات الي في database زي الي في الصورة التالية ,

table.JPG

وهاد الكود الي انا عدلت علية , let_seq = p_id و refereto= ref_id عندي , باقي المتغيرات ما استخدمتهم.

<?php  require_once('../Connections/db.php'); ?>
<?php
mysql_select_db($database_db, $db);
$sql="SELECT let_seq, refereto FROM letters5 where refereto ".($let_seq==Null ? 'IS NULL' : '='.$let_seq);
$result = mysql_query($sql, $db) or die(mysql_error());
$row = mysql_fetch_assoc($result);
//$totalRows_let = mysql_num_rows($let);


function tree($p_id,$level) {
//Run the query
//$sql="SELECT let_seq, refereto FROM letters where refereto ".($let_seq==Null ? 'IS NULL' : '='.$let_seq);

//$result=mysql_query($sql);

  while ($row) {
	echo str_repeat(' ',$level).'|-'.$row[0]."\n";
  echo  tree($row[0],$level+1);
	}
}
?>
<h2>
<pre>
<?php
//Call by the root
tree(1,2);
?>
</pre>
</h2>

تم تعديل هذه المشاركة بواسطة Mohammad Hussein في 8 يونيو 2008 في 10:56

#9

هل جربته كما هو !؟ , بالطبع لن يعمل , يجب عليك , ان تغير في معلومات الاتصال , واسم القاعدة , واسم الجدول في الاستعلام ..

والكود الذي وضعته غير صحيح , لانه يجب ان تضع الـ mysql_fetch_assoc , بداخل الحلقة while ..

عليك بتغير المتغير $db_name , ليحتوي على اسم القاعدة , وتغير الاستعلام في $sql , ليحتوي على اسم الجدول عندك بدل من tree ..

هاهو البرنامج مره اخرى (البرنامج الاول كان فيه مشكلة في التنصيص في بدايته ) :

<?php
$host="127.0.0.1";
$username="root";
$password="";
$db_name="test";


// Connect to server and select databse.
mysql_connect($host, $username, $password)or die("cannot connect");
mysql_select_db($db_name)or die("cannot select DB");


function tree($p_id,$level) {
//Run the query
$sql="SELECT * FROM tree where ref_id ".($p_id==Null ? 'IS NULL' : '='.$p_id);

$result=mysql_query($sql);

  while ($row=mysql_fetch_array($result)) {
	echo str_repeat(' ',$level).'|-'.$row[0]."\n";
	tree($row[0],$level+1);
	}
}
?>
<h2>
<pre>
<?php
//Call by the root
tree(NULL,0);
?>
</pre>
</h2>

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#10

نعم اخي

شكرا كتير, اشتغل , لكن مش عارف استخدمة بشكل صحيح ؟ ممكن توضيح عن المتغير الي بتبعتوا,

عم نغلبكم معانوا , يسلموا كتير يا جماعة.

الفكرة الاساسية عندي, انوا انا بدخل ملخص رسائل على قواعد بيانات , من ضمنها رقم الرسالة

و رقم رسالة سابقة في حال كانت مرتبطة فيها , و هم SEQ_ID , Refere_ID

SEQ_ID رقم الرسالة , و عندي هو Auto_increment , و هو يعتبر Parent , كما في الرسمة المرفقة.

Refere_Id . هو رقم الرسالة السابقة المرتبطة فيها الرسالة الحالية و التي اقوم بأدخالها من Form

الان ممكن يكون عندي رسالة رقم 1 , و غير مرتبطة برسالة سابقة.

و عندي راسلة رقم 2 , و هي مرتبطة برسالة رقم 1

و عندي رسالة رقم 3 و هي مرتبطة برسالة رقم 2.

انا بدي اطبع تقرير , يرجعلي كل الرسائل المرتبطة بالرسالة الاصلية و الي رقمها هون 1 .

طبعا يمكن يكون عندي رسالة رقم 4 و هي غير مرتبطة برسالة سابقة.

و ممكن يكون الرسالة رقم 5 مرتبطبة برسالة رقم 2 كمان .

هاي الارقام بتوضح الجدول تقريبا

table.JPG

اشكركم جدا على جهودكم

#11

اخي انت قلت :

اقتباس
انا بحاجة لطباعة جميع nodes او البيانات الي الها parent و بيتبع الها child

شي بيشبة الشجرة tree , او مش عارف يمكن اسمة recursive

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

post-37582-1212953784_thumb.jpg

والذي يعبر عن الجدول الذي قمت انت بوضعه ..

اقتباس
ممكن توضيح عن المتغير الي بتبعتوا,

لو تلاحظ , اول الاستدعاء يتم من خلال السطر التالي :

 tree(NULL,0);

حيث ان NULL , تعبرعن اول اب , او مايسمى بالجذر root , فالاب الرقم 1 في جدولك هو (فراغ) والذي يمثل NULL في MySQL ..

والصفر تعبر عن القيمة الاولية التي تستخدم لعملية ازاحه الـ nodes , فكل ماتعمقت داخل الشجرة , كل مازادت هذه القيمة بواحد .

تم تعديل هذه المشاركة بواسطة محمد معاشر في 8 يونيو 2008 في 22:44 — السبب: خطأ مطبعي ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#12

السلام عليكم

شكرا لك اخي محمد جزيل الشكر, فعلا , الكود اشتغل بشكل جيد , و قمت باضافتة لقاعدة البيانات الي عندي, و هي فيها شي اكتر من 3000 record.

لكن في عندي ملاحظة بالنسبة ل loop , يعني مثلا :

انا بدي ابعت رقم رسالة 1 SEQ_ID = 1 كمتغير من صفحة البحث, و هي مرتبط في الرسائل رقم 2 , 3 . 4 . Refere_ID = 2 , 3

فأذا بعتنا P_id = 1 $ لازم فقط يرجعلي الرسائل المرتبطة فيها فقط و هم 1 بالاضافة الى , 2. 3 4

و تتوقف while loop.

الي بيسير معي اني بحصل على Infinite loop

كيف ممكن احل هالمشكلة.

توضيح

رسالة رقم	 رقم الرسالة المرتبط   
   1					--
   2					1
   3					2
   4					3
الشكل:
1
...   2  
......	 3  
.........		4
5					 --
6					  --
7					  6

الان, انا بحاجة لطباعة التابع للرسالة رقم 1 , وهم حسب الشجرة السابقة , 1 بالاضافة , 2 , 3 , 4 . ثم يجب ان تنتهي loop

ما يحدث معي, انة يعطي Infiniti loop . كيف يمكن ان استفيد من level حتى اوقف loop او غير ذلك.

بس في شي مش واضح الي , انوا ليش level بنجمعلوا 1 level + 1

الكود رائح , و انصح بالاستفادة من هاي الافكار .

مشكورين جدا جداجدا , بعرف عم بنغلبكم معنا..

محمد

تم تعديل هذه المشاركة بواسطة Mohammad Hussein في 10 يونيو 2008 في 10:53

#13

اخي الكريم , لا ادري اي كود بالضبط تطبق ؟

اللي فهمته من كلامك , انك تريد كل المتعلقات بالرقم واحد , والتي هي الارقام :2و3و4و7 .

الان لكن تحقق ذلك , قم باستدعاء الداله tree , كالتالي :

tree(1,0);

والنتيجه هي :

post-37582-1213133209_thumb.jpg

اليست هي المطلوب ؟

اقتباس
بس في شي مش واضح الي , انوا ليش level بنجمعلوا level + 1

لكي , نستطيع زيادة طول الفراغ , حيث انه لاحظ اننا نستخدم متغير level في الداله :

str_repeat(' ',$level)

ومعناها تكرار الفراغ بحسب قيمة level , ففي البداية فراغ واحد , والابن يتم طباعته بفراغين بجانبه , وابن الابن بثلاث فراغات وهكذا ..

انا ارفقت لك الكود الذي عملته .

parent.zip

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#14

مشكور اخي محمد ما قصرت

يعني هاد موضوع tree مهم . حسب رأيي.

و استفدت منة كتير , و اشتغل معي,

لكن ملاحظة , هاد function بيمر على جميع البيانات المخزنة في الجدول الموجود في database.

سؤالي, اذا انا ببعت رقم رسالة محدد P_ID , parent ID , من صفحة اخرى, يتم استقبالة في هاد function,

حتى يطبع nodes المرتبطين فية .

كيف ممكن اوقف Loop , بحيث انها ما تلف في جميع Records تبع البيانات table

بس Loop بتلف بعدد nodes المرتبطين في Parent_Id الي انا ببعتوا

ايش ممكن اضيف شرط ل Loop ؟

بنغلبكم معنا

مشكوين جدا اخي محمد

و نتمنى الفائدة للجميع

#15
اقتباس
لكن ملاحظة , هاد function بيمر على جميع البيانات المخزنة في الجدول الموجود في database.

سؤالي, اذا انا ببعت رقم رسالة محدد P_ID , parent ID , من صفحة اخرى, يتم استقبالة في هاد function,

حتى يطبع nodes المرتبطين فية .

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

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

#16

فهمت عليك اخي محمد.

طيب كيف ممكن ابع رقم اب واحد فقط , و يرجعلي الابناء المرتبطين فية ؟

حاولت هيك , ضيفت break

function tree($p_id,$level) {
//Run the query
$sql="SELECT * FROM letters  where  refere_ID ".($p_id==Null ? 'IS NULL' : '='.$p_id);

$result=mysql_query($sql);

  while ( ($row=mysql_fetch_array($result))   ) {
  if($level == NULL ) // is Parent has no refere ID
  { break; }
	echo str_repeat(' ',$level).'|____'.$row[0]."\n";  echo "The Level # Is".$level;
	tree($row[0],$level+1);

	}

}
?>
<? 
tree(NULL,0);
?>

بنتمنى ما عم بنكون بنغلبكم في هاد النقاش , و جهدكم إن شاء الله مثابين علية.

مشكورين

\ محمد

#17
Mohammad Hussein كتب:
فهمت عليك اخي محمد.

طيب كيف ممكن ابع رقم اب واحد فقط , و يرجعلي الابناء المرتبطين فية ؟

حاولت هيك , ضيفت break

function tree($p_id,$level) {
//Run the query
$sql="SELECT * FROM letters  where  refere_ID ".($p_id==Null ? 'IS NULL' : '='.$p_id);

$result=mysql_query($sql);

  while ( ($row=mysql_fetch_array($result))   ) {
  if($level == NULL ) // is Parent has no refere ID
  { break; }
	echo str_repeat(' ',$level).'|____'.$row[0]."\n";  echo "The Level # Is".$level;
	tree($row[0],$level+1);

	}

}
?>
<? 
tree(NULL,0);
?>

بنتمنى ما عم بنكون بنغلبكم في هاد النقاش , و جهدكم إن شاء الله مثابين علية.

مشكورين

\ محمد

اعتقد انك تقصد انك تريد فقط طباعة ابناء اب معين , بدون الدخول في ابناء الابناء . اذا كان هذا ماتريد , اذاً , لاداعي لإستخدام الـ recursive . فقط قم بعمل استعلام للـ seq_id الذين لهم ref_id محدد ..

بالتوفيق ..

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

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

gazabigBanner.jpg

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

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