Para abordar directamente el problema (hablaré más en un momento), está iterando a través de la lista completa de dispositivos y luego - una vez que haya terminado de recorrerlos todos - intente mostrarlos. Debido a esto, solo muestra el dispositivo final que se tocó.
Su código actual, truncado, es:
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;
}
...
}
Si entiendo lo que está tratando de hacer, deberá almacenar cada dispositivo en una matriz de "dispositivos" y recorrerlo durante cada iteración de su for
círculo. Prueba 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;
...
}
Se puede realizar una forma más elegante de realizar esta misma tarea utilizando la ustartlocation
como el índice de la matriz, pero requerirá que ustartlocation
es exclusivo de un 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á la necesidad de recorrer la lista de dispositivos cada vez, pero nuevamente, requiere que ustartlocation
es único.
Notas al margen (críticas adicionales, no específicas de la respuesta)
-
Al comienzo de su código, ejecuta
$sql_devices="SELECT * FROM
dispositivos";
y$result_devices=mysql_query($sql_devices);
, pero nunca use este objeto. Puede y debe eliminarse ya que es una consulta adicional (bastante pesada). -
En el segundo
while
-bucle tienes la línea$num_devices=mysql_numrows($result_devices);
. No hay función PHPmysql_numrows()
, creo que esto es un error tipográfico paramysql_num_rows()
(eso, o tiene una función personalizada para hacer lo mismo. Además, el$num_devices
La variable nunca se usa, por lo que esta línea podría eliminarse por completo. -
Estás usando el viejo y obsoleto
mysql_
funciones (consulte el mensaje de advertencia en la parte superior de cualquiera de las páginas de documentos para estas funciones; aquí estámysql_connect()
para referencia). Yo, así como la comunidad, le recomiendo que actualice amysqli_
oPDO
métodos. -
Su código está abierto a errores de SQL sin desinfectar, no limitados específicamente a la inyección de SQL, ya que no parece que esté recibiendo información directamente de la entrada del usuario, pero tampoco descarta este factor. Por ejemplo, ¿qué pasaría si un
cabinet
odatacenter
value contenía una comilla simple? Ya que estás usandomysql_
métodos, le sugiero que envuelva cada uno conmysql_real_escape_string()
antes de usarlos en las llamadas a la base de datos:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";