Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP MYSQL - Füllen Sie nummerierte HTML-Tabellenzeilen basierend darauf aus, ob sie mit der Zeilennummer übereinstimmen

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)

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

  2. Im zweiten while -loop haben Sie die Zeile $num_devices=mysql_numrows($result_devices); . Es gibt keine PHP-Funktion mysql_numrows() , ich glaube, das ist ein Tippfehler für mysql_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.

  3. Sie verwenden das alte und veraltete mysql_ Funktionen (sehen Sie sich die Warnmeldung oben auf jeder der Dokumentseiten für diese Funktionen an; hier ist mysql_connect() als Referenz). Ich und die Community empfehlen Ihnen, auf mysqli_ oder PDO Methoden.

  4. 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 oder rechenzentrum value enthielt ein einfaches Anführungszeichen? Da Sie mysql_ verwenden Methoden, schlage ich vor, dass Sie jede mit mysql_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";