For at løse problemet direkte (jeg kommer nærmere om lidt), gentager du hele listen over enheder og derefter - efter at du er færdig med at gennemgå dem alle - forsøger du at vise dem. På grund af dette viser du kun den sidste enhed, der blev rørt ved.
Din nuværende kode, afkortet, er:
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;
}
...
}
Hvis jeg forstår, hvad du prøver at gøre, skal du gemme hver enhed i et "enheder"-array og gå igennem det under hver iteration af din for
sløjfe. Prøv noget som:
$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;
...
}
En mere elegant måde at udføre den samme opgave på kan gøres ved at bruge ustartlocation
som indekset for arrayet, men det vil kræve, at ustartlocation
er unik for en individuel enhed/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');
...
}
Denne metode vil fjerne behovet for at gå gennem listen over enheder hver gang, men igen - det kræver, at ustartlocation
er unik.
Sidebemærkninger (yderligere, ikke-svar-specifikke kritikker)
-
I begyndelsen af din kode udfører du
$sql_devices="SELECT * FROM
enheder";
og$result_devices=mysql_query($sql_devices);
, men brug aldrig dette objekt. Det kan og bør fjernes, da det er en ekstra (temmelig tung) forespørgsel. -
I den anden
mens
-loop du har linjen$num_devices=mysql_numrows($result_devices);
. Der er ingen PHP-funktionmysql_numrows()
, jeg tror, at dette er en tastefejl formysql_num_rows()
funktion (det, eller du har en specialskrevet funktion til at gøre det samme. Også$num_devices
variabel bruges aldrig, så denne linje kunne faktisk fjernes helt. -
Du bruger den gamle og forældede
mysql_
funktioner (tjek advarselsmeddelelsen øverst på enhver af doc-siderne for disse funktioner; her ermysql_connect()
til reference). Jeg, såvel som fællesskabet, anbefaler dig at opgradere tilmysqli_
ellerBOB
metoder. -
Din kode er åben for usanificerede SQL-fejl, ikke specifikt begrænset til SQL-injektion, da det ikke ser ud til, at du tager input direkte fra brugerinput, men heller ikke udelukker denne faktor. For eksempel, hvad ville der ske, hvis et
skab
ellerdatacenter
værdi indeholdt et enkelt citat? Da du brugermysql_
metoder, foreslår jeg, at du indpakker hver medmysql_real_escape_string()
før du bruger dem i databasen kalder:$sql_cabinets="SELECT * FROM kabinetter WHERE datacenter ='" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' BESTIL EFTER skabsnummer";