Autor Zpráva
Andrej.B
Profil
Zdravim,

potrebujem vypisat tyzden z datumu, ktory si generujem po Selecte z db.

$datum_check = $row_datum_all['Datum'];
$datumchange = date("d.m.Y", strtotime($datum_check));

$date = new DateTime($datumchange);
$week = $date->format("W");

Pri vypise by som potreboval pri kazdom novom tyzdni, napisat, co je to za tyzden, vypisat datumy a dat novy riadok.

Cize
46 tyzden - 15.11.2021, 16.11.2021<br>
47 tyzden - 23.11.2021, 25.11.2021<br>
48 tyzden - 3.12.2021<br>

atd.
Ako na logiku toho vypisu?
Dakujem
anonym_
Profil *
Andrej.B:
Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze
Andrej.B
Profil
Diky,
zatial to mam takto:
SELECT WEEK(Datum) as week, YEAR(Datum) as year
FROM plan 

Group BY WEEK(Datum), YEAR(Datum)
Order By YEAR(Datum), WEEK(Datum)

while ($row_datum_all = $check_datum_all->fetch_array()) 
    {
$year =        $row_datum_all['year'];
$week =        $row_datum_all['week'];
$pamet = '';
$pamet2 = '';



        if ($week != $pamet)
            {
                $pamet = $week;
                echo "<b>$pamet</b><br>";
                
            }
}
    
Zobrazi ako ma:
46
47
48
49
50
51
1
5

Ako do toho este zapracovat ten rok, aby to ukazovalo takto?

2021
46
47
48
49
50
51

2022
1
5
anonym_
Profil *
Andrej.B:
Ako do toho este zapracovat ten rok, aby to ukazovalo takto?
Úplně stejně, jako se pracuje s tím týdnem. Zkus se nad tím prosím trochu zamyslet. Celý ten okopírovaný kód z FAQ má 16 řádků, zkus je pochopit, co dělají a pak ty 3 řádky přidáš snadno sám.
blaaablaaa
Profil
Andrej.B:
A ten skript ti aktuálně dělá to, co chceš? Podle ukázky ti jen vypíše týdny, ale už nevytahuje jednotlivé datumy, jak jsi chtěl v zadání.

Navíc v tvém skriptu je následující část nesmyslná ($pamet u tebe bude vždy prázdný string, ta inicializace proměnné patří mimo cyklus).

$pamet = '';
        if ($week != $pamet) {..}
Andrej.B
Profil
blaaablaaa:
A ten skript ti aktuálně dělá to, co chceš? Podle ukázky ti jen vypíše týdny, ale už nevytahuje jednotlivé datumy, jak jsi chtěl v zadání.
>
Navíc v tvém skriptu je následující část nesmyslná ($pamet u tebe bude vždy prázdný string, ta inicializace proměnné patří mimo cyklus).

Tak daleko som nepresiel. Chcel som tie tyzdne najskor, ze to bude v dalsom kroku v pohode, ale nieje.
Pozeram, ze to musim najskor prejst ako rok...

$q = "
SELECT WEEK(Datum) as week, YEAR(Datum) as year, Datum
FROM plan 

Group BY WEEK(Datum), YEAR(Datum)
Order By YEAR(Datum), WEEK(Datum)
";    
$check_datum_all = $conn->query($q);
echo $q.'<br>';
$pamet = '';
$pamet2 = '';
while ($row_datum_all = $check_datum_all->fetch_array()) 
    {
$datum_check = $row_datum_all['Datum'];
$datumchange = date("d.m.Y", strtotime($datum_check));
$year =        $row_datum_all['year'];
$week =        $row_datum_all['week'];

    if ($year != $pamet)
            {
                
                $pamet = $year;
                echo "<b>$pamet</b><br>";
                
            
            }
        
        

                                                

    }                            

Pravdepodobne nejako vnorene az k tym dnom?
While year
echo rok
While week
echo week
While day
echo day

Ale takto v jednom mi to pride, ze musim mat 3 krat Select na DB, podla year, week a nakoniec day. Alebo to zle chapem.

A nakoniec poskladat
year 2021
week 46
day 2021-11-16

week 47
2021-11-22
2021-11-23
week 48
2021-11-29
2021-11-30
2021-12-04
week49
Atd
50
51


year 2022
1
atd
5
2022-02-01

prilis tazke na mna.
blaaablaaa
Profil
Nedoporučuji používat v dotazech klíčová slova jako názvy položek (year, week, ...), taky není dobré míchat češtinu a angličtinu, rozhodni se pro jedno a to používej. V kódu správně odsazuj (nebo to nech na IDE - které ti samo kód naformátuje).
Není třeba GROUPovat - chceš vypsat všechny (stačí si dotaz spustit v nějakém GUI - adminer/phpmyadmin/..., abys viděl výsledek). Taky není třeba řadit podle roku a týdne, seřaď to přímo podle data.
$q = "SELECT WEEK(Datum) AS plan_week, YEAR(Datum) AS plan_year, Datum AS plan_date FROM plan ORDER BY plan_date"; 

V PHP pak stačí jeden cyklus:
$year_actual = null; //tady si ulozis aktualni rok v cyklu
$week_actual = null; //tady si ulozis aktualni tyden v cyklu
while ( $row_datum_all = $check_datum_all->fetch_array() ) 
{
    $date_change = date("d.m.Y", strtotime($row_datum_all['plan_date']));
    $year = $row_datum_all['plan_year'];
    $week = $row_datum_all['plan_week'];
 
    if ( $year !== $year_actual )
    {
        if (  $year_actual ) 
        { 
            echo '<br>'; //radek nad rokem, ale pouze u 2. a dalsiho roku ve vypise
        }
        echo "<b>$year</b><br>";
        $year_actual = $year;
    }
    
    if ( $week !== $week_actual )
    {
        echo "<b>$week</b><br>";
        $week_actual = $week;
    }
        
    echo $date_change.'<br>';
}      
anonym_
Profil *
Andrej.B:
Ale takto v jednom mi to pride, ze musim mat 3 krat Select na DB, podla year, week a nakoniec day. Alebo to zle chapem.
Ne, bude tam jeden dotaz na DB, jeden cyklus a budeš si pamatovat a porovnávat 3 různé proměnné (v ukázkovém kódu je jedna nazvaná $pamet. Ty budeš mít $lastYear, $lastWeek, $lastDay a porovnávat s rokem/týdnem/dnem, který má aktuálně procházený řádek z databáze. Podle toho se rozhodneš, jestli (a jakou) hlavičku vypíšeš, nebo jestli vypíšeš jen ten záznam.
Andrej.B
Profil
Toto je jedine co ma napadlo, na 3 krat select.

$q_year = "
SELECT YEAR(Datum) as year
FROM plan 

Group BY  YEAR(Datum)
Order By YEAR(Datum)
";    
$check_datum_year = $conn->query($q_year);
//echo $q_year.'<br>';

while ($row_datum_year = $check_datum_year->fetch_array()) 
    {
    echo $row_datum_year['year'];
    echo '<br>';
            $q_week = 
            "
            SELECT WEEK(Datum) as week
            FROM plan 
            WHERE YEAR(Datum) = '".$row_datum_year['year']."'
            Group BY  WEEK(Datum)
            Order By WEEK(Datum)
            ";    
            $check_datum_week = $conn->query($q_week);
            //echo $q_week.'<br>';
                while ($row_datum_week = $check_datum_week->fetch_array()) 
                    {
                    echo $row_datum_week['week'];
                    echo '<br>';
                            $q_day = 
                            "
                            SELECT  Datum as day
                            FROM plan 
                            WHERE WEEK(Datum) = '".$row_datum_week['week']."'
                            Group BY  day
                            Order By day
                            ";    
                            $check_datum_day = $conn->query($q_day);
                            //echo $q_day.'<br>';
                                while ($row_datum_day = $check_datum_day->fetch_array()) 
                                    {
                                    echo $row_datum_day['day'];
                                    echo '<br>';
                                    }    
                    }    
                        
    }



uf pozeram, ze tu pribudli prispevky. Idem pozriet, dakujem.
Andrej.B
Profil
Vypada to super. Dakujem.

Ak sa to dobre pochopil, tak v cykle ide vzdy:
cyklus plan_year    plan_week    plan_date
1       2021          46          2021-11-16
2       2021          47          2021-11-22
3       2021          47          2021-11-23
4       2021          47          2021-11-24
5       2021          47          2021-11-25
6       2021          47          2021-11-26
7       2021          47          2021-11-27
8       2021          48          2021-11-28
9       2021          48          2021-11-29

Atd

a vzdy pozrie, ci je splnena podmienka v tom IF a podla toho zobrazi..
anonym_
Profil *
Andrej.B:
Ano. Ale to se dá snadno ověřit tím, že si ty proměnné před tou podmínkou vypíšeš a uvidíš, co v nich je/není.
Andrej.B
Profil
anonym:
dava mi to konecne zmysel. je to aj cistejsie.
Dal som si aj test na cas, ale priemer s 30 cyklov to mam 0.021s /1 select/ vs 0.025s /3 select/ .

Super, blaaablaaa a anonym dakujem. Vzdy sa tu pomoze.
Andrej.B
Profil
a ako to vypada v praxi. Diky este raz

Andrej.B
Profil
blaaablaaa:
$q = "SELECT WEEK(Datum) AS plan_week, YEAR(Datum) AS plan_year, Datum AS plan_date FROM plan ORDER BY plan_date"; 

Ak by to niekto potreboval, tak toto ukazuje start tyzdna ako Nedela. Staci si potom upravit WEEK(Datum) na WEEK(Datum,1) , kde 1 znamena pondelok ako zaciatok tyzdna, defualtne je to 0 a teda Nedela.

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