Autor Zpráva
grossik
Profil
Dobrý den, mám problém s přičtením surovin pro všechny podle toho jakou mají produkci. V MySQL jsem začátečník a na tomhle přemýšlím už víc jak dva dny.

$sql = "SELECT * FROM resources";
    $result = $conn->query($sql);
    
    $vstup1 = mysqli_query($conn, "SELECT * FROM resources");
    $riadky = mysqli_num_rows($vstup1);
    $intopakovac = 0;

    while($riadky >= $intopakovac)
    {    
        $row = $result->fetch_assoc();
        $cityId = $row['city_id'];
        $sql = "SELECT planks_production, ore_production, clay_production, food_production FROM production WHERE city_id = '$cityId'";
        $result = mysqli_query($conn, $sql);
        $intopakovac++;
        $row = mysqli_fetch_assoc($result);
        
        $planks_production = $row['planks_production'];
        $ore_production = $row['ore_production'];
        $clay_production = $row['clay_production'];
        $food_production = $row['food_production'];
      
        $sql = "UPDATE resources SET planks = planks + '$planks_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' planks have been updated!<br/>";
        }
        
        $sql = "UPDATE resources SET ore = ore + '$ore_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' ore have been updated!<br/>";
        }
        
        $sql = "UPDATE resources SET clay = clay + '$clay_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' clay have been updated!<br/>";
        }
        
        $sql = "UPDATE resources SET food = food + '$food_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' food have been updated!<br/>";
        }
    }
    

Tento kód mi furt bere produkci od prvního z tabulky a přičte mu jí, ale toho druhého to ignoruje.
Lonanek
Profil
grossik:
ale toho druhého to ignoruje.

Protože si na ř. 13 a 15 přepíšete důležité proměnné.
Změňte pro druhý dotaz $result a $row.

Pro procházení všech záznamů stačí použít:
...
while ($row = $result->fetch_assoc()) {
...
}
a nemusíte používat žádný další čítač a zbytečné načtení počtu záznamů.
grossik
Profil
Pokud tam místo těch dvou řádku dám while ($row = $result->fetch_assoc())... tak mi to způsobí nekonečné načítání stránky a pokud odstraním while($riadky >= $intopakovac) tak mám jen bílou obrazovku bez ničeho. Nevím jestli něco nedělám špatně.
Dan Charousek
Profil
Na tom kódu je hodně co zlepšovat, určitě bych se vyhnul několikanásobnému updatu na řádcích 22-44

Pokud jsou tabulky resources a production ve vztahu 1:1, tak tabulku resources vůbec procházet nemusíš.

Šel bych na to nějak takto (za předpokladu, že to děláš procedurárně - nerozumím řádku 1, 2 a 4).

$production = mysqli_query($conn, "SELECT * FROM production");

while($row = mysqli_fetch_assoc($production)) {

    $updateQuery = "UPDATE resources SET planks = planks + $row[planks_production], ore = ore + $row[ore_production], clay = clay + $row[clay_production], food = food + $row[food_production] WHERE city_id = " . $row['city_id'];
    
    mysqli_query($conn, $updateQuery);

}

// edit: opravil jsem špatně uvedený název proměnné
Lonanek
Profil
Takhle jste to zkoušel?
$sql = "SELECT * FROM resources";
    $result = $conn->query($sql);
    
    $vstup1 = mysqli_query($conn, "SELECT * FROM resources");
    $riadky = mysqli_num_rows($vstup1);
 
    while($row = $result->fetch_assoc())
    {
        $cityId = $row['city_id'];
        $sql = "SELECT planks_production, ore_production, clay_production, food_production FROM production WHERE city_id = '$cityId'";
        $result_1 = mysqli_query($conn, $sql);
        $row_1 = mysqli_fetch_assoc($result);
        
        $planks_production = $row_1['planks_production'];
        $ore_production = $row_1['ore_production'];
        $clay_production = $row_1['clay_production'];
        $food_production = $row_1['food_production'];
      
        $sql = "UPDATE resources SET planks = planks + '$planks_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' planks have been updated!<br/>";
        }
        
        $sql = "UPDATE resources SET ore = ore + '$ore_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' ore have been updated!<br/>";
        }
        
        $sql = "UPDATE resources SET clay = clay + '$clay_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' clay have been updated!<br/>";
        }
        
        $sql = "UPDATE resources SET food = food + '$food_production' WHERE city_id = '$cityId'";
        if (mysqli_query($conn, $sql)) 
        {
            echo "Cities' food have been updated!<br/>";
        }
    }
    
Kvalitu a smysluplnost kódu neřeším.
grossik
Profil
Teď mi to píše chyby
Undefined index: planks_production
Undefined index: ore_production
Undefined index: clay_production
Undefined index: food_production
Lonanek
Profil
jj moje chyba - ř. 12:
        $row_1 = mysqli_fetch_assoc($result_1);
Dan Charousek
Profil
grossik:
Měl jsem špatně pojmenovanou proměnnou. - Viz. upravený příspěvek [#4] Dan Charousek
grossik
Profil
Jo ani já jsem si toho nevšiml, děkuju moc už vše funguje jak má.
xaverista
Profil
grossik:
tuším, že upravit tento řádek
$cityId = $row['city_id'];
        $sql = "SELECT planks_production, ore_production, clay_production, food_production FROM production WHERE city_id = '$cityId'";
        $result_1 = mysqli_query($conn, $sql);
        $row_1 = mysqli_fetch_assoc($result_1);
Lonanek
Profil
Řešení od Dan Charousek [#4] jste zkoušel aplikovat?
grossik
Profil
Lonanek:
Ano a funguje to také.


Všem vám moc děkuji za rychlé odpovědi a za pomoc.
Dan Charousek
Profil
grossik:
Vím, že je to už trochu mimo zadaný problém, ale nejde mi na rozum, k čemu potřebuješ globálně aktualizovat zdroje všech (hádám) lidí/hráčů - měst?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: