Autor | Zpráva | ||
---|---|---|---|
tomas2245 Profil |
Zdravím, vedel by mi niekto poradiť s kódom ktorý by robil to, že mi bude sčítavať všetky hodnoty pola s rovnakým klúčom?
príklad: A : 10 B : 5 A : 12 B : 4 A : 3 A : 2 výsledok: A = 27 B = 9 Základ kódu mám tuto: <?php $dotaz = mysqli_query($pripoj,"SELECT * FROM tabulka"); while($dotaz2 = mysqli_fetch_array($dotaz)){ $text = array(); $text = unserialize($dotaz['text']); foreach($text as $kluc => $obsah){ $vysledok .= ' '; } $vysledok_html .= ' '; ?> |
||
pcmanik Profil |
#2 · Zasláno: 19. 4. 2017, 23:37:26
tomas2245:
Môžeš to poriešiť rovno v SQL dotaze. SELECT kluc, SUM(hodnoty) FROM tabulka GROUP BY kluc |
||
tomas2245 Profil |
pcmanik:
ďakujem za radu ale nemôžem, to som síce nezmienil ale poviem teraz...mám to pole v jednom stĺpci (kluc + hodnotu) ktoré je ešte k tomu serializované a pri výbere z databázy dávam unserialize...Čiže jedine pomocou foreach :/ ale vôbec netuším že ako... |
||
Dan Charousek Profil |
#4 · Zasláno: 20. 4. 2017, 00:16:32
tomas2245:
1) Potřeba ukládat si serializované pole do sloupce db mnohdy značí špatný návrh databáze, určitě by to šlo lépe 2) jedná-li se opravdu o php pole, tak není možné, abys měl víc klíčů se stejnou hodnout, klíč musí být unikátní |
||
tomas2245 Profil |
#5 · Zasláno: 20. 4. 2017, 05:47:19
Dan Charousek:
keďže sa jedná o serializovaný druh tovaru tak rovnaký kľúč musí existovať...pretože ďalší zákazník si tiež mohol objednať daný tovar...On je unikátny maximálne pre jeden riadok v databáze... |
||
Tomášeek Profil |
#6 · Zasláno: 20. 4. 2017, 06:51:55
tomas2245:
S tím, co píšeš, se moc pracovat nedá. Máš špatný návrh databáze, serializovaná data tam nemají v tomto případě co dělat - jaké to přináší problémy při banálních úkolech vidíš sám. Běžně v e-shopu může více lidí objednat stejný produkt, stejně jako ho jeden může objednat vícekrát. Přesto se to serializovanými daty neřeší, právě kvůli tomu, aby se s těmi objednávkami dalo dále rozumně pracovat, třeba je jen jednoduše sečíst. |
||
tomas2245 Profil |
#7 · Zasláno: 20. 4. 2017, 08:10:17
prečo sa s tým nedá pracovať? veď je tam známe čo je kľúč a čo hodnota toho daného kľúča...
|
||
Dan Charousek Profil |
#8 · Zasláno: 20. 4. 2017, 08:13:04
tomas2245:
Jak jsem psal výše, není možné, aby v poli existoval duplicitní klíč, protože musí být jednoznačný. Objednává-li si zákazník produkt, tak klíčem v tomto případě je kombinace id zákazníka a id produktu + příp. datum objednávky (když by si zákazník objednával stejný produkt po několikáté). Avšak nic to nemění na tom, že takhle se to dělat nemá. Tohle je klasický případ many to many relace, kde potřebuješ 3 tabulky - users, products, user_product pak už není složité sestavit dotaz, který ti spočítá kolikrát si zákazník daný produkt koupil. |
||
tomas2245 Profil |
skúsim ešte niečo pohľadať a keď tak sa ozvem...
|
||
tomas2245 Profil |
zdravím, konečne som našiel kód ktorý robí presne to čo chcem:
len neviem ešte ako miesto toho $input mám dosadiť tie moje serializované hodnoty (asi pomocou foreach-u).. neviem ako pokračovať.. :/ (to hrubo označené by malo podla mňa nahradiť to $input) $dotaz = mysqli_query($pripoj,"SELECT * FROM tabulka"); while($dotaz2 = mysqli_fetch_array($dotaz)){ $text = array(); $text = unserialize($dotaz['text']); foreach($text as $kluc => $obsah){ ------------ <?php $input = Array( 0 => Array ( 'A' => 2, 'B' => 1, ), 1 => Array ( 'A' => 5, 'B' => 0, ), 2 => Array ( 'A' => 3, 'B' => 3, ) ); $final = array_shift($input); foreach ($final as $key => &$value){ $value += array_sum(array_column($input, $key)); } unset($value); var_dump($final); |
||
Tomášeek Profil |
#11 · Zasláno: 20. 4. 2017, 18:58:19
tomas2245:
Dobré drbání se levou nohou za pravým uchem. Ale kdo chce kam, ... :-) |
||
tomas2245 Profil |
#12 · Zasláno: 20. 4. 2017, 19:02:57
Tomášeek:
myslíš? |
||
Dan Charousek Profil |
#13 · Zasláno: 20. 4. 2017, 19:06:09
Tak snad do třetice :)
Nic jako duplicitní klíč existovat nesmí. Slovník/Pole by potom nebylo zobrazení. Předělej DB, máš to špatně navržený. |
||
tomas2245 Profil |
Dan Charousek:
neni mi celkom jasné tá štruktúra ako to spraviť bez toho serializovania...v jednom stĺpci číslo produktov - 1.,2.,4.A,5. a v ďalšom stĺpci počty: 50,20,10,30 ? ako by potom pri vyberaní z DB som vedel priradiť daný počet kusov k danému produktu? |
||
Dan Charousek Profil |
#15 · Zasláno: 20. 4. 2017, 21:05:33
tomas2245:
Ani takhle ne, ale jsem rád, že už přistupuješ na alternativy. Popiš detailněji, co by aplikace měla dělat, resp. o jakých datech se bavíme a myslím, že ti budeme moci pomoc. Pokud bych měl jen vyjít z toho, co jsi psal, tak se bavíme o produktech a zákaznících a objednávkách. To by se dalo řešit následujícími tabulkami: Uživatelé, Produkty, Objednávky, Objednavka_Produkt Záznamy v tabulce uživatelé jsou relativně jednoznačné - id, jmeno, prijmeni, email, atd... Produkty taktéž - id, nazev, atd... Záznamy v tabulce objednávky budou reprezentovat jednotlivé objednávky zákazníků - id, uzivatel_id, datum, popř. enum stav (zaplaceno/vyřízeno/atd...) A v tabulce Objednavka_Produkt budou záznamy jen ukazovat na to jaké produkty si zákazník v dané objednávce vlastně koupil: id, objednavka_id, produkt_id, pocet Ale jak říkám, to jen odhaduji podle toho, co jsi psal. Finální návrh může vypadat jinak podle potřeby. |
||
tomas2245 Profil |
#16 · Zasláno: 20. 4. 2017, 21:14:12
Dan Charousek:
veľmi ti ďakujem že sa mi snažíš ďalej pomáhať :-) ale už by som to radšej riešil cez mail, vidím že v profile máš.. tak ak by ti nevadilo napísal by som ti tam, pretože táto debata je nadlho... :) |
||
pcmanik Profil |
#17 · Zasláno: 20. 4. 2017, 21:23:09
tomas2245:
Od toho je diskusia, kontaktovanie na email nieje potrebné ba až nežiaduce nakoľko by sa tak stratili rady ktoré môžu pomôcť aj niekomu ďalšiemu. A ak bude chcieť Dan Charousek s tebou tento problém ďalej riešiť, som si istý že to moderátorom vadiť nebude nakoľko z toho nebudeš mať prospech len ty, ale aj prípadný ďalší návštevníci diskusie :) |
||
tomas2245 Profil |
pcmanik:
no vidíš, na druhých som ani nemyslel :D to som ale sebec :D no ale k veci... Dan Charousek: momentálne to mám v takom stave, že mám jednu tabuľku objednávky a druhú produkty. V tabuľke objednávky mám cez 40 stĺpcov: (napr.: id, cislo_zakaznika, meno, priezvisko, tovar, tovar_cena...........) A v tabuľke produkty mám: (id, nazov, farba....) a kód produktov v html vyzerá takto: <input type="text" name="tovar1"> //1 znamená id tovaru a v php to spracovávam takto: $post_tovar = array(); $klucik = ""; foreach($_POST as $kluc => $obsah) { if (strpos($kluc, 'tovar') === 0) { if(!empty($_POST[$kluc])){ $klucik = substr($kluc, 5); //dame prec zaciatok 'tovar' $klucik = mysqli_real_escape_string($pripoj,$klucik); if(is_numeric($obsah)){ $post_tovar[$klucik] = $obsah;} } } } samozrejme tam ešte v tom foreach-i riešim cenu atď atď. ale keďže si myslím že momentálne to nie je podstatné tak som neuviedol kód na to. a nakoniec to zoserializujem pomocou: $serial_tovar = serialize($post_tovar);
to sa mi uloží do stĺpca s názvom tovar v tvare príklad: a:7:{s:3:"7H";s:1:"5";s:4:"7C";s:1:"5";s:4:"7E";s:1:"5";} a potom to už v administrácií len vyberám jednoducho cez: $tovar = array(); $tovar = unserialize($dotaz['tovar']); foreach($tovar as $kluc => $obsah){ $vrat_tovar_html .= $kluc.': '.$obsah.''; inak chápem 40 stĺpcov si možno poviete že hrôza a tak ďalej, ale tak snažím sa s PHP robím možno ani nie 3 mesiace...ale tak pokúsim sa to spraviť čo najlepšie pomocou vašich rád :) a už sa mi podarilo vyriešiť ten problém s počítaním rovnakých kľúčov a to tak, že ako vyberám ten stĺpec tovar z konkrétnych objednávok (zvolím si OD a DO dátum) tak sa mi to zapíše do novej tabuľky (statistika: id a pocet). |
||
Časová prodleva: 3 dny
|
|||
tomas2245 Profil |
mal by som ešte otázku...je možné mať input ktorý by mal nulový value a ak by som doňho napísal napr. 5 a starý input value je 20 tak nová hodnota by sa sčítala na = 25 ?
$post_tovar = array(); $klucik = ""; foreach($_POST as $kluc => $obsah) { if (strpos($kluc, 'tovar') === 0) { if(!empty($_POST[$kluc])){ $klucik = substr($kluc, 5); //dame prec zaciatok 'tovar' $klucik = mysqli_real_escape_string($pripoj,$klucik); if(is_numeric($obsah)){ $post_tovar[$klucik] = $obsah;} } } } |
||
Kajman Profil |
#20 · Zasláno: 24. 4. 2017, 08:28:23
if(is_numeric($obsah)){ if(isset($post_tovar[$klucik])) { $post_tovar[$klucik] += $obsah; } else { $post_tovar[$klucik] = $obsah; } } |
||
tomas2245 Profil |
bohužial nejde furt mi to prepíše a nepripočíta...
|
||
Kajman Profil |
#22 · Zasláno: 24. 4. 2017, 09:15:43
Jasně, v
$kluc přeci nebude vícekráte to samé. Pokud máte data v databázi a chcete k nim podle $_POST dat něco přidat, nebo je vložit, pokud v databázi nejsou, tak použijte klauzuli
dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html Naopak, pokud chcete z formuláře dostat více hodnot pro jeden klíč přes POST, tak v tom formuláři použijte u takových položek na konci name hranaté závorky a php to nachystá jako pole hodnot. Např. odesláním <input name="tovar7H[]" value="2"> <input name="tovar7H[]" value="3"> $_POST["tovar7H"] pole obou hodnot. Pokud tam hranaté závory nebudou, bude tam je jedna hodnota.
|
||
tomas2245 Profil |
#23 · Zasláno: 24. 4. 2017, 09:54:46
ale ono tam žiadny duplikát nie je, mne ide len o to, aby som k value danému kľúču pripočítal hodnotu z value inputu...
|
||
Kajman Profil |
#24 · Zasláno: 24. 4. 2017, 10:09:44
Pošlete sem výpis POST pole po odeslání formuláře a vyznačte tam, co s čím chcete sečít.
echo "<pre>"; var_dump($_POST); echo "</pre>"; |
||
tomas2245 Profil |
Ako vyzerá html:
1. Tovar: 10 kusov <input type="text" name="tovar1" value="10"> //výsledok teda bude 20
2. Tovar: 10 kusov <input type="text" name="tovar2" value="5"> //výsledok teda bude 15
<?php array(2) { ["tovar1"]=> string(2) "20" // + 10 z value inputu ["tovar2"]=> string(2) "15" // + 5 z value inputu } ?> |
||
Kajman Profil |
#26 · Zasláno: 24. 4. 2017, 11:02:14
Stále nevidíme, co s čím se má sčítat. V ukázce už došla chtěná čísla 20 a 15.
|
||
tomas2245 Profil |
tak ja neviem, ako to mám inak vyznačiť teraz som vám ukázal ako si to predstavujem už vo finishi...
proste potrebujem nejak na základe toho <input name=""> priradiť value ku $kluc kam patrí...ak je vyplnený input tak += $obsah ak nie je tak len = $obsah |
||
Kajman Profil |
#28 · Zasláno: 24. 4. 2017, 11:13:32
Přijde mi, že chcete např. u druhého produktu sečíst 10 a 5, ale nevidím, že by z formuláře tato čísla šla. Je některé z těchto čísel už v databázi? Nebo chodí obě z formuláře?
|
||
tomas2245 Profil |
z databázy ide iba to: 1. Tovar: 10 kusov a 2. Tovar: 10 kusov (konkreténe z toho foreachu) uvedeného v [#19]
a z formulára ide už iba ten <input type="text" name="tovar1"> a <input type="text" name="tovar2"> |
||
Kajman Profil |
#30 · Zasláno: 24. 4. 2017, 12:39:39
Pokud tedy chcete udělat v databázi update, kde k současné hodnotě (10 a 10) přidáte hodnotu s formuláře (10 a 5), použijte
insert on duplicate key update odkázaný v [#22]. Výsledný seskládaný dotaz by mohl vypadat např. takto INSERT INTO tabulka (`id_objednavka`,`id_produktu`,`pocet`) VALUES (249, 1, 10), (249, 2, 5) ON DUPLICATE KEY UPDATE `pocet`=`pocet`+VALUES(`pocet`); V tabulce je potřeba mít unikátní klíč nad kombinací sloupců id_objednavka a id_produktu. |
||
Téma pokračuje na další straně.
|
0