За да адресирате директно проблема (ще стигна до повече след малко), преглеждате пълния списък с устройства и след това - след като приключите с преминаването през всички тях - опитвате се да ги покажете. Поради това вие показвате само крайното устройство, което е докоснато.
Вашият текущ код, съкратен, е:
while($row = mysql_fetch_array($result_devices)) {
$server = $row['devicename'];
$ustart = $row['ustartlocation'];
}
for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {
$u = $cabinets_sqlrow[2] - $i;
...
if ($u == $ustart) {
echo $server;
}
...
}
Ако разбирам какво се опитвате да направите, ще трябва да съхраните всяко устройство в масив „устройства“ и да преминавате през него по време на всяка итерация на вашия for
цикъл. Опитайте нещо като:
$devices = array();
while($row = mysql_fetch_array($result_devices)) {
$devices[] = array(
'server' => $row['devicename'],
'ustart' => $row['ustartlocation']
);
}
for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {
...
$output = 'empty';
foreach ($devices as $device) {
if ($u == $device['ustart']) {
$output = $device['server'];
break;
}
}
echo $output;
...
}
По-елегантен начин за изпълнение на същата задача може да се направи с помощта на ustartlocation
като индекс на масива, но ще изисква ustartlocation
е уникален за отделно устройство/сървър:
$devices = array();
while($row = mysql_fetch_array($result_devices)) {
$devices[$row['ustartlocation']] = $row['devicename'];
}
for ($i = 0; $i < $cabinets_sqlrow[2]; $i++) {
...
echo (isset($devices[$u]) ? $devices[$u] : 'empty');
...
}
Този метод ще премахне необходимостта всеки път да преглеждате списъка с устройства, но отново - той изисква ustartlocation
е уникален.
Странични бележки (допълнителни, несвързани с конкретния отговор критики)
-
В началото на вашия код изпълнявате
$sql_devices="SELECT * FROM
устройства";
и$result_devices=mysql_query($sql_devices);
, но никога не използвайте този обект. Тя може и трябва да бъде премахната, тъй като е една допълнителна (сравнително тежка) заявка. -
Във втория
while
-loop имате реда$num_devices=mysql_numrows($result_devices);
. Няма PHP-функцияmysql_numrows()
, смятам, че това е правописна грешка заmysql_num_rows()
функция (това или имате персонализирана функция, която да прави същото нещо. Освен това$num_devices
променлива никога не се използва, така че този ред всъщност може да бъде напълно премахнат. -
Използвате стария и вече непрепоръчван
mysql_
функции (вижте предупредителното съобщение в горната част на която и да е от страниците с документи за тези функции; тук еmysql_connect()
за справка). Аз, както и общността, ви препоръчваме да надстроите доmysqli_код>
илиPDO
методи. -
Вашият код е отворен за несанитизирани SQL грешки, които не се ограничават конкретно до SQL инжектиране, тъй като не изглежда, че приемате вход директно от потребителския вход, но също така не изключва този фактор. Например, какво ще се случи, ако
шкаф
илицентър за данни
стойността съдържаше единични кавички? Тъй като използватеmysql_
предлагам да обвиете всеки сmysql_real_escape_string()
преди да ги използвате в базата данни извиква:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter ='" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ПОРЪЧАЙ ПО номер на шкаф";