Aby bezpośrednio rozwiązać problem (omówię więcej za chwilę), przeglądasz pełną listę urządzeń i następnie - po przejrzeniu ich wszystkich w pętli próbujesz je wyświetlić. Z tego powodu wyświetlasz tylko ostatnie urządzenie, które zostało dotknięte.
Twój obecny kod, skrócony, to:
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;
}
...
}
Jeśli rozumiem, co próbujesz zrobić, musisz zapisać każde urządzenie w tablicy „devices” i przejść przez nią podczas każdej iteracji twojego for
pętla. Wypróbuj coś takiego:
$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;
...
}
Bardziej elegancki sposób na wykonanie tego samego zadania można wykonać za pomocą ustartlocation
jako indeks tablicy, ale będzie to wymagało, aby ustartlocation
jest unikalny dla pojedynczego urządzenia/serwera:
$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');
...
}
Ta metoda zmniejszy potrzebę przeglądania listy urządzeń za każdym razem, ale znowu - wymaga, aby ustartlocation
jest wyjątkowy.
Uwagi poboczne (dodatkowe, niespecyficzne krytyki)
-
Na początku kodu wykonujesz
$sql_devices="SELECT * FROM
urządzenia";
i$result_devices=mysql_query($sql_devices);
, ale nigdy nie używaj tego obiektu. Może i powinien zostać usunięty, ponieważ jest to jedno dodatkowe (dość ciężkie) zapytanie. -
W drugim
while
-pętla masz linię$num_devices=mysql_numrows($result_devices);
. Nie ma funkcji PHPmysql_numrows()
, uważam, że jest to literówka dlamysql_num_rows()
funkcja (lub masz napisaną przez siebie funkcję, która robi to samo. Również$num_devices
zmienna nigdy nie jest używana, więc ta linia może zostać całkowicie usunięta. -
Używasz starego i staje się przestarzałe
mysql_
funkcji (sprawdź komunikat ostrzegawczy na górze dowolnej strony z dokumentacją dla tych funkcji; otomysql_connect()
na przykład). Podobnie jak społeczność, polecam uaktualnienie domysqli_
lubPDO
metody. -
Twój kod jest otwarty na błędy nieoczyszczonego języka SQL, nie ograniczając się konkretnie do wstrzykiwania SQL, ponieważ nie wydaje się, że pobierasz dane wejściowe bezpośrednio z danych wejściowych użytkownika, ale także nie wyklucza tego czynnika. Na przykład, co by się stało, gdyby
szafka
lubcentrum danych
wartość zawierała pojedynczy cudzysłów? Ponieważ używaszmysql_
metod, sugeruję zawinąć każdą zmysql_real_escape_string()
przed użyciem ich w bazie danych wywołuje:$sql_cabinets="SELECT * FROM Cabinets WHERE datacenter ='" . mysql_real_escape_string($datacenters_sqlrow[0]) . „” ZAMÓW WEDŁUG numeru szafy”;