Mysql
 sql >> Database >  >> RDS >> Mysql

PHP MYSQL:popola le righe numerate della tabella HTML in base al fatto che corrispondano al numero di riga

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)

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

  2. Nel secondo while -loop hai la riga $num_devices=mysql_numrows($result_devices); . Non esiste una funzione PHP mysql_numrows() , credo che questo sia un errore di battitura per mysql_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.

  3. Stai usando il vecchio e ormai deprecato mysql_ funzioni (controlla il messaggio di avviso nella parte superiore di qualsiasi pagina doc per queste funzioni; ecco mysql_connect() per riferimento). Io, così come la community, ti consiglio di eseguire l'upgrade a mysqli_ o PDO metodi.

  4. 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 o datacenter valore conteneva una virgoletta singola? Dato che stai usando mysql_ metodi, ti suggerisco di avvolgere ciascuno con mysql_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";