Om het probleem direct aan te pakken (ik kom zo op meer), doorloop je de volledige lijst met apparaten en vervolgens - nadat je ze allemaal hebt doorlopen - probeer je ze weer te geven. Hierdoor geeft u alleen het laatste apparaat weer dat is aangeraakt.
Uw huidige code, ingekort, is:
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;
}
...
}
Als ik begrijp wat je probeert te doen, moet je elk apparaat opslaan in een "apparaten"-array en er doorheen lopen tijdens elke iteratie van je for
lus. Probeer iets als:
$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;
...
}
Een elegantere manier om dezelfde taak uit te voeren kan worden gedaan met behulp van de ustartlocation
als de index van de array, maar het vereist dat de ustartlocation
is uniek voor een individueel apparaat/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');
...
}
Met deze methode hoeft u niet elke keer door de lijst met apparaten te bladeren, maar nogmaals - het vereist dat de ustartlocation
is uniek.
Nevennotities (aanvullende, niet-antwoordspecifieke kritieken)
-
Aan het begin van je code voer je
$sql_devices="SELECT * FROM
. uit apparaten";
en$result_devices=mysql_query($sql_devices);
, maar gebruik dit object nooit. Het kan en moet worden verwijderd omdat het een extra (redelijk zware) zoekopdracht is. -
In de tweede
while
-loop je hebt de regel$num_devices=mysql_numrows($result_devices);
. Er is geen PHP-functiemysql_numrows()
, ik geloof dat dit een typefout is voor demysql_num_rows()
functie (dat, of je hebt een speciaal geschreven functie om hetzelfde te doen. Ook de$num_devices
variabele wordt nooit gebruikt, dus deze regel zou eigenlijk helemaal kunnen worden verwijderd. -
Je gebruikt de oude en verouderde
mysql_
functies (bekijk het waarschuwingsbericht bovenaan een van de doc-pagina's voor deze functies; hier ismysql_connect()
als referentie). Ik, evenals de gemeenschap, raad je aan om te upgraden naar demysqli_
ofPDO
methoden. -
Uw code staat open voor niet-opgeschoonde SQL-fouten, niet specifiek beperkt tot SQL-injectie, omdat het niet lijkt alsof u rechtstreeks invoer van gebruikersinvoer opneemt, maar deze factor sluit deze factor ook niet uit. Wat zou er bijvoorbeeld gebeuren als een
cabinet
ofdatacenter
waarde bevatte een enkel aanhalingsteken? Aangezien jemysql_
. gebruikt methoden, raad ik aan om ze allemaal in te pakken metmysql_real_escape_string()
voordat u ze in de database-aanroepen gebruikt:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";