« 1 2 »
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 *
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>";
Jestli tam nebude žádný další problém tak výsledkem by zatím měla být jen tabulka (mřížka) 5x16 s buňkami ano / ne (bez nadpisů řádek a sloupců, nejdřív rozchodit aspoň tohle).

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 *
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
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
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
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
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
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
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.
bimbop
Profil
Ještě malý dotaz.
$value = $tab[$indexDne][$id] ?? false; // null coalescing operator
tohle mi v phpDesigner hází chybu syntaxe unexpeted '?'. Mám to ignorovat když zobrazení a vše ostatní je v pořádku?
Keeehi
Profil
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
Keeehi:
Díky pomohlo
bimbop
Profil
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í.
V čem je zakopaný pes?
Serg
Profil
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
bimbop:
V čem je zakopaný pes

Asi v kódu, který jste neukázal. Ten kousek v ukázce vypadá funkční.
bimbop
Profil
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
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
ale pokud DB vrátí jen 4 řádky a do pole se jména uloží jak přišly - obyč. přidáním nového prvku (s automatickým indexováním), tak to dopadne takto:
Karel, Marek, Ondra, Vašek, nikdo
Proto jsem se ptal i na to jak vypadá SQL dotaz a ukládání do pole. Třeba to už je vyřešené, ale kdyby ne, tak taky doporučuju dořešit :D
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
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
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í ')
            })
    });
soubor se spracováním stranka.php
if(isset($_POST['date_prev'])){
$stav = htmlspecialchars($_POST['date_prev']);
echo 'Datum: ' .$stav;
}
ješte html stranka.php
        <form id="prev" method="post">
          <button id="prev_week" type="button" class="btn btn-default"><?php echo 'Týden: &nbsp;' .$prev_monday. '&nbsp;-&nbsp;' .$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: &nbsp;' .$next_monday. '&nbsp;-&nbsp;' .$next_sunday;?></button>
          <input type="hidden" value="<?php echo $actualmon; ?>" name="date_next" id="date_next" />
          </form>
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0