Pour résoudre directement le problème (j'y reviendrai plus en détail dans un instant), vous parcourez la liste complète des appareils et ensuite - une fois que vous avez terminé de les parcourir tous - vous essayez de les afficher. Pour cette raison, vous n'affichez que le dernier appareil qui a été touché.
Votre code actuel, tronqué, est :
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 je comprends bien ce que vous essayez de faire, vous devrez stocker chaque périphérique dans un tableau "devices" et le parcourir en boucle à chaque itération de votre for
boucle. Essayez quelque chose comme :
$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;
...
}
Une façon plus élégante d'accomplir cette même tâche peut être faite en utilisant le ustartlocation
comme index du tableau, mais il faudra que le ustartlocation
est unique à un appareil/serveur individuel :
$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');
...
}
Cette méthode supprimera le besoin de parcourir la liste des périphériques à chaque fois, mais encore une fois - cela nécessite que le ustartlocation
est unique.
Notes annexes (critiques supplémentaires, non spécifiques à la réponse)
-
Au début de votre code, vous exécutez
$sql_devices="SELECT * FROM
appareils";
et$result_devices=mysql_query($sql_devices);
, mais n'utilisez jamais cet objet. Il peut et doit être supprimé car il s'agit d'une requête supplémentaire (assez lourde). -
Au second
while
-loop vous avez la ligne$num_devices=mysql_numrows($result_devices);
. Il n'y a pas de fonction PHPmysql_numrows()
, je crois que c'est une faute de frappe pour lemysql_num_rows()
fonction (que, ou vous avez une fonction personnalisée pour faire la même chose. En outre, le$num_devices
variable n'est jamais utilisée donc cette ligne pourrait en fait être entièrement supprimée. -
Vous utilisez l'ancien
mysql_
qui devient obsolète fonctions (consultez le message d'avertissement en haut de l'une des pages de documentation pour ces fonctions ; voicimysql_connect()
pour référence). Moi, ainsi que la communauté, vous recommandons de passer àmysqli_
ouPDO
méthodes. -
Votre code est ouvert aux erreurs SQL non nettoyées, non spécifiquement limitées à l'injection SQL car il ne semble pas que vous preniez une entrée directement à partir de l'entrée utilisateur, mais n'excluez pas non plus ce facteur. Par exemple, que se passerait-il si une
cabinet
oudatacenter
value contenait un guillemet simple ? Puisque vous utilisezmysql_
méthodes, je vous suggère d'envelopper chacune avecmysql_real_escape_string()
avant de les utiliser dans la base de données appelle :$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";