Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Špatný výpis z mysql

Aktivity
Avatar
Patrik Endršt:8.5.2016 17:37

Ahoj,

Potřebuji vybrat všechny dny, kdy byl někdo v práci, a zobrazit je na jeho řádku na stránce. skládá mi to dobře to, co potřebuji, ale vždy mi to zaznamená jen psolední den, kdy byl dotyčný v práci, ostatní to označí, jako by v práci nebyl.

Tady je kód:

$idede = 35;
                $dotaz2 = Mysql_Query("Select * from 2016_$idede") ;
                while ($hledameduplicitu = mysql_fetch_array($dotaz2)) {
                        if ($hledameduplicitu["den"] == $i and $hledameduplicitu["mesic"] == $aktualnimesic) {

                                $sloz = "<td>ano</td>";
                                 }
                                 else {
                                        $sloz = "<td>ne</td>";
                                 }

                }
                $radekdat =     $radekdat . $sloz;

Máte nějakou radu? Je tam někde chyba, které jsem si nevšiml?

Děkuji za radu. Už se nad tím trápím tak pár hodin, a nepodařilo se mi změnit výsledek.

 
Odpovědět
8.5.2016 17:37
Avatar
Odpovídá na Patrik Endršt
Martin Konečný (pavelco1998):8.5.2016 17:41

zdravim,

v první řadě to zavání špatným návrhem DB. Proč máš tabulku s názvem "2016_35"?
Můžeš ukázat strukturu tabulky a co obsahují proměnné $i a $aktualnimesic?

Nahoru Odpovědět
8.5.2016 17:41
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:8.5.2016 18:02

Každý uživatel má svojí tabulku 2016_35 <-35 je id uživatele. $i je 1-31 který počítá for pro každý den, $aktualnimesic má hodnotu 05 (číslo měsíce). V Tabulce je sloupek "den" a "mesic" každý obsahuje hodnotu Pro den a mesíc, pro který jsou vloženy. Podmínka má zjistit jestli je den a mesíc v tabulce, pokud ano, tak mají vypsat ano.

 
Nahoru Odpovědět
8.5.2016 18:02
Avatar
Odpovídá na Patrik Endršt
Neaktivní uživatel:8.5.2016 18:34

Tak to je dost pravděpodobně špatně. Uživatelé by měli mít společnou tabulku, tohle je fakt masochismus :)

Nahoru Odpovědět
8.5.2016 18:34
Neaktivní uživatelský účet
Avatar
Martin Konečný (pavelco1998):8.5.2016 18:38

Dynamické tabulky určitě nechceš. Přidej si spíš do té tabulky sloupec "uzivatel_id" a pak data vyfiltruješ přes WHERE.

SELECT * FROM tabulka WHERE uzivatel_id = (int) $idede

můžeš sem hodit celý script včetně toho foru?

Nahoru Odpovědět
8.5.2016 18:38
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Patrik Endršt
Neaktivní uživatel:8.5.2016 18:41

Tak by to mohlo fungovat, ale tabulky podle id uživatele jsou fakt špatný nápad

$idede = 35;
$dotaz2 = Mysql_Query("Select * from 2016_$idede") ;
$cells = [];
while ($hledameduplicitu = mysql_fetch_array($dotaz2)) {
    if ($hledameduplicitu["den"] == $i and $hledameduplicitu["mesic"] == $aktualnimesic) {
        $cells[] = "<td>ano</td>";
    } else {
        $cells[] = "<td>ne</td>";
    }
}
$radekdat .= implode( "", $cells );
Editováno 8.5.2016 18:42
Nahoru Odpovědět
8.5.2016 18:41
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Patrik Endršt:8.5.2016 19:24

Tak jsem vyzkoušel tohle řešení a bohužel to udělá každému uživateli na řádku asi 150x ne.

 
Nahoru Odpovědět
8.5.2016 19:24
Avatar
Odpovídá na Neaktivní uživatel
Patrik Endršt:8.5.2016 19:26

Myslel jsem, že udělat každému zvláštní tabulku bude jednodušší řešení, a nebude potom existovat jedna ohromná tabulka, kde bude tisíce řádků.Taky jsem myslel, že pokud ta tabulka nebode mít tolik řádků, tak by to odpovedědi vyhazovalo rychleji. :(

 
Nahoru Odpovědět
8.5.2016 19:26
Avatar
Odpovídá na Patrik Endršt
Martin Konečný (pavelco1998):8.5.2016 19:28

Když se podíváš ještě na můj komentář, taky odpověd na něj určitě pomůže ;)

pár řádků navíc (pár rozuměj klidně i statisíce) nemusí mít na výkon vůbec vliv. Určitě měj tu tabulku jen jednu

Nahoru Odpovědět
8.5.2016 19:28
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:8.5.2016 19:30

Tady je to kompletní včetně foru.

for ($i = 1; $i < ($vypis+1); $i++) {
                $idede = 35;
                $dotaz2 = Mysql_Query("SELECT * from 2016_$idede WHERE mesic = $aktualnimesic") ;
                $hledameduplicitu = mysql_fetch_array($dotaz2);
                        if ($hledameduplicitu["den"] == $i) {$sloz .= "<td>$i ano</td>"; }
                                 else {
                                 $sloz .= "<td> $i ne</td>";
                                 }


                $radekdat = $sloz;


        }

už je to trochu upravené, a vždy mi to vypíše první den, kdy je zadaná hodnota, ale pak už u žádných dalších ne. V podstatě jsem otočol předchozí problém.

Na obrázku je zobrazený výsledek na stránce. Bohužel by ANO mělo být od 2.5 - 5.5.
Ale je to jen 2.5.

 
Nahoru Odpovědět
8.5.2016 19:30
Avatar
Odpovídá na Patrik Endršt
Martin Konečný (pavelco1998):8.5.2016 19:47

no tady se zdá být problém, že pro každý den prohledáváš znovu celou tabulku, takže ti to vypíše tolikrát "ne", kolik je záznamů v té tabulce.

Co to zkusit nějak takhle?

$dotaz = mysql_query("SELECT * FROM tabulka WHERE mesic = $aktualniMesic ORDER BY den");
$data = array();
while ($radek = mysql_fetch_array($dotaz)) {
        $data[] = $radek;
}

for ($i = 1; $i < ($vypis + 1); $i++) {
        $nalezeno = FALSE;
        $vysledek = "ne";

        foreach ($data as $radek) {
                if ($radek["den"] == $i) {
                        $nalezeno = TRUE;
                        break;
                }
        }

        if ($nalezeno) {
                $vysledek = "ano";
        }

        echo "<td>{$vysledek}</td>";
}

psáno z hlavy a určitě by bylo i lepší řešení, ale nějak takto by ti to teoreticky mohlo fungovat.
Tady je cílem, že si nejdřív nataháš všechna data z DB do pole (abys pokaždý nemusel bombardovat chudáka databázi). Potom pojedeš jednotlivé dny (1 až $vypis + 1) a pro každý ten den se ti bude hledat shoda. Pokud se najde, nastaví se $nalezeno na TRUE a přeruší se další hledání pro daný den (když už víme, že se to našlo, neni třeba hledat dál).

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
8.5.2016 19:47
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:8.5.2016 20:51

Tak tohle mi nefunguje. Zkusím teď pořešit teda překopání na jednu velkou databázi, a pak zkusím tenhle kod znovu. Děkuji všem za rady. :)

 
Nahoru Odpovědět
8.5.2016 20:51
Avatar
Odpovídá na Patrik Endršt
Neaktivní uživatel:9.5.2016 3:21

Rychlostně by sis s více tabulkami asi moc nepomoh, případně by rychlostní nedostatky jedné tabulky při velkém počtu uživatelů vyřešil index. Mít uživatele v samostatných tabulkách nemá snad žádnou výhodu a za ty starosti okolo to určitě nestojí :)

Nahoru Odpovědět
9.5.2016 3:21
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Patrik Endršt:10.5.2016 17:15

Tak jsem předělal databázi tak, aby se všechno házelo do jendé tabulky. Tese to snažím vyypisovat takhle. Bohužel tam je pořád chyba a ukazuje to jen jeden den pro uživatele, kdy byl v práci.

Přikládám obrázek vou řádků, kde jsem červeně zvýraznil buňky, kde má být podle databáze "ANO", ale stále to ukazuje NE.

Doufám, že jsem to teď napsal srozumitelně.

$aktualnimesice = 05;
        while($polozka = mysql_fetch_array($dotaz)){
        $jmenosloupek = "<td>".$polozka['jmeno']." ".$polozka['prijmeni']."</td>";
        echo $ideuzivatele . $aktualnimesic;
        $ideuzivatele = $polozka['id'];
        $dotaz2 = mysql_query("SELECT * FROM uzivatele WHERE usr_id = $ideuzivatele AND mesic = $aktualnimesice");
        $radekdat = "";
        $hledameduplicitu = mysql_fetch_array($dotaz2);
        for ($i = 1; $i < ($vypis+1); $i++) {
        if ($hledameduplicitu["den"] == $i) {$sloz = "<td>$i ano</td>"; }
                                 else {
                                 $sloz = "<td> $i ne</td>";
                                 }

        $radekdat = $radekdat . $sloz;
        }


        echo "<tr>".$jmenosloupek.$radekdat."</tr>";
        }

        echo '</table>';
 
Nahoru Odpovědět
10.5.2016 17:15
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:10.5.2016 23:28

NAkonec jsem řešení našel díky tomuto řešení od Martin Konečný. až na ten detail, že celá tabulka přebere data podle prvního uživatele, kterého proskenuje.

Celý kód nyní vypadá takhle:

$aktualnimesice = 05;
while($polozka = mysql_fetch_array($dotaz)){
        $jmenosloupek = "<td>".$polozka['jmeno']." ".$polozka['prijmeni']."</td>";

        $ideuzivatele = $polozka['id'];
        $dotaz2 = mysql_query("SELECT * FROM uzivatele WHERE usr_id = $ideuzivatele AND mesic = $aktualnimesice ORDER BY den");

        while ($hledameduplicitu = mysql_fetch_array($dotaz2)) {
        $data[] = $hledameduplicitu;
        }

        $radekdat = "";
        for ($i = 1; $i < ($vypis+1); $i++) {

         $nalezeno = FALSE;
     $vysledek = "ne";

        foreach ($data as $radek) {
            if ($radek["den"] == $i) {
                 $nalezeno = TRUE;
                 break;
                 }
                }

        if ($nalezeno) {
           $vysledek = "ano";
                        }

$sloz = "<td>". $vysledek ."</td>";
$radekdat = $radekdat . $sloz;
}


echo "<tr>".$jmenosloupek.$radekdat."</tr>";
}

Mám tam pořád někde tedy nějakou chybu. Bohužel na to nejsme schopný pořád sám přijít.

 
Nahoru Odpovědět
10.5.2016 23:28
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.