Avatar
Patrik Endršt:

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. května 17:37
Avatar
Odpovídá na Patrik Endršt
Martin Konečný (pavelco1998):

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  +2 8. května 17:41
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:

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. května 18:02
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Patrik Endršt
Jiří Gracík:

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  +3 8. května 18:34
Creating websites is awesome till you see the result in another browser ...
Avatar
Martin Konečný (pavelco1998):

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. května 18:38
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Patrik Endršt
Jiří Gracík:

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. května 18:42
Nahoru Odpovědět 8. května 18:41
Creating websites is awesome till you see the result in another browser ...
Avatar
Odpovídá na Jiří Gracík
Patrik Endršt:

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. května 19:24
Avatar
Odpovídá na Jiří Gracík
Patrik Endršt:

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. května 19:26
Avatar
Odpovídá na Patrik Endršt
Martin Konečný (pavelco1998):

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  +2 8. května 19:28
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:

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. května 19:30
Avatar
Odpovídá na Patrik Endršt
Martin Konečný (pavelco1998):

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +2 8. května 19:47
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:

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. května 20:51
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Patrik Endršt
Jiří Gracík:

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  +2 9. května 3:21
Creating websites is awesome till you see the result in another browser ...
Avatar
Odpovídá na Jiří Gracík
Patrik Endršt:

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. května 17:15
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Patrik Endršt:

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. května 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.