Заполнение таблицы HTML с данными MySQL (несколько запросов)

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

Цель: создать веб-страницу, отображающую таблицу HTML с 5 столбцами (состояние порта, L1, статус L2, ошибки фрейма, активные вызовы). Дата для каждого из этих столбцов хранится в одной таблице базы данных, и вот трюк, большинство из этих данных из одного поля … это означает, что мне нужно создать 5 разных запросов. Я попытался создать один запрос (который, я считаю, будет работать, если бы мог), но я не могу.

Результаты: таблица с результатами только 5-го запроса и остальной частью таблицы повторно заполняется только 1-м запросом.

Вот мой код:

<!-- Simple HTML to Create the table layout --> <table border=1 style="background-color:#F0F8FF;" > <caption><EM>HEADER</EM></caption> <tr> <th>Port</th> <th>L1 Status</th> <th>L2 Status</th> <th>Framing Errors</th> <th>Active calls</th> </tr> <!-- END Simple HTML to Create the table layout --> <?php $server = "localhost"; $dbname = "database"; $user = "user"; $password = "password"; $con = mysql_connect($server,$user,$password) or die (mysql_error()); mysql_select_db($dbname) or die (mysql_error()); $query1="select right(name, 10) as 'Port' from items where hostid = (select hostid from hosts where name = 'MIAGATE01') and key_ like '%activeChannels[%' and key_ not like '%SNMPINDEX%' order by name"; $query2="select lastvalue as 'Layer1' from items where hostid = (select hostid from hosts where name = 'MIAGATE01') and key_ like '%statusLayer1[%' and key_ not like '%SNMPINDEX%' order by name"; $query3="select lastvalue as 'Layer2' from items where hostid = (select hostid from hosts where name = 'MIAGATE01') and key_ like '%statusLayer1[%' and key_ not like '%SNMPINDEX%' order by name"; $query4="select lastvalue as 'Framing_Errors'from items where hostid = (select hostid from hosts where name = 'MIAGATE01') and key_ like '%frameErrors[%' and key_ not like '%SNMPINDEX%' order by name"; $query5="select lastvalue as 'Active_Calls' from items where hostid = (select hostid from hosts where name = 'MIAGATE01') and key_ like '%activeChannels[%' and key_ not like '%SNMPINDEX%' order by name"; $result1=mysql_query($query1) or die(mysql_error()); $result2=mysql_query($query2) or die(mysql_error()); $result3=mysql_query($query3) or die(mysql_error()); $result4=mysql_query($query4) or die(mysql_error()); $result5=mysql_query($query5) or die(mysql_error()); while($row1 = mysql_fetch_array($result1)){ while($row2 = mysql_fetch_array($result2)){ while($row3 = mysql_fetch_array($result3)){ while($row4 = mysql_fetch_array($result4)){ while($row5 = mysql_fetch_array($result5)){ echo "<tr>"; echo "<td>" . $row1['Port'] . "</td>"; echo "<td>" . $row2['Layer1'] . "</td>"; echo "<td>" . $row3['Layer2'] . "</td>"; echo "<td>" . $row4['Framing_Errors'] . "</td>"; echo "<td>" . $row5['Active_Calls'] . "</td>"; echo "</tr>"; } } } } } mysql_close($con); ?> 

Сначала попробуйте этот запрос и убедитесь, что он сразу получил все ваши требуемые результаты.

 SELECT h.hostid, RIGHT(port.name,10) AS 'Port', l1.lastvalue AS 'Layer1', l2.lastvalue AS 'Layer2', fe.lastvalue AS 'Framing_Errors', ac.lastvalue AS 'Active_Calls' FROM hosts h INNER JOIN items port ON port.hostid = h.hostid AND port.key_ LIKE '%activeChannels[%' AND port.key_ not LIKE '%SNMPINDEX%' INNER JOIN items l1 ON l1.hostid = h.hostid AND l1.key_ LIKE '%statusLayer1[%' AND l1.key_ not LIKE '%SNMPINDEX%' INNER JOIN items l2 ON l2.hostid = h.hostid AND l2.key_ LIKE '%statusLayer2[%' AND l2.key_ not LIKE '%SNMPINDEX%' INNER JOIN items fe ON fe.hostid = h.hostid AND fe.key_ LIKE '%frameErrors[%' AND fe.key_ not LIKE '%SNMPINDEX%' INNER JOIN items ac ON ac.hostid = h.hostid AND ac.key_ LIKE '%activeChannels[%' AND ac.key_ not LIKE '%SNMPINDEX%' WHERE h.name = 'MIAGATE01' ORDER BY h.name; 

Если это сработает, вам нужно всего лишь один цикл while, чтобы заполнить таблицу.

 while ( $row = mysql_fetch_array($result)) { echo "<tr>"; echo "<td>" . $row['Port'] . "</td>"; echo "<td>" . $row['Layer1'] . "</td>"; echo "<td>" . $row['Layer2'] . "</td>"; echo "<td>" . $row['Framing_Errors'] . "</td>"; echo "<td>" . $row['Active_Calls'] . "</td>"; echo "</tr>"; } 

Прежде всего:

У каждого ROW вашей предполагаемой таблицы HTML есть все пять элементов данных? Спрошенный по-другому, есть ли одна строка для каждого порта? Это не очевидно из вашего вопроса. Из вашей логики, конечно, возможно иметь различное количество вхождений разных параметров.

Во всяком случае … вам нужно объединить кучу виртуальных таблиц, содержащих hostid, параметр, чтобы собрать ваш дисплей. Я так думаю. (Ваши данные довольно сложны).

 select hostid.hostid, port.Port, layer1.Layer1, layer2.Layer2 from (select hostid, name from hosts where name = 'MIAGATE01' ) hostid left join (select hostid, right(name,10) as 'Port' from items where key_ like '%activeChannels[%' and key_ not like '%SNMPINDEX%' ) port on hostid.hostid = port.hostid left join (select hostid, lastvalue as 'Layer1' from items where key_ like '%statusLayer1[%' and key_ not like '%SNMPINDEX%' ) layer1 on hostid.hostid = layer1.hostid left join (select hostid, lastvalue as 'Layer2' from items where key_ like '%statusLayer2[%' and key_ not like '%SNMPINDEX%' ) layer2 on hostid.hostid = layer2.hostid order by hostid.name, port.Port 

Посмотрите, как это происходит? У вас много маленьких выборок, которые генерируют список объектов-хостов, элементов значения, где значения соответствуют вашим критериям выбора ключа. Затем вы присоединяетесь к этим всем вместе по своим значениям. Первый маленький выбор просто подходит для правильного хоста для конкретного хоста, которого вы хотите.

Я не выполнил все ваши параметры, но вам не сложно выполнить этот запрос. Что касается отладки его … трудно понять, не увидев таблицу ваших items во всей красе. Это может быть большой шарик. Но ты это уже знал.

Разве сетевое оборудование не загружает огромные бочки?