PHP - несколько SQL-запросов к HTML-таблице с использованием результатов поиска

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

В настоящее время я добиваюсь желаемого результата, используя следующий PHP, но мне кажется, что есть более эффективный метод, которого мне не хватает. Я также боюсь одновременных запросов и возможности того, что такой вовлеченный процесс будет занимать соединения. Хотя пользовательская нагрузка в любой момент не должна быть> 20.

Вот код, приветствуется любая критика или понимание! (Я все еще изучаю PHP на ходу, поэтому мой код, скорее всего, дерьмо в этом отношении!):

Схема таблицы (которая тоже нуждается в доработке - по сути, разработка лучшей структуры):

CREATE TABLE `EAM`(
    `EAM_ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `EAM_IPADDR` VARCHAR(15) NOT NULL, 
    `EAM_PORT` INT(5) NOT NULL,
    `EAM_STATE` VARCHAR(6) NOT NULL);

CREATE TABLE `ACTIVE`(
    `EAM_ID` INT NOT NULL,
    `ACTIVE_STATUS` VARCHAR(25) NOT NULL,
    `ACTIVE_TIME` TIME DEFAULT NULL,
    FOREIGN KEY (EAM_ID) REFERENCES EAM(EAM_ID));

CREATE TABLE `MAP_IMG` (
  `MAP_IMG_BLDG` varchar(25) NOT NULL,
  `MAP_IMG_ROOM` varchar(25) NOT NULL,
  `MAP_IMG_X` int(8) DEFAULT NULL,
  `MAP_IMG_Y` int(8) DEFAULT NULL,
  `MAP_IMG_ROOM_STATUS` varchar(10) NOT NULL DEFAULT 'NOTCLEAR');

CREATE TABLE `LOCATION`(
    `LOCATION_ROOM` VARCHAR(25) NOT NULL PRIMARY KEY,
    `LOCATION_BLDG` VARCHAR(25) NOT NULL,
    `EAM_ID` INT NOT NULL,
    `LOCATION_COMMENT` VARCHAR(250) DEFAULT NULL,
    FOREIGN KEY (EAM_ID) REFERENCES EAM(EAM_ID));

$dbQuery = "SELECT EAM_ID FROM LOCATION WHERE LOCATION_BLDG = 'LQ1'"; //TODO: Eventually make this 'LQ1' a variable for page selected.
$dbQueryResult = mysqli_query($dbConnection, $dbQuery) OR DIE("Bad Query: $dbQuery");

    echo "<table class='table table-striped'><thead>"; 
    echo "<tr><th>BUILDING</th>";
    echo "<th>ROOM NUMBER</th>";
    echo "<th>ROOM STATUS</th>";
    echo "<th>LAST UPDATE</th>";
    echo "<th>EAM IP ADDRESS</th>";
    echo "<th>EAM PORT</th></tr></thead>";

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

      $eamID = $row['EAM_ID']; //Assign EAM_ID from initial query to $eamID for use throughout subsequent queries.


      $dbq2 = "SELECT LOCATION_BLDG, LOCATION_ROOM FROM LOCATION WHERE EAM_ID = $eamID";
      $dbqr2 = mysqli_query($dbConnection, $dbq2) OR DIE("Bad Query: $dbq2");

      while($r2 = mysqli_fetch_assoc($dbqr2)) {

        echo "<tr><td>{$r2['LOCATION_BLDG']}</td>";
        echo "<td>{$r2['LOCATION_ROOM']}</td>";

      }

      $dbq2 = "SELECT ACTIVE_STATUS, ACTIVE_TIME FROM ACTIVE WHERE EAM_ID = $eamID";
      $dbqr2 = mysqli_query($dbConnection, $dbq2) OR DIE("Bad Query: $dbq2");

       while($r2 = mysqli_fetch_assoc($dbqr2)) {

         echo "<td>{$r2['ACTIVE_STATUS']}</td>";
         echo "<td>{$r2['ACTIVE_TIME']}</td>";

       }

      $dbq2 = "SELECT EAM_IPADDR, EAM_PORT FROM EAM WHERE EAM_ID = $eamID";
      $dbqr2 = mysqli_query($dbConnection, $dbq2) OR DIE("Bad Query: $dbq2");

       while($r2 = mysqli_fetch_assoc($dbqr2)) {

        echo "<td>{$r2['EAM_IPADDR']}</td>";
        echo "<td>{$r2['EAM_PORT']}</td></tr>";

       }
  }

Почему бы не использовать один запрос, объединяющий таблицы? Отредактируйте свой вопрос и добавьте схемы трех таблиц.

Sloan Thrasher 10.05.2018 16:18

Может быть лучше подходит для codereview

CD001 10.05.2018 16:19

Чтобы дополнить @SloanThrasher, взгляните на LEFT JOIN, INNER JOIN и связанные с ними "объединители таблиц"

Julian Koster 10.05.2018 16:19

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

Sloan Thrasher 10.05.2018 16:26
Стоит ли изучать 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
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

SELECT 
    a.`EAM_ID`,
    a.`LOCATION_BLDG`,
    a.`LOCATION_ROOM`,
    b.`ACTIVE_STATUS`,
    b.`ACTIVE_TIME`
FROM `LOCATION` a
LEFT JOIN `ACTIVE` b
ON a.`EAM_ID` = b.`EAM_ID`
LEFT JOIN `EAM` c
ON a.`EAM_ID` = c.`EAM_ID`
WHERE a.`LOCATION_BLDG` = 'LQ1'

Похоже, что каждый запрос внутри цикла должен возвращать данные, в противном случае HTML-таблица пользователя будет повреждена, поэтому здесь возможны ВНУТРЕННИЕ СОЕДИНЕНИЯ.

ethan 10.05.2018 16:29

Потрясающие. Спасибо за ответ и решение. Это намного лучше, чем многочисленные запросы в цикле. Также к вашему комментарию выше, как только я использую переменную в этом запросе, я обязательно буду использовать bind ()!

billybutthead 10.05.2018 16:30

Если вам нужны только строки с совпадающими строками в двух других таблицах, удалите ОСТАВИЛ в JOINS. Если это сработает, обязательно примите ответ.

Sloan Thrasher 10.05.2018 16:31

@ethan, можно ли здесь использовать mysqli_store_result, а затем получать доступ к данным через fetch_assoc или fetch_row? Может быть, сохранить их как объекты для доступа к ним?

billybutthead 10.05.2018 16:31

Вы можете извлечь все строки из запроса в связанный массив, а затем просмотреть их в цикле для вывода строк в вашей HTML-таблице. взгляните на mysqli_fetch_all

Sloan Thrasher 10.05.2018 16:33

@billybutthead Вы можете извлекать данные из запроса, как вам нравится. Мой комментарий состоял в том, чтобы просто предположить, что ваш запрос является хорошим кандидатом для ВНУТРЕННИХ СОЕДИНЕНИЙ, а не для ЛЕВЫХ СОЕДИНЕНИЙ. INNER JOIN намного производительнее, чем LEFT JOIN.

ethan 10.05.2018 16:34

Большое спасибо вам обоим! Хорошая копия внутри, а не слева.

billybutthead 10.05.2018 16:36

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