Para resolver o problema diretamente (falarei mais em breve), você está percorrendo a lista completa de dispositivos e depois - depois de terminar de percorrer todos eles - você tenta exibi-los. Por causa disso, você está exibindo apenas o dispositivo final que foi tocado.
Seu código atual, truncado, é:
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 eu entendi o que você está tentando fazer, você precisará armazenar cada dispositivo em uma matriz "dispositivos" e fazer um loop durante cada iteração do seu
for
ciclo. Tente algo como:$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;
...
}
Uma maneira mais elegante de realizar essa mesma tarefa pode ser feita usando o
ustartlocation
como o índice do array, mas exigirá que o ustartlocation
é exclusivo para um dispositivo/servidor individual:$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');
...
}
Este método eliminará a necessidade de percorrer a lista de dispositivos todas as vezes, mas novamente - ele requer que o
ustartlocation
é único. Observações complementares (críticas adicionais, sem respostas específicas)
-
No início do seu código você executa$sql_devices="SELECT * FROM
dispositivos";
e$result_devices=mysql_query($sql_devices);
, mas nunca use este objeto. Ele pode e deve ser removido, pois é uma consulta extra (bastante pesada).
-
No segundoenquanto
-loop você tem a linha$num_devices=mysql_numrows($result_devices);
. Não há função PHPmysql_numrows()
, acredito que seja um erro de digitação para omysql_num_rows()
função (isso, ou você tem uma função escrita personalizada para fazer a mesma coisa. Além disso, o$num_devices
variável nunca é usada, então essa linha pode ser removida completamente.
-
Você está usando o antigo e obsoletomysql_
funções (confira a mensagem de aviso no topo de qualquer uma das páginas doc para essas funções; aqui estámysql_connect()
para referência). Eu, assim como a comunidade, recomendo que você atualize para omysqli_
ouPDO
métodos.
-
Seu código está aberto a erros de SQL não higienizados, não especificamente limitados à injeção de SQL, pois não parece que você está recebendo entrada diretamente da entrada do usuário, mas também não descarta esse fator. Por exemplo, o que aconteceria se umarmário
oudatacenter
valor continha aspas simples? Como você está usandomysql_
métodos, sugiro que você envolva cada um commysql_real_escape_string()
antes de usá-los nas chamadas do banco de dados:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter ='" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER POR número do gabinete";