PHP - эхо-данные из таблиц, используя их взаимосвязь

Добрый день :)

У меня есть 2 таблицы - одна содержит основные заголовки, а другая - подзаголовки и связанные абзацы, которые связаны с внешним ключом на TitleID и LinkID, как показано здесь:

PHP - эхо-данные из таблиц, используя их взаимосвязь

Идея состоит в том, что я создаю несколько разделов, содержащих основные заголовки - из sectionamain со связанным субконтентом из sectiona, связанным через LinkID и TitleID.

<?php
function confirm_query($result_set) {
        if (!$result_set) {
            die("Database query failed.");
        }
    }


function get_practices() {
    global $connection;
  $query = "SELECT * FROM sectionamain ";
    $query .= "LEFT JOIN sectiona ";
    $query .= "ON sectiona.HeadingID = sectionamain.TitleID ";
    $query .= "ORDER BY sectionamain.TitleID ASC";
    $A_list = mysqli_query($connection, $query);
    confirm_query($A_list);
    return $A_list;    
}



function display_practices() {
    $output = "<div class=\"container inner\">\n";
   $A_set = get_practices();
   while ($list_A = mysqli_fetch_assoc($A_set)) {
     $output .= "<div class=\"info\">\n";
   $output .= "<div class=\"wrap\">\n";
       $output .= "<h1 class=\"showcontent\" id = ";
       $output .= "". htmlentities($list_A["TitleID"]) ."";
       $output .= ">";       
       $output .= htmlentities($list_A["MainTitle"]);
       $output .= "</h1>\n";
       $output .= "<div class=\"content\" id=\"content".htmlentities($list_A["TitleID"]) ."\">\n";

       *** code would go here - 
       put items from sectiona with LinkID = 1 where TitleID = 1, etc until all data is sorted 
         $output . = "</div>\n</div>\n</div>\n";   

    };
     mysqli_free_result($A_set);
    $output .= "</div>\n";
       return $output;
}
?>

The end result would be something as shown below: 
<h1>Main Title 1</h1>
<h3>Sub 1 with LinkID 1<h1>
<h3> ... </h3>
<h3>Sub n with LinkID 1</h3>

... 
<h1>Main Title n</h1>
<h3>Sub 1 with LinkID n<h1>
<h3> ... </h3>
<h3>Sub n with LinkID n</h3>

заранее спасибо хх

Спасибо, что поделились своей историей! Есть ли у вас актуальный вопрос или вы просто хотите сообщить нам о своем прогрессе?

GolezTrol 18.06.2018 23:40

В чем проблема ?

Ulrich Dohou 18.06.2018 23:41

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

ChriChri 18.06.2018 23:45

Ваш запрос неоднозначен в инструкции select. Вместо использования подстановочного знака укажите, какие именно поля вы хотите извлечь. Я напишу ответ.

Tim Morton 19.06.2018 00:24

О, если подумать, это может не быть проблемой. По-прежнему рекомендуется указывать, к каким полям вы хотите получить доступ. Можете ли вы получить результаты любой из БД?

Tim Morton 19.06.2018 00:45

@TimMorton - я буду использовать большинство результатов из моей таблицы.

ChriChri 19.06.2018 17:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
49
1

Ответы 1

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

<?php
function get_practices() {
    global $connection;

    // It's good practice to specify which fields you want to get from the database.
    // for clarity, I'm using heredoc format. 
    $query = >>>SECTIONAQUERY

SELECT am.TitleID, am.MainTitle, a.HeadingID, a.title, a.content  
FROM sectionamain am
LEFT JOIN sectiona a
ON a.HeadingID = am.TitleID 
ORDER BY sectionamain.TitleID ASC

SECTIONAQUERY;

    $A_list = mysqli_query($connection, $query);
    confirm_query($A_list);
    return $A_list;    
}

/**
 * group_items 
 *
 * takes database results and groups them by ID
 *
 * @param mysqli_result
 * @return array
 */
function group_items($db_results) {
  $data = array();
  while($row = mysqli_fetch_assoc($db_results)) {
    $title_id = htmlentities($row['TitleID']);

    // group Main Title by title id
    $data[$title_id]['title'] = htmlentities($row['MainTitle']);

    // group data by title id
    $data[$title_id]['data'][] = array(
      'HeadingID' => htmlentities($row['HeadingID']),
      'title'     => htmlentities($row['title']),
      'content'   => htmlentities($row['content'])
      );
  }

  return $data;
}

Тогда, на ваш взгляд, у вас могло бы получиться что-то вроде этого:

<?php 
$A_list = get_practices();
$data = group_items($A_list);

// or, alternatively, $data = group_items(get_practices());

// now, go into "html mode" instead of in PHP, 
// using PHP only for looping and variable substitution:
?>
<html>
<head>
...
</head>
<body>
  <div>Your header stuff</div>
  <div class = "info">
    <div class = "wrap">
      <?php foreach($data as $row): ?>
        <h1 class = "showcontent" id = "<?= $row['title'] ?>"></h1>
        <?php foreach($row['data'] as $sub_row): ?>
          <h3><?= $sub_row['title'] ?></h3>
          <div class = "content"><?= $sub_row['content'] ?></div>

          <!-- bonus: link to a new page? -->
          <div><a href = "detail_page.php?id=<?= $sub_row['HeadingID'] ?>"><?= $sub_row['title'] ?></a></div>

        <?php endforeach; ?>
      <?php endforeach; ?>
    </div>
  </div>
</body>
</html>

Заметьте, я лично не стал бы вставлять вывод в функцию; это смешение логики и презентации. Используя встроенные шаблоны PHP, вам не нужно беспокоиться об экранировании кавычек. Просто используйте синтаксис <?= ?> для добавления переменных PHP. Используйте оператор include вместо вызова функции. (или вы всегда можете использовать функцию include в частичном представлении.)

Надеюсь, это ответ на ваш вопрос!

По какой-то причине $ row ['HeadingID'] выдает неопознанную ошибку индекса.

ChriChri 19.06.2018 22:11

сделайте var_dump($row), чтобы увидеть, как ему следует назвать. Похоже на опечатку.

Tim Morton 19.06.2018 23:04

Я сделал это, но до сих пор возникают проблемы. Но в остальном я заставил это работать. :)

ChriChri 24.06.2018 17:20

Другие вопросы по теме