Chcete-li problém přímo vyřešit (k více se dostanu za chvíli), procházíte úplným seznamem zařízení a pak - poté, co je všechny projdete, pokusíte se je zobrazit. Z tohoto důvodu zobrazujete pouze konečné zařízení, kterého jste se dotkli.
Váš aktuální kód, zkrácený, je:
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;
}
...
}
Pokud rozumím tomu, co se snažíte udělat, budete muset každé zařízení uložit do pole „devices“ a procházet je během každé iterace vašeho for
smyčka. Zkuste něco jako:
$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;
...
}
Elegantnější způsob, jak provést stejný úkol, lze provést pomocí ustartlocation
jako index pole, ale bude vyžadovat ustartlocation
je jedinečný pro jednotlivé zařízení/server:
$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');
...
}
Tato metoda upustí od nutnosti procházet seznam zařízení pokaždé, ale opět – vyžaduje, aby ustartlocation
je jedinečný.
Poznámky (dodatečné kritiky, které nejsou specifické pro odpověď)
-
Na začátku kódu spustíte
$sql_devices="SELECT * FROM
zařízení";
a$result_devices=mysql_query($sql_devices);
, ale nikdy tento objekt nepoužívejte. Může a měl by být odstraněn, protože je to jeden další (poměrně těžký) dotaz. -
Ve druhém
while
-loop máte řádek$num_devices=mysql_numrows($result_devices);
. Neexistuje žádná funkce PHPmysql_numrows()
, domnívám se, že se jedná o překlep promysql_num_rows()
funkce (nebo máte vlastní napsanou funkci, která dělá totéž. Také$num_devices
proměnná se nikdy nepoužívá, takže tento řádek lze ve skutečnosti zcela odstranit. -
Používáte starý a již zastaralý
mysql_
funkcí (pro tyto funkce se podívejte na varovnou zprávu v horní části kterékoli stránky dokumentu; zde jemysql_connect()
pro referenci). Já, stejně jako komunita, vám doporučuji upgradovat namysqli_
neboPDO
metody. -
Váš kód je přístupný nehygienickým chybám SQL, které nejsou konkrétně omezeny na vkládání SQL, protože se nezdá, že přijímáte vstup přímo z uživatelského vstupu, ale také tento faktor nevylučujete. Například, co by se stalo, kdyby
cabinet
nebodatacenter
hodnota obsahovala jedinou uvozovku? Protože používátemysql_
navrhuji, abyste každý zabalili pomocímysql_real_escape_string()
před jejich použitím v databázi volá:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";