sql >> Databáze >  >> RDS >> Mysql

PHP MYSQL - naplnit HTML tabulky číslované řádky na základě toho, zda se shodují s číslem řádku

Chcete-li problém přímo vyřešit (k více se dostanu za chvíli), procházíte úplným seznamem zařízení a pak - poté, co je všechny projdete, pokusíte se je zobrazit. Z tohoto důvodu zobrazujete pouze konečné zařízení, kterého jste se dotkli.

Váš aktuální kód, zkrácený, je:

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;
    }
    ...
}

Pokud rozumím tomu, co se snažíte udělat, budete muset každé zařízení uložit do pole „devices“ a procházet je během každé iterace vašeho for smyčka. Zkuste něco jako:

$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;
    ...
}

Elegantnější způsob, jak provést stejný úkol, lze provést pomocí ustartlocation jako index pole, ale bude vyžadovat ustartlocation je jedinečný pro jednotlivé zařízení/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');
    ...
}

Tato metoda upustí od nutnosti procházet seznam zařízení pokaždé, ale opět – vyžaduje, aby ustartlocation je jedinečný.

Poznámky (dodatečné kritiky, které nejsou specifické pro odpověď)

  1. Na začátku kódu spustíte $sql_devices="SELECT * FROM zařízení"; a $result_devices=mysql_query($sql_devices); , ale nikdy tento objekt nepoužívejte. Může a měl by být odstraněn, protože je to jeden další (poměrně těžký) dotaz.

  2. Ve druhém while -loop máte řádek $num_devices=mysql_numrows($result_devices); . Neexistuje žádná funkce PHP mysql_numrows() , domnívám se, že se jedná o překlep pro mysql_num_rows() funkce (nebo máte vlastní napsanou funkci, která dělá totéž. Také $num_devices proměnná se nikdy nepoužívá, takže tento řádek lze ve skutečnosti zcela odstranit.

  3. Používáte starý a již zastaralý mysql_ funkcí (pro tyto funkce se podívejte na varovnou zprávu v horní části kterékoli stránky dokumentu; zde je mysql_connect() pro referenci). Já, stejně jako komunita, vám doporučuji upgradovat na mysqli_ nebo PDO metody.

  4. Váš kód je přístupný nehygienickým chybám SQL, které nejsou konkrétně omezeny na vkládání SQL, protože se nezdá, že přijímáte vstup přímo z uživatelského vstupu, ale také tento faktor nevylučujete. Například, co by se stalo, kdyby cabinet nebo datacenter hodnota obsahovala jedinou uvozovku? Protože používáte mysql_ navrhuji, abyste každý zabalili pomocí mysql_real_escape_string() před jejich použitím v databázi volá:$sql_cabinets="SELECT * FROM cabinets WHERE datacenter = '" . mysql_real_escape_string($datacenters_sqlrow[0]) . "' ORDER BY cabinetnumber";




  1. Provádění spojení napříč více heterogenními databázemi, např. PostgreSQL a MySQL

  2. Jak automaticky zálohovat MySQL pomocí pracovního stolu MySQL

  3. Vrátit náhodné výsledky ( pořadí podle rand() )

  4. Proč je tento dotaz mysql (s nulovou kontrolou) tak pomalejší než tento druhý?