Autor Zpráva
Ikki
Profil
Zdravím,

lámu si hlavu nad tím, jak vypočítat hodnotu všech řádků. Dejme tomu, že výpis obsahuje 10 záznamů přičemž hodnota "celkem_kusu" je 20 (každý záznam má tuto hodnotu 2, tedy 10x2), samozřejmě kusy jsou vždy odlišné, mohou být i stejné, důležité je spočítat.

Můžete mě prosím nějak nakopnout? Zkoušel jsem to přes funkce jako je count aj. bohužel bez správného výsledku.
Taps
Profil
Ikki:
a co použít automatické sčítání v cyklu?
<?
foreach($pole as $key => $index){
$pocitej += 2;

}
echo $pocitej;
?>
Ikki
Profil
Jak v tom ale určit co přesně se má počítat? Počet kusů je přibližně 9. položka v databázi s názvem "celkem_kusu" což potřebuju sečíst. Takhle neurčím co chci počítat, nebo se mýlím?
RastyAmateur
Profil
Ikki:
Tak tam místo += 2 dáš data, resp. proměnnou, z té databáze, ne? Úplně normální průchod výsledky databází a jednoduchá operace přičítání. Nějak nechápu, kde je problém?
$sum = 0;
$result = $mysqli->query("SELECT * FROM ...");
while ($row = $result->fetch_assoc()) {
  $sum += $row['celkem_kusu'];
}
var_dump($sum);

Případně pokud chceš z databáze získat opravdu jen ten počet, existuje něco, jako SQL funkce COUNT().
$sum = $mysqli->query('SELECT COUNT(celkem_kusu) AS sum FROM ...')->fetch_assoc()['sum'];
var_dump($sum);

Ty příklady jsem nijak netestoval a v PHP jsem už dlouho nedělal. Ale snad to poslouží jaké nějaký základ a případné chyby zvládneš odladit sám.
Tomášeek
Profil
Ikki, RastyAmateur:
SUM umí i databáze, je zbytečně a hloupé to počítat až v PHP.
RastyAmateur
Profil
Tomášeek:
Jo teda SUM, já to popletl a napsal COUNT
Ikki
Profil
Děkuji, v PHP to pomohlo a funguje. Do select tohle úplně dávat nechci. Nicméně jsem narazil na další problém. Mám v DB sloupec se serialize daty, přičemž je tam zapsána i cena jednotlivých produktů (rozuměj: v jednom sloupci, v jednom řádku, celkem 300 položek z objednávky). Nyní však potřebují ten serialize ze selectu dostat do takové podoby abych mohl sečíst veškeré ceny ve všech záznamech co jsou v databázi. Jak se dopracovat k ceně a jak jí sečíst? Zkoušel jsem to přes foreach, unserialize a následně to vypsat, count funkce v SQL dotazu i php. Nic mi nevypsalo správnou hodnotu. Cena komplet je někde kolem 190 tisíc, ale výpis mi dle var_dump vyhodí pouze 11.8 a k tomu ještě ve float.
Tomášeek
Profil
Ikki:
V samotném dotazu to nespočítáš, musíš v PHP unserializovat a pak to projít.

Nebo, a to je ta lepší cesta, neukládat data jak trouba v této podobě, sám vidíš, že to je špatná cesta a nejde udělat ani tak jednoduchý úkol jako spočítat cenu, a přepracovat strukturu databáze tak, aby se s ní dalo pohodlně pracovat.

Nově bys tak měl tabulku order_items se sloupci id/order_id/item_id/unit_price/amount. Pak by jakékoliv operaci byly pohodlné a dostupné jednoduchý SQL dotazem (spočítat cenu objednávky, počet kusů daného produktu napříč objednávkami za dané období, obrat za období, atd.)
Ikki
Profil
Problém je v tom, že kód jsem nepsal já. Klient si řekl, že chce systém ponechat přesně takový jaký je a chce na něm pouze přidat nějaké detaily. Mé návrhy na editaci totálně zamítl, tedy to potřebuju vyřešit v podobě v jaké to je.

To, že je to na prd vím také. Unserialize jsem využil, nicméně se mi následně nedaří vypočítat cenu. Ve foreach jsem dokázal vypsat veškerá data ze serialize podoby do tabulky, ale vypočítat z toho jen cenu se mi absolutně nedaří.

Přikládám kód.

$a = ("SELECT * FROM xyz");  // Upravený, nicméně totožný dotaz. Vybíráme všechno z tabulky XYZ - query nechybí
$b = unserialize($a['hodnoty']);   // Unserialize pro vybraný select a sloupec "hodnoty"
foreach ($b as $c => $d) {
$e = count($d['price']); // Vypočítáme veškeré vypsané záznamy
}
echo var_dump($e); // Vypíšeme výsledek

Být po mém tak to celé smažu, ale nemohu. Jak tedy vyřešit tuto situaci?
RastyAmateur
Profil
Ikki:
Přečetl sis, co vlastně dělá (spíše vrací) funkce count? Ty chceš přičítat tak, jako jsme ti radili s Tapsem
$a = ("SELECT * FROM xyz");  // Upravený, nicméně totožný dotaz. Vybíráme všechno z tabulky XYZ - query nechybí
$b = unserialize($a['hodnoty']);   // Unserialize pro vybraný select a sloupec "hodnoty"
$sum = 0;
foreach ($b as $c => $d) {
$sum += $d['price']; // Vypočítáme veškeré vypsané záznamy
}
echo var_dump($sum); // Vypíšeme výsledek
Ikki
Profil
I to jsem zkoušel. Výsledek tohoto zápisu je float(11.8). To jsou sečtené údaje z tohoto záznamu, viz níže 5.9+5.9=11.8, ale já to potřebuji získat z celé tabulky, ze všem záznamů a sečíst v jednu částku.

Zde přikládám data ze sloupce pro jeden záznam;
a:2:{i:0;a:11:{s:4:"name";s:23:"test.jpg";s:1:"w";s:3:"999";s:1:"h";s:3:"666";s:8:"format-w";s:2:"10";s:8:"format-h";s:2:"15";s:6:"format";s:5:"10x15";s:8:"material";s:18:"Lesklý fotopapír";s:6:"upravy";s:28:"(volitelné - výběr desky)";s:5:"pocet";s:1:"1";s:5:"price";s:3:"5.9";s:4:"orez";s:5:"Ořez";}i:1;a:11:{s:4:"name";s:21:"10x15-IMG_6897end.jpg";s:1:"w";s:3:"999";s:1:"h";s:3:"666";s:8:"format-w";s:2:"10";s:8:"format-h";s:2:"15";s:6:"format";s:5:"10x15";s:8:"material";s:18:"Lesklý fotopapír";s:6:"upravy";s:28:"(volitelné - výběr desky)";s:5:"pocet";s:1:"1";s:5:"price";s:3:"5.9";s:4:"orez";s:5:"Ořez";}}
RastyAmateur
Profil
Ikki:
Já stále nechápu, kde je problém. Máš tabulku takovou, že v jednom sloupci máš nějaká serializovaná data, která chceš sečíst napříč všemi řádky? No tak udělej normální select, dej ho do cyklu, v cyklu vždy daný sloupec deserializuj, přičti požadovanou část a je to, ne? Kde je problém? Dotazy na databázi evidentně umíš, cykly taky, serializaci taky asi chápeš, když jí používáš...
Tomášeek
Profil
Ikki:
Víš, že struktura je naprd a nedá se s ní pracovat, ale na zakázku kývneš. Neumíš s těmi daty pracovat, ale na zakázku kývneš...

Dle #9 a #11 evidentně pracuješ jen s jedním řádkem. Tzn. je třeba přidat druhý cyklus, který projde všechny nalezené výsledky z SQL. To ale nemá s dotazem na deserializaci dat nic společného, je to základní práce s SQL a průchod nalezenými výsledky.

Kód v #9 je samozřejmě jen schematický (nefungoval by), ale jeden cyklus ti tam chybí (první prochází výsledky, druhý ta deserializovaná data).
Ikki
Profil
Tomášeek:
Poprosil bych vynechat své nemístné komentáře. Celý projekt patří ke kompletu projektů které jsme jako zakázku vzali. To, že 1 z 12 projektů stojí za prd se bohužel dalo čekat, ale zakázka je zakázka. Ukaž mi prosím, kde neumím pracovat s daty. Jak jsem psal, vše šlape v pořádku, pouze jsem si nevěděl rady se sečtením všech hodnot. Nakonec to jak si psal, vyřešil další cyklus. Díky.
Tomášeek
Profil
Ikki:
Ukaž mi prosím, kde neumím pracovat s daty.
Třeba všude, kde píšeš, že se ti sčítají data jen z jednoho (posledního) řádku vytaženého z databáze (tzn. chybí tam cyklus na průchod všemi výsledky). To při práci s databází považuji za základ práce s databázovými daty, v každé PHP/SQL učebnici je to druhá kapitola.

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:

0