اذهب إلى المحتوى

السؤال

نشر

سلام عليكم

ارهقت الاساتذة بأسالتي الكثيرة و لكننا نتعلم منكم

السؤال ببساطة

عندي 3 جداول 

الاول suppliersdb  و يحتوي على بيانات الموردين 

الثاني supplying_items و يحتوي على بيانات بنود التوريد بشكل عام و التي يقوم المستخدم بتغذيتها في هذا الجدول

حين يقوم المستخدم بادخال مورد فمن الطبيعي ان يختار له بنود توريد ، و لكي يختار يتم فتح قائمة منسدلة له محتواها هو جدول supplying_items ( جميع بنود التوريد)

و حين يضغط على حفظ يقوم النظام بتسجيل بنود هذا المورد فقط في الجدول الثالث باسم supply_item

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

1.thumb.png.b4149c3b7e687c0a3d2cd5443897897c.png

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

2.thumb.png.fb16f8eb3bb829fc3489a907ad435703.png

مع العلم اني جربت الاستعلام على قاعدة البيانات و اشتغل حلو 

3.thumb.png.4b3011f4bb138cc94e608c7d92a38bea.png

 

و ده الكود بتاعي

 

<div class="table-responsive">
<table class="table table-primary table-bordered" dir="rtl" id="result">
  <thead>
    <tr align="center">
      <th scope="col">الكود</th>
      <th scope="col">اسم الشركة</th>
      <th scope="col">بنود التوريد</th>
	      <th scope="col">إعدادات</th>
    </tr>
  </thead>
  
  <tbody>
<?php

//الاستعلام
$result = $conn->query("SELECT * FROM suppliersdb ORDER BY id DESC");
// تعريف المتغيرات


while ($row = $result->fetch_assoc()) {
//تعريف بنود التوريد
$id = $row['id'];
$username= $row['username'];
//نهاية تعريف بنود التوريد	
?>

<tr class="table-light" align="center">
<td scope="row"><?php echo  $row['id'];  ?></td>
<td ><?php  echo $row['username']; ?></td>
  <!-- بنود التوريد -->  
 <td>
      
<select class="form-select form-select-lg mb-3" aria-label="بنود التوريد">
<option selected>افتح لمشاهدة بنود التوريد</option>
 <?php 

 $sql = "SELECT `supplying_items`.`id` AS idtotal, `supplying_items`.`name` AS nametotal, `supplier_id` AS sid , `supply_item`.`item` AS sitem, `suppliersdb`.`id` AS suppliersmainID FROM `supplying_items`, `supply_item`, `suppliersdb` WHERE `supply_item`.`item` = `supplying_items`.`id` && `suppliersdb`.`id` = $id"; 
 while ($m = $result->fetch_assoc()) {

    $nametotal = $m['nametotal'];
      
      echo '<option selected>' .  $m['nametotal'] . '</option>';
 }
 ?>

      </select>

      
      </td>


	     <td align="center">
		  <button username="'. $row['username'].'" oName="'.$row['owner_name'].'" address="'.$row['address'].'" phone="'.$row['phones'].'" whatsapp="'.$row['ownerWhatsapp'].'"  email="'.$row['email'].'" website="'.$row['website'].'"     class="btn btn-outline-primary m-auto mt-2 more" data-toggle="modal" data-target="#more">عرض المزيد</button>
		 <!-- زر التعديل -->
		 <a href="edit_supplier.php?id=' . $row['id'] . '" target="_blank">
		 <button  type="button" class="btn btn-primary">تعديل</button></a>
		 <!-- زر الحذف -->
		 <button type="button" supplier="' . $row['id'] . '" class="btn btn-danger delete">حذف</button>
		


		 
		 
		 </td>
    </tr>

 <?php
}
?>

    
	  </tbody>
	  </table>
	  
</div>

 

ما الذي ينبغي علي فعله

Recommended Posts

  • 2
نشر

السبب ربما عدم استدعاء الاستعلام الثاني:

 <?php

 $sql = "SELECT `supplying_items`.`id` AS idtotal, `supplying_items`.`name` AS nametotal,
`supplier_id` AS sid , `supply_item`.`item` AS sitem, `suppliersdb`.`id` AS suppliersmainID
FROM `supplying_items`, `supply_item`, `suppliersdb` WHERE `supply_item`.`item` = `supplying_items`.`id`
&& `suppliersdb`.`id` = $id";

 while ($m = $result->fetch_assoc()) {
     $nametotal = $m['nametotal'];

     echo '<option selected>' . $m['nametotal'] . '</option>';
 }
 ?>
  • لاحظ لا يتم تنفيذ الاستعلام sql$.
  • استخدم متغير آخر غير result للاستعلام الثاني. لأن الحلقتين متداختلين، فتخزين قيمة في متحول النتيجة الأولى يخرب القيم.
  • عدم تنفيذ الاستعلام لا يقوم بتبديل العنصر وبالتالي يجلب عنصر وحيد.
  • 0
نشر

طيب هاتعبك معايا معلش نمشي سوا خطوة خطوة سامحني

لانها مش ظابطة معايا نهائي لقلة خبرتي

الان انا حطيت استعلامين بسيطين كالتالي ، ابدأ بس اجيب بيهم البيانات و بعدين اشوف هافلتر ازاي

الاستعلام كالتالي

$result = $conn->query("SELECT * FROM suppliersdb ORDER BY id DESC");

$result1 = $conn->query("SELECT * FROM supplying_items ");

 

و الكود كالتالي

<table class="table table-primary table-bordered" dir="rtl" id="result">
  <thead>
    <tr align="center">
      <th scope="col">الكود</th>
      <th scope="col">اسم الشركة</th>
      <th scope="col">بنود التوريد</th>
	      <th scope="col">إعدادات</th>
    </tr>
  </thead>
  
  <tbody>
<?php

//الاستعلام
$result = $conn->query("SELECT * FROM suppliersdb ORDER BY id DESC");
$result1 = $conn->query("SELECT * FROM supplying_items ");
// تعريف المتغيرات


while ($row = $result->fetch_assoc()) {
//تعريف بنود التوريد
$id = $row['id'];
//$username= $row['username'];
//نهاية تعريف بنود التوريد	
?>

<tr class="table-light" align="center">
<td scope="row"><?php echo  $row['id'];  ?></td>
<td ><?php  echo $row['username']; ?></td>
  <!-- بنود التوريد -->  
 <td>

<select class="form-select form-select-lg mb-3" aria-label="بنود التوريد">
<?php

$ro = mysqli_num_rows($result1);

 while ($ro = $result1->fetch_assoc()) {     

    echo "<option value='". $ro['id'] ."'>" .$ro['name'] ."</option>" ;
 }
     ?>

      </select>

      
      </td>


	     <td align="center">
		  <button username="'. $row['username'].'" oName="'.$row['owner_name'].'" address="'.$row['address'].'" phone="'.$row['phones'].'" whatsapp="'.$row['ownerWhatsapp'].'"  email="'.$row['email'].'" website="'.$row['website'].'"     class="btn btn-outline-primary m-auto mt-2 more" data-toggle="modal" data-target="#more">عرض المزيد</button>
		 <!-- زر التعديل -->
		 <a href="edit_supplier.php?id=' . $row['id'] . '" target="_blank">
		 <button  type="button" class="btn btn-primary">تعديل</button></a>
		 <!-- زر الحذف -->
		 <button type="button" supplier="' . $row['id'] . '" class="btn btn-danger delete">حذف</button>
		


		 
		 
		 </td>
    </tr>

 <?php
}
?>

    
	  </tbody>
	  </table>

كده المفروض انه عادي جدا يجيبلي كل البنود اللي ف جدول التوريد لكن النتيجة كالتالي

4.thumb.png.909165b3aec4479dc0962882f51a0767.png

 

زي ما حضرتك شايف كده الاستعلام بتاع اسم المورد بيظهر عادي 

لكن محتوى بنود التوريد لا تظهر الا في اخر شركة مسجلة زي ما في الصورة

ايه غلطي هنا؟

بعد ما اعرف غلطي و اجيب الداتا بتاعه بنود التوريد بشكل كامل من جدولها الخاص بها

الخطوة اللي بعدها اجيب الداتا بتاعة بنود التوريد الخاصة بالمورد فقط 

 

  • 1
نشر
بتاريخ 10 دقائق مضت قال محمد المصري5:

بعد ما اعرف غلطي و اجيب الداتا بتاعه بنود التوريد بشكل كامل من جدولها الخاص بها

لاحظ هذا الجزء:

<?php

/// لا داع له $ro = mysqli_num_rows($result1);

while ($ro = $result1->fetch_assoc()) {     

	echo "<option value='". $ro['id'] ."'>" .$ro['name'] ."</option>" ;
}
?>

عند استخدام الدالة fetch_assoc ستقوم بالمرور على العناصر مرة واحدة.

حاول كتابة استعلام بسيط، مثل التالي:

<?php
$mysqli = new mysqli('localhost', 'root', '', 'my_db');

if ($mysqli->connect_errno) {
    echo 'Failed to connect to MySQL: ' . $mysqli->connect_error;
    exit();
}

$sql = 'SELECT Lastname, Age FROM Persons ORDER BY Lastname';
$result = $mysqli->query($sql);

// Associative array
while ($row = $result->fetch_assoc()) {
    printf("%s (%s)\n", $row['Lastname'], $row['Age']);

}
while ($row = $result->fetch_assoc()) {
    printf("%s (%s)\n", $row['Lastname'], $row['Age']);
}

// Free result set
$result->free_result();

$mysqli->close();
?>

لجدول يحوي حقلين، اسم و عمر مثلا.. إن احتوى الجدول على 3 عناصر الحلقتين ستطبعان 3 عناصر فقط وهو نانج الحلقة الأولى.

الحل:

اجعل الاستعلام الثاني ديناميكي، أي يجب جلب بنود التوريد التي تتبع للشركة الأولى.

في قاعدة البيانات، تضيف حقلا في جدول التوريدات يمثل رقم الشركة، ثم لكل شركة من الحلقة الأولى تقوم بعمل استعلام يجلب بنود التوريد حسب تساوي حقل id من الاستعلام الأول و company_id مثلا (الشركة التابعة للمورد وهو الحقل الذي ستضيفه).

بهذا الشكل:

result1 = select * company

while ( row1 = fetch (resutl) {
	$id = row1 [id]
	result2 = select supplyer_data where company_id = $id
	
	while ( row2 = fetch (resut2) {
		// print your select
	}
}

تأكد أن الحلقة الثانية تقوم بطبعة القائمة المنسدلة في نفس الخلية من الجدول.

  • 0
نشر

طيب لو انا وضعت حقل في جدول التوريدات 

منا عندي كذا شركة ممكن تختار نفس البند التوريد 

يعني مثلا عندي بند القماش

و جنبه حقل company_id مثلا يتسجل فيه اي دي الشركة و ليكن شركة محمد

و الاي دي بتاعها 1 ، يبقى اتسجل عندي في  company_id رقم 1

طيب لو شركة احمد اللي الاي دي بتاعها 2 مثلا حبت تختار القماش 

هايسجلها ازاي بقا في حقل  company_id و هو اصلا متسجل فيه قبل كده رقم 1 الخاص بمحمد

رقم 2 بقا هايتسجل فين ؟

 

ثانيا انا غيرت دالة fetch_array  و جربت كل شئ من المانيوال

نفس النتيجة

 

 

 

  • 1
نشر
بتاريخ 33 دقائق مضت قال محمد المصري5:

هايسجلها ازاي بقا في حقل  company_id و هو اصلا متسجل فيه قبل كده رقم 1 الخاص بمحمد

هذه علاقة "الكثير ل الكثير" أو many to many حيث يتم إسقاطها بجدول ثالث يحوي حقل لرقم للشركة و حقل لرقم المورد. بعد جلب بيانات هذا الجدول تقوم بتجميعهم عن طريق group by حسب رقم الشركة ثم تعرض النتائج.

  • 1
نشر
بتاريخ 3 دقائق مضت قال محمد المصري5:

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

و انا من ناحيتي هدور برضه

تعبتك معايا

ابحث في w3schools عن many to many SQL relationship.

إن بناء قاعدة البيانات هو أهم مرحلة في المشروع فالبناء الصحيح يسهل عمل الاستعلامات وينظم الأمور.

  • 1
نشر (معدل)
<div class="table-responsive">
  <table class="table table-primary table-bordered" dir="rtl" id="result">
    <thead>
      <tr align="center">
        <th scope="col">الكود</th>
        <th scope="col">اسم الشركة</th>
        <th scope="col">بنود التوريد</th>
        <th scope="col">إعدادات</th>
      </tr>
    </thead>

    <tbody>
      <?php

      //الاستعلام
      $result = $conn->query("SELECT * FROM suppliersdb ORDER BY id DESC");
      // تعريف المتغيرات


      while ($row = $result->fetch_assoc()) {
        //تعريف بنود التوريد
        $id = $row['id'];
        $username= $row['username'];
        //نهاية تعريف بنود التوريد	
      ?>

      <tr class="table-light" align="center">
        <td><?php echo  $id;  ?></td>
        <td><?php  echo $username; ?></td>
        <!-- بنود التوريد -->  
        <td>
		<?php $fetchSitems = $conn->query("SELECT * FROM `supplying_items` WHERE `sid` = '".$id."'"); ?>
          <select class="form-select form-select-lg mb-3" aria-label="بنود التوريد">
            <option selected disabled>افتح لمشاهدة بنود التوريد</option>
            <?php 
			foreach($fetchSitems as $item){
              echo '<option value="'.$item['nametotal'].'">'.$item['nametotal'].'</option>';
            }
            ?>
          </select>
        </td>
        <td align="center">
          <?php
          echo '<button username="'. $row['username'].'" oName="'.$row['owner_name'].'" address="'.$row['address'].'" phone="'.$row['phones'].'" whatsapp="'.$row['ownerWhatsapp'].'" email="'.$row['email'].'" website="'.$row['website'].'" class="btn btn-outline-primary m-auto mt-2 more" data-toggle="modal" data-target="#more">عرض المزيد</button>';
          // زر التعديل
          echo '<a href="edit_supplier.php?id='.$row['id'].'" target="_blank">'.
            '<button type="button" class="btn btn-primary">تعديل</button>'.
          '</a>';
          // زر الحذف
          echo '<button type="button" supplier="'.$row['id'].'" class="btn btn-danger delete">حذف</button>';
        ?>
        </td>
      </tr>
      <?php
      }
      ?>
    </tbody>
  </table>
</div>

 

مرحبا، جرب الكود هذا أخي من المفروض يعمل بالشكل المطلوب

موفق إن شاء الله

تم التعديل في بواسطة أمينة بوشفة
  • 0
نشر

الله ينور عليكي يا رب دنيا و اخره

فعلا الكود ضبط لكن الان بحاجة فقط لضبط الاستعلام عشان اخد النتيجة المضبوطة

2021-06-05_15-44-02.jpg.59e1d97711e98408f561f1d6cf1f7c04.jpg

انا عندي 3 جداول بالشكل السابق و معلوماتهم كالتالي

`supplying_items`, /* جدول بنود التوريد بالكامل اسم-رقم  */

`supply_item`, /* جدول بنود التوريد الخاصة بالمورد  رقم المورد - رقم بند التوريد  */

`suppliersdb` /* جدول اسماء الموردين - رقم المورد  */

و الاستعلام اللي انا كتبته و اشتغل معايا كالتالي

SELECT 

`supplying_items`.`id` AS idtotal, /* حدد رقم بنود التوريد  */

`supplying_items`.`name` AS nametotal, /* اسم بند التوريد  */

`supply_item`.`supplier_id` AS sid , /* تحديد رقم المورد من جدول بنود التوريد الخاصة بالموردين فقط*/


`supply_item`.`item` AS sitem, /* رقم بنود التوريد الخاصة بالموردين فقط  */

`suppliersdb`.`id` AS suppliersmainID /* رقم الموردين بشكل عام */

FROM

`supplying_items`, /* جدول بنود التوريد بالكامل اسم-رقم  */

`supply_item`, /* جدول بنود التوريد الخاصة بالمورد  رقم المورد - رقم بند التوريد  */

`suppliersdb` /* جدول اسماء الموردين - رقم المورد  */

WHERE 

`supply_item`.`item` = `supplying_items`.`id` /* لما رقم بند التوريد الخاص بالمورد يساوي رقم بند التوريد في جدول بنود التوريد  */

&&

`supply_item`.`supplier_id` = `suppliersdb`.`id` /* الشرط الثاني لما اي دي المورد في جدول بنود التوريد يوافق رقمه في جدول الموردين */

&&

`suppliersdb`.`id` = $id /* تحديد رقم المورد الذي سيتم اظهار بياناته  */

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

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...