Per affrontare direttamente il problema (ne parlerò tra poco), stai scorrendo l'elenco completo dei dispositivi e poi - dopo aver finito di scorrerli tutti - tenti di visualizzarli. Per questo motivo, stai visualizzando solo il dispositivo finale che è stato toccato.
Il tuo codice attuale, troncato, è:
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;
}
...
}
Se ho capito cosa stai cercando di fare, dovrai archiviare ogni dispositivo in un array "dispositivi" e scorrerlo durante ogni iterazione del tuo for
ciclo continuo. Prova qualcosa come:
$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;
...
}
Un modo più elegante per eseguire lo stesso compito può essere fatto usando ustartlocation
come indice dell'array, ma richiederà che ustartlocation
è unico per un singolo dispositivo/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');
...
}
Questo metodo eliminerà la necessità di scorrere l'elenco dei dispositivi ogni volta, ma ancora una volta richiede che ustartlocation
è unico.
Note a margine (critiche aggiuntive, non specifiche per le risposte)
-
All'inizio del tuo codice esegui
$sql_devices="SELECT * FROM
dispositivi";
e$result_devices=mysql_query($sql_devices);
, ma non utilizzare mai questo oggetto. Può e deve essere rimosso in quanto è una query aggiuntiva (abbastanza pesante). -
Nel secondo
while
-loop hai la riga$num_devices=mysql_numrows($result_devices);
. Non esiste una funzione PHPmysql_numrows()
, credo che questo sia un errore di battitura permysql_num_rows()
funzione (che, o hai una funzione scritta su misura per fare la stessa cosa. Inoltre, il$num_devices
la variabile non viene mai utilizzata, quindi questa riga potrebbe effettivamente essere rimossa del tutto. -
Stai usando il vecchio e ormai deprecato
mysql_
funzioni (controlla il messaggio di avviso nella parte superiore di qualsiasi pagina doc per queste funzioni; eccomysql_connect()
per riferimento). Io, così come la community, ti consiglio di eseguire l'upgrade amysqli_
oPDO
metodi. -
Il tuo codice è aperto a errori SQL non sterilizzati, non specificamente limitati all'iniezione SQL in quanto non sembra che tu stia ricevendo input direttamente dall'input dell'utente, ma non esclude questo fattore. Ad esempio, cosa accadrebbe se un
cabinet
odatacenter
valore conteneva una virgoletta singola? Dato che stai usandomysql_
metodi, ti suggerisco di avvolgere ciascuno conmysql_real_escape_string()
prima di utilizzarli nelle chiamate del database:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";