Diskuze: Špatný výpis z mysql
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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?
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.
Tak to je dost pravděpodobně špatně. Uživatelé by měli mít společnou tabulku, tohle je fakt masochismus
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?
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 );
Tak jsem vyzkoušel tohle řešení a bohužel to udělá každému uživateli na řádku asi 150x ne.
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.
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
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.
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).
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.
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í
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>';
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.
Zobrazeno 15 zpráv z 15.