Um das Problem direkt anzugehen (mehr dazu später), durchlaufen Sie die vollständige Liste der Geräte und dann - Nachdem Sie alle durchlaufen haben, versuchen Sie, sie anzuzeigen. Aus diesem Grund wird nur das zuletzt berührte Gerät angezeigt.
Ihr aktueller Code, abgeschnitten, lautet:
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;
}
...
}
Wenn ich verstehe, was Sie zu tun versuchen, müssen Sie jedes Gerät in einem "Geräte" -Array speichern und es während jeder Iteration Ihres for
durchlaufen Schleife. Versuchen Sie etwas wie:
$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;
...
}
Ein eleganterer Weg, dieselbe Aufgabe zu erledigen, kann mit ustartlocation
erfolgen als Index des Arrays, aber es erfordert, dass ustartlocation
ist einzigartig für ein einzelnes Gerät/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');
...
}
Bei dieser Methode entfällt die Notwendigkeit, die Liste der Geräte jedes Mal zu durchlaufen, aber auch hier ist es erforderlich, dass die ustartlocation
ist einzigartig.
Randnotizen (zusätzliche, nicht antwortspezifische Kritik)
-
Am Anfang Ihres Codes führen Sie
$sql_devices="SELECT * FROM
aus Geräte";
und$result_devices=mysql_query($sql_devices);
, aber verwenden Sie dieses Objekt niemals. Es kann und sollte entfernt werden, da es sich um eine zusätzliche (ziemlich umfangreiche) Abfrage handelt. -
Im zweiten
while
-loop haben Sie die Zeile$num_devices=mysql_numrows($result_devices);
. Es gibt keine PHP-Funktionmysql_numrows()
, ich glaube, das ist ein Tippfehler fürmysql_num_rows()
Funktion (das, oder Sie haben eine benutzerdefinierte Funktion, um dasselbe zu tun. Auch die$num_devices
Variable wird nie verwendet, also könnte diese Zeile eigentlich ganz entfernt werden. -
Sie verwenden das alte und veraltete
mysql_
Funktionen (sehen Sie sich die Warnmeldung oben auf jeder der Dokumentseiten für diese Funktionen an; hier istmysql_connect()
als Referenz). Ich und die Community empfehlen Ihnen, aufmysqli_
oderPDO
Methoden. -
Ihr Code ist offen für nicht bereinigte SQL-Fehler, die nicht speziell auf die SQL-Injektion beschränkt sind, da es nicht so aussieht, als würden Sie Eingaben direkt von Benutzereingaben übernehmen, schließen diesen Faktor aber auch nicht aus. Was würde zum Beispiel passieren, wenn ein
Schrank
oderrechenzentrum
value enthielt ein einfaches Anführungszeichen? Da Siemysql_
verwenden Methoden, schlage ich vor, dass Sie jede mitmysql_real_escape_string()
umschließen bevor sie in den Datenbankaufrufen verwendet werden:$sql_cabinets="SELECT * FROM Cabinets WHERE datacenter ='" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY Schranknummer";