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

0

Я нашел похожие темы, но во многих результатах используется 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>";

       }
  }
  • 0
    Почему бы не использовать один запрос, который объединяет таблицы? Отредактируйте свой вопрос и добавьте схемы трех таблиц.
  • 0
    Может быть лучше подходит для codereview
Показать ещё 2 комментария
Теги:

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'
  • 0
    Похоже, что каждый запрос внутри цикла должен возвращать данные, в противном случае таблица HTML пользователя будет нарушена, поэтому здесь возможны ВНУТРЕННИЕ СОЕДИНЕНИЯ.
  • 0
    Потрясающие. Спасибо за ответ и решение. Это намного лучше, чем многочисленные запросы в цикле. Также к вашему комментарию выше, как только я использую переменную в этом запросе, я обязательно буду использовать bind ()!
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню