Отображение значений таблицы и их внешних ключей - PullRequest
0 голосов
/ 01 мая 2018

В моей базе данных три таблицы:

Предметы
- itemNumber (PK)
- название
- издание
- предмет

Доноры
- donorNumber (PK)
- donorName
- donorDepartment

Штрих-коды
- barcodeNumber (PK)
- дата добавлена ​​
- donorNumber (FK)
- itemNumber (FK)

В принципе, элемент может иметь много штрих-кодов, и это моя проблема, я пытаюсь отобразить такую ​​информацию на столе:

Заголовок: Заголовок предмета
Издание: 2-е издание
Тема: Компьютерное программирование
Имя донора: Джон Доу
Отдел доноров: Технология
Штрих-коды: 001, добавлено: 27.04.18
456, добавлено: 29.0418
734, добавлено: 29.0418
976, добавлено: 30.04.18

Однако, мой код дает мне это:

Заголовок: Заголовок пункта 1
Издание 2-е издание
Тема: Компьютерное программирование
Имя донора: Джон Доу
Отдел доноров: Технология
Штрих-коды: 001
Добавлено: 27/04/18

Заголовок: Заголовок предмета 1
Издание: 2-е издание
Тема: Компьютерное программирование
Имя донора: Джон Доу
Отдел доноров: Технология
Штрих-коды: 456
Добавлено: 29/04/18

Заголовок: Заголовок предмета 1
Издание: 2-е издание
Тема: Компьютерное программирование
Имя донора: Джон Доу
Отдел доноров: Технология
Штрих-коды: 734
Добавлено: 29/04/18

... и так далее.

Как я могу достичь своей цели? Во второй строке таблицы я хочу отобразить второй элемент вместо первого элемента со вторым штрих-кодом. Вот мой код:

<?php 

require "dbinfo.php"; 
//connects to database, returns $db  ($db=mysqli_connect($host, $user, $password) or die (mysqli_error()); )


$sql="SELECT Items.title, Items.edition, Items.subject, Items.course, Items.image, Barcodes.barcodeNumber, Barcodes.dateAdded, Donors.donorName, Donors.department FROM Barcodes INNER JOIN Items ON Barcodes.itemNumber = Items.itemNumber INNER JOIN Donors ON Barcodes.donorNumber = Donors.donorNumber ORDER BY title ASC";



$result = mysqli_query($db, $sql) or die (mysqli_error($db));

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

  $itemNumber = $row["itemNumber"]; 
  $title = $row["title"];
  $edition = $row["edition"];
  $donorNumber = $row["donorNumber"];
  $donorName = $row["donorName"];
  $barcodeNumber = $row["barcodeNumber"];
  $dateAdded = $row["dateAdded"];


  echo "<table cellpadding = '10'>"; 
  echo"<tr align='left'>";

  echo "<td>$title";
  echo "Edition: $edition";
  echo "Subject: $subject";
  echo "Course: $course";
  echo "Department: $department";
  echo "Donor: $donorName";
  echo "Barcodes: $barcodeNumber ";
  echo "Added on: $dateAdded</td>";     

} 
?> 
</body> 
</html>

Конечно, я отображаю информацию на столе, но я впервые публикую здесь, и я не знаю, как показать свои теги.

Моей первой мыслью было создание второго запроса для получения только штрих-кодов, соответствующих значениям $ itemNumber, полученным в каждой строке:

$sql1 = "SELECT barcodeNumber FROM Barcodes WHERE Barcodes.itemNumber = $itemNumber"; 
result1 = mysqli_query($db, $sql1) or die (mysqli_error($db));

, а затем получить штрих-коды с оператором while

while ($row=mysqli_fetch_array($result1)){ 
     $barcodeNumber = $row["barcodeNumber"];
     echo $barcodeNumber;
     echo"<br />";
}

Но так как это не сработало, я прекратил попытки извлекать значения с добавленной датой таким образом.

Любой совет будет с благодарностью.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Я вставил второй цикл while после echo Barcodes: $barcodeNumber ";

$sql2 = "SELECT barcodeNumber FROM Barcodes WHERE Barcodes.itemNumber = '$itemNumber'";

$barcodeResult = mysqli_query($db, $sql2) or die (mysqli_error($db));

 while ($row = mysqli_fetch_assoc($barcodeResult)) {

     $barcode = $row["barcodeNumber"];
     echo $barcode;
     echo "<br />";
 }

echo "</td>";

$lastItem = $itemNumber; //Thank you Progman!! } }

echo"</tr>";

echo"</table>";

Я поместил свое состояние после первого и ниже времени получения значения itemNumber следующим образом:

$itemNumber = $row["itemNumber"]; if ($itemNumber!= $lastItem){

Большое спасибо за вашу помощь, и я надеюсь, что это работает для других людей, которые сталкиваются с той же проблемой.

0 голосов
/ 01 мая 2018

Есть как минимум два способа сделать это.

Первое решение состоит в том, чтобы использовать ОДИН запрос и проверять внутри цикла while с помощью оператора if, когда «элемент» был изменен с последней итерации. Псевдокод будет выглядеть так:

while($row = mysqli_fetch_assoc($result)) {
    if($row['itemid'] != $lastId) {

        // new item, create new html row
        echo "</tr>\n"; // close the previous one
        echo "<tr>\n"; // start the new one
        echo "    <td>".$row['whatever']."</td>\n";
        echo "    <td>".$row['data']."</td>\n";
        echo "    <td>".$row['you']."</td>\n";
        echo "    <td>".$row['want']."</td>\n";
        echo "    <td>";

        $lastId = $row['itemid'];
    }
    echo "barcode stuff";
}

Поэтому в нужный момент, когда вы получаете новый идентификатор элемента, вы очищаете таблицу / строку текущего элемента и открываете новую таблицу / строку для нового элемента.

Второе решение - использовать ДВА запроса. Один запрос для элемента и другой для штрих-кодов. Таким образом, у вас есть один внешний цикл while для элемента и один внутренний цикл while для штрих-кодов. Псевдокод выглядит так:

 while($row = mysqli_fetch_assoc($result)) {
     // output item data stuff here

     $barcodesResult = SELECT barcode columns FROM barcodes WHERE barcode belongs to item;

     while($barcode = mysqli_fetch_assoc($barcodesResult)) {
         echo $barcode;
     }
 }
...