Autor | Zpráva | ||
---|---|---|---|
bimbop Profil |
Dobrý den,
Potřebuji poradit s výpisem záznamů. Jedná se zaznamenávání provedených prací pomocí checkboxu. Jednoduše vypsat tabulku nejde použít ve výpisu mohou chybět záznamy nebo být nekompletní. Tabulka výpisu by měla vypadat takto: ________ pondělí úterý středa čtvrtek pátek operace_1 __ano __ne __ne ___ano __ano operace_2 __ano __ne __ne ___ano __ano operace_3 __ano __ne __ne ___ano __ano operace_4 __ano __ne __ne ___ano __ano operace_5 __ano __ne __ne ___ano __ano operace_6 ___ne __ne __ne ___ne ___ano operace_7 ___ne __ne __ne ___ne ___ano operace_8 ___ne __ne __ne ___ne ___ano operace_9 ___ne __ne __ne ___ne ___ano zadal____ jméno __nic __nic _jméno _jméno Záhlaví tabulky je pevné jedná se o aktuální týden Zkoušel jsem podle tohoto ale nejde to. |
||
anonym_ Profil * |
#2 · Zasláno: 10. 10. 2020, 13:19:57
bimbop:
Ukaž kód, který jsi zkoušel a strukturu dat. |
||
bimbop Profil |
anonym:
Kód je podle odkazovaného příspěvku. $tab = array(); for($j=0;$j<5;$j++) { $tab = array(); for($i=0;$i<16;$i++) {$tab[$j] = array();} } $sql = 'SELECT `pec_machine_maintenance`.`id` , `pec_machine_maintenance`.`created_on` , `pec_machine_maintenance`.`item_id` , `pec_machine_maintenance`.`item_state` FROM `php_event_calendar`.`pec_machine_maintenance` INNER JOIN `php_event_calendar`.`pec_maintenance` ON (`pec_machine_maintenance`.`item_id` = `pec_maintenance`.`id`) ORDER BY `pec_machine_maintenance`.`created_on` ASC'; $res = $mysqli->query($sql); $row=$res->fetch_array();var_dump($row); if ($res->num_rows >0){ while ($row=$res->fetch_array() && list($id,$j,$i,$value) = $row) {$tab[$j][$i] = $value;} $tbody = ''; for($j=0;$j<5;$j++) { $tr = ''; for($i=0;$i<15;$i++) {$tr.='<td>'.$tab[$j][$i].'</td>';} $tbody.='<tr>'.$tr.'</tr>'; } echo '<table>'.$tbody.'</table>'; } else echo('chyba'); 2 tabulky První tabulka: operace s id, název Druhá tabulka: záznamy s id, datum, id_operace, stav_operace, jméno_zadavatele |
||
Serg Profil |
Jak to říct, aby to nebylo rozepsané na 10 řádků :D
Skript při vytváření buňěk tabulky počítá s tím, že dostane ve 2D pole s číselnými indexy, to sice dostane, díky tomu že se to pole takto ještě před taháním dat z databáze vytvořilo. Ale potom by se měly některé prvky pole na určitých pozicích přepsat daty vytaženými z databáze. Místo toho se ale v poli vytvoří nové prvky s klíčem např.: [1][2020-10-05], [3][2020-10-07] atd. Takže bude potřeba datum zkonvertovat do čísla 0 - 5 (případně 1 - 6), to by mohla funkce WEEKDAY v SQL dotazu nebo date("w", $datum) v php a potom upravit rozsah ve for cyklu. Ale co s tím id operace? Bude potřeba zajistit aby id šly vždy zasebou, jinak by v tabulce vznikaly prázdné řádky.
Další možností je místo for použít foreach, ale tam bude asi trochu složitější příprava dat. Navrhuju ten kód zatím zkusit upravit takle: // Pripraveni dat tabulky $tab = array(); for ($indexDne = 1; $indexDne < 6; $indexDne++) { // 1 pro pondeli, 6 pro patek for ($idOperace = 1; $idOperace < 16; $idOperace++) { $tab[$indexDne][$idOperace] = false; } } $sql = "SQL DOTAZ..."; $res = $mysqli->query($sql); while ($row = $res->fetch_array()) { list($id, $idOperace, $datum, $value) = $row; $indexDne = date("w", $datum); // Prepsani prvku vytazenymi daty z DB $tab[$indexDne][$idOperace] = (bool) $value; } // Vypsani dat z pole do tabulky $tbody = ""; for ($indexDne = 1; $indexDne < 6; $indexDne++) { $tr = ""; for ($idOperace = 1; $idOperace < 16; $idOperace++) { $value = $tab[$indexDne][$idOperace]; $text = $value ? "ano" : "ne"; $tr .= "<td>$text</td>"; } $tbody .= "<tr>$tr</tr>"; } echo "<table>$tbody</table>"; A samozřejmě do SQL dotazu bude potřeba přidat WHERE a omezit výběr jen na požadovaný týden. |
||
anonym_ Profil * |
#5 · Zasláno: 11. 10. 2020, 10:20:47
Serg:
Ono to, co jsi napsal, asi funguje, ale ty konstrukce se mi zdají takové vychrlaté... :-) Ty dva cykly na řádcích 2-7 jsou úplně zbytečné, navíc omezuješ počet řádků, kterých nevíš, kolik bude. Pak ř. 17/28, které jdou proti sobě a jsou takto v kombinaci trochu hloupé. $tab[$indexDne][$idOperace] = (bool) $value; vs. $value = $tab[$indexDne][$idOperace];
Atd... Ale fungovat to asi bude. |
||
bimbop Profil |
#6 · Zasláno: 11. 10. 2020, 10:28:59
Serg:
Díky moc tohle tabulku vytvoří. Data umístí jen jsou posunutá o jeden den později. Nic nezmění požití date("w", $datum) nebo WEEKDAY . Podle zadání musí tabulka vypadat jak je uvedeno. Potřebuju jen ošetřit když obsluha zapomene uložit provedené operace a taky ještě dny do konce týdne kdy ještě k provedení operací nemohlo dojít. anonym_: Sloupce a řádky jsou pevně dané dny v týdnu / počet operací. |
||
lionel messi Profil |
#7 · Zasláno: 11. 10. 2020, 10:42:47
bimbop:
„Data umístí jen jsou posunutá o jeden den později. Nic nezmění požití date("w", $datum) nebo WEEKDAY .“ Parameter "w" pre date vracia 0 až 6 (pondelok je 0), skús: $indexDne = date("N", $datum); //pondelok bude 1, funguje od PHP 5.1.0, ale to hádam nie je problém |
||
anonym_ Profil * |
bimbop:
„Sloupce a řádky jsou pevně dané dny v týdnu / počet operací.“ Počet operací je dán i počtem dat v databázi. Nebo přidáním operace budeš kromě přidání záznamu do DB měnit i obslužný PHP kód? „Potřebuju jen ošetřit když obsluha zapomene uložit provedené operace“ Nějaká hodnota se do tabulky propíše vždy, buď ano, nebo ne. Defaultní hodnota dle kódu výše je "ne". „a taky ještě dny do konce týdne kdy ještě k provedení operací nemohlo dojít.“ Dnešní datum najdeš v date('Y-m-d') . Pak je to jen o podmínce, zda je dnešní datum větší než nevyplněný záznam v tabulce, záznam ještě být vyplněn nemohl.lionel messi: „Parameter "w" pre date vracia 0 až 6 (pondelok je 0), skús:“ Nikoliv, vrací sice 0-6, ale 0 je neděle. |
||
bimbop Profil |
anonym:
„Počet operací je dán i počtem dat v databázi. Nebo přidáním operace budeš kromě přidání záznamu do DB měnit i obslužný PHP kód?“ Přidání operace půjde přes formulář a počet operací se zjistí přes num_row. Posunutí vyřešeno iterací =0, <5. Použito v SQL dotazu WEEKDAY . |
||
bimbop Profil |
#10 · Zasláno: 11. 10. 2020, 14:44:36
Děkuji všem za pomoc. Tabulka včetně dat je podle zadání mimo zobrazení popisu operace.
|
||
Serg Profil |
Popisem se myslí název? Tož to není takový problém dodělat, zároveň se tím vyřeší momentální "hardcoded" počet řádků.
Někde před vytvořením tabulky: (pozn.: netuším jak se jmenuje sloupec s názvem operace / akce) $nazvyOperaci = array(); $resNazvy = $mysqli->query("SELECT id, nazev FROM pec_maintenance"); while ($row = $resNazvy->fetch_array()) { list($id, $nazev) = $row; $nazvyOperaci[$id] = $nazev; } Vytvoření tabulky upravit přibližně takto: $tbody = ""; $tr = ""; $dny = array("pondeli", "utery", "streda", "ctvrtek", "patek"); foreach ($dny as $den) { $tr .= "<td>$den</td>"; } $tbody .= "<tr><td></td>$tr</tr>"; foreach ($nazvyOperaci as $id => $nazev) { $tr = "<td>$nazev</td>"; for ($indexDne = 0; $indexDne < 5; $indexDne++) { $value = $tab[$indexDne][$id] ?? false; // null coalescing operator $text = $value ? "ano" : "ne"; $tr .= "<td>$text</td>"; } $tbody .= "<tr>$tr</tr>"; } echo "<table>$tbody</table>"; |
||
Kajman Profil |
#12 · Zasláno: 12. 10. 2020, 10:26:52
bimbop:
Proč máte pod sloupecem jedno jméno, když může být podle struktury tabulek pro každou buňku jiné? Nebylo by lepší do buněk psát místo "ano" jména a buňku např. zeleně podbarvit? |
||
bimbop Profil |
#13 · Zasláno: 12. 10. 2020, 16:12:48
Kajman:
Všechny operace provádí za den pouze jeden člověk. Připadá mi tudíž přehlednější mít v políčku odškrtnutí tady zástupně ano : ne. |
||
bimbop Profil |
#14 · Zasláno: 12. 10. 2020, 17:52:06
Serg:
Názvy operací jsou ok tabulka ok jen data v ní nesedí dá to třeba ano do celého sloupce když má být jen 9x obrázek Ve spodním řádku mají být jména. Nějak se v tom ztrácím. |
||
Serg Profil |
Co vypíše:
var_dump($tab); před vytvářením tabulky (po zapsání dat z DB do pole)?
Jména tu zatím nikdo neřešil, to bude možná ten důvod proč tam nejsou :D Na jména bude potřeba vědět víc o struktuře DB, je na to extra tabulka? (jakože kdy má kdo "službu") Napadá mě, jestli nejsou prohozené $indexDne a $idOperace, připadně jak jsou jinak pojmenované ty proměnné. V tomhle použití fetch_array() a list() nejsou moc safe. |
||
bimbop Profil |
Serg:
$indexDne a $idOperace jsem prohodil tam problém není. var_dump($tab) je úplně stejný jako v případě bez názvů operací. Vložit zde mi nejde. PS Mea culpa. Kde mělo být $id jsem přepsal za $idOperace. řadí to ok. |
||
Časová prodleva: 4 dny
|
|||
bimbop Profil |
#17 · Zasláno: 16. 10. 2020, 11:38:56
Ještě malý dotaz.
$value = $tab[$indexDne][$id] ?? false; // null coalescing operator |
||
Keeehi Profil |
#18 · Zasláno: 16. 10. 2020, 11:47:59
bimbop:
Nastav si v phpDesigner správně verzi PHP na tu co je na serveru a už ti to nebude házet chybu. Máš tam totiž nastavené, že se syntaxe má kontrolovat posle nějaké staré verze. |
||
bimbop Profil |
#19 · Zasláno: 16. 10. 2020, 12:56:50
Keeehi:
Díky pomohlo |
||
bimbop Profil |
#20 · Zasláno: 16. 10. 2020, 17:04:23
Ach jo ještě jeden zádrhel mám. Chci přidat ještě jeden řádek tabulky ale nevyplní ho správně.
Kód: //Pole $tab2 vypisuje: array(4) { [0]=> array(1) { [9]=> string(13) "Matěj Janiš" } [1]=> array(1) { [9]=> string(13) "Matěj Janiš" } [3]=> array(1) { [9]=> string(13) "Matěj Janiš" } [4]=> array(1) { [1]=> string(12) "Petr Klimsza" } } //Procházím ho: $tr2 = ""; for ($indexDne = 0; $indexDne < 5; $indexDne++) { $valueName = $tab2[$indexDne][$idName] ?? false; $text2 = $valueName ? $valueName : ""; $tr2 .= "<td>".$text2."</td>"; } //toto vypíše jen poslední. |
||
Serg Profil |
#21 · Zasláno: 16. 10. 2020, 17:48:38
Tady už není potřeba 2D pole, mělo by stačit jen pole pro jména podle dnů v týdnu. Jak vypadá SQL dotaz a vytváření pole?
Pole by mělo ve výsledku vypadat nějak takto: array(0 => "Jmeno pro pondeli", "Jmeno pro utery", "..stredu", "..ctvrtek", "..patek"); A procházet ho potom jako obyčejné 1D pole: $tr2 = ""; for ($indexDne = 0; $indexDne < 5; $indexDne++) { $valueName = $tab2[$indexDne] ?? "<i>nikdo</i>"; $tr2 .= "<td>".$valueName."</td>"; } |
||
Kajman Profil |
#22 · Zasláno: 16. 10. 2020, 19:46:34
bimbop:
„V čem je zakopaný pes“ Asi v kódu, který jste neukázal. Ten kousek v ukázce vypadá funkční. |
||
bimbop Profil |
#23 · Zasláno: 16. 10. 2020, 20:35:06
Kajman:
Skutečně v odkazu dělá co bylo záměrem. Bohužel na lokálu vypisoval jen poslední jméno. Každopádně procházením 1D polem podle [#21] Serg je po problému. |
||
Serg Profil |
#24 · Zasláno: 17. 10. 2020, 15:50:17
Uplně jsem zapomněl na ochranu před XSS, takže doporučuju to jméno obalit funkcí
htmlspecialchars() jak udělal Kajman v té ukázce.
A taky se nespoléhat jen na pořadí ve kterém příjdou data z DB, ale spíš na skutečné datumy. Myslím tím, kdyby byl nějaký den třeba svátek, dejme tomu ve středu, tak by se asi čekalo, že bude poslední řádek v tabulce vypadat takhle: Karel, Marek, nikdo, Ondra, Vašek Karel, Marek, Ondra, Vašek, nikdo |
||
bimbop Profil |
Serg:
Pole chodí s indexem číslo dne. Zatím se problém s vynechanými dny neprojevil. Přestože vrací libovolný počet řádků umisťuje jména podle toho jak patří. |
||
bimbop Profil |
#26 · Zasláno: 19. 10. 2020, 15:02:34
Ještě jednou všem děkuji. Načítání a zobrazení je podle zadání ok. Teď bych ještě potřeboval nakopnout jak dostat pro stránkování datum
DATEDIFF() po týdnu bez ohledu na počet záznamů.
|
||
Serg Profil |
#27 · Zasláno: 19. 10. 2020, 15:25:45
Nepoužíval bych funkci na sloupec ve WHERE podmínkách, to znemožní použítí indexu pro rychlé vyhledávání. Lepší bude spočítat počáteční a konečné datum daného týdne a použít operátor BETWEEN.
SELECT ... WHERE datum BETWEEN '2020-10-12' AND '2020-10-16' Pro vytvoření obou datumů podle zadaného čísla týdne a roku se lze inspirovat zde: PHP get start and end date of a week by weeknumber Případně, pokud se bude stránkovat podle datumu, tak třeba zde: Get first/last day of week in php? (tady by asi chtělo ošetřit, kdyby někdo zadal sobotu nebo neděli, potom by to vyhledalo záznamy pro 2 týdny - minulé pondělí až příští pátek) |
||
bimbop Profil |
Uf jsem napůl šílený. Jdu ještě s prosbou. Nedaří se mi odchytit ajaxem get ani post. Get se sice do řádku vypíše ale ve scriptu není nic. Post ani netuším co dělá nevidím ho ani v konzoli.
|
||
Kajman Profil |
Ajax není na odchytávání požadavků get a post. Slouží k odeslání požadavku na server a zpracování odpovědi.
Jak si myslíte, že Vám pomůžeme bez živé ukázky nebo křišťálové koule? |
||
bimbop Profil |
Fragmenty kódu kterého se týká problém:
soubor s ajax stranka.php $( "#prev_week" ).click(function(prev_week) { prev_week.preventDefault(); var formData = $('#prev').serializeArray(); var jqxhr = $.ajax({ type: "POST", url: "<?php echo ABS_PATH?>/server/html/stranka.php", data: formData }) .done(function () { console.log('obsah: '+formData) }) .fail(function () { alert('obsah není ') }) }); if(isset($_POST['date_prev'])){ $stav = htmlspecialchars($_POST['date_prev']); echo 'Datum: ' .$stav; } <form id="prev" method="post"> <button id="prev_week" type="button" class="btn btn-default"><?php echo 'Týden: ' .$prev_monday. ' - ' .$prev_sunday;?></button> <input type="hidden" value="<?php echo $nextmon; ?>" name="date_prev" id="date_prev" /> </form> <form id="next" method="post"> <button id="next_week" type="button" class="btn btn-default"><?php echo 'Týden: ' .$next_monday. ' - ' .$next_sunday;?></button> <input type="hidden" value="<?php echo $actualmon; ?>" name="date_next" id="date_next" /> </form> |
||
Téma pokračuje na další straně.
|
0