sql >> Base de Datos >  >> RDS >> Mysql

PHP MYSQL:complete las filas numeradas de la tabla HTML en función de si coinciden con el número de fila

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)

  1. 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).

  2. En el segundo while -bucle tienes la línea $num_devices=mysql_numrows($result_devices); . No hay función PHP mysql_numrows() , creo que esto es un error tipográfico para mysql_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.

  3. 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 a mysqli_ o PDO métodos.

  4. 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 o datacenter value contenía una comilla simple? Ya que estás usando mysql_ métodos, le sugiero que envuelva cada uno con mysql_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";