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.
Zobrazeno 15 zpráv z 15.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
