« 1 2 »
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
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
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
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
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
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
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
tomas2245:
Dobré drbání se levou nohou za pravým uchem. Ale kdo chce kam, ... :-)
tomas2245
Profil
Tomášeek:
myslíš?
Dan Charousek
Profil
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
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
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
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).
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
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
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">
bude v $_POST["tovar7H"] pole obou hodnot. Pokud tam hranaté závory nebudou, bude tam je jedna hodnota.
tomas2245
Profil
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
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
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
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
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.
« 1 2 »

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0