Olen tekemässä kalenteria, johon voi MySQL:n kanssa lisätä varauksia tietyille päiville. Ajattelin ensin saada kalenterin kunnolla toimimaan ennenkuin MySQLiä rupean räveltämään sinne. Noniin, alla on siis koodi...
<?php //nykyinen vuosi $n_year = date("Y"); //nykyinen kuukausi $n_month = date("m"); //tehdää kuukaudelle teksti joka näytetään boldattuna kalenterin yläpuolella switch($n_month) { case 1: $name_of_month = "Tammikuu"; break; case 2: $name_of_month = "Helmikuu"; break; case 3: $name_of_month = "Maaliskuu"; break; case 4: $name_of_month = "Huhtikuu"; break; case 5: $name_of_month = "Toukokuu"; break; case 6: $name_of_month = "Kesäkuu"; break; case 7: $name_of_month = "Heinäkuu"; break; case 8: $name_of_month = "Elokuu"; break; case 9: $name_of_month = "Syyskuu"; break; case 10: $name_of_month = "Lokakuu"; break; case 11: $name_of_month = "Marraskuu"; break; case 12: $name_of_month = "Joulukuu"; break; } //nykyinen päivä $n_day = date("d"); //funktio, jolle annetaan arvo, jonka avulla otetaan viikonpäivä selville, ja palautetaan sen suomenkielinen lyhenne function name_of_day($name_of_day) { switch($name_of_day) { case '0': $name_of_day = "Ma"; break; case '1': $name_of_day = "Ti"; break; case '2': $name_of_day = "Ke"; break; case '3': $name_of_day = "To"; break; case '4': $name_of_day = "Pe"; break; case '5': $name_of_day = "La"; break; case '6': $name_of_day = "Su"; break; } return $name_of_day; } //nykyisen kuukauden päivät $days_in_this_month = date("t"); //tulostetaan nykyinen kuukausi ja vuosi echo "<center><b>$name_of_month $n_year</b></center>"; echo "<table border='0' align='center'><tr>"; //tulostetaan jokaisen viikonpäivän lyhenne for($i = 0; $i < 7; $i++) { $name_of_day = name_of_day($i); echo "<td><small>$name_of_day</small></td>"; } echo "</tr>"; //mennään silmukkaan, joka toistuu 5 kertaa, sillä 5*7 = 35 ja kuukaudessa on maksimissaan 31 päivää for($i = 0; $i < 5; $i++) { //muunnetaan käsittelyssä oleva päivämäärä merkkijonoksi ($o lisääntyy alempana) $b = strtotime(date("$o.m.Y")); //otetaan $b:stä käsittelyssä olevan päivämäärän viikonpäivän numero $a = date("w", $b); //otetaan $b:n kuukaudesta päivien määrä $days_in_this_month = date("t", $b); echo "<tr>"; //viikko-silmukka for($n = 1; $n <= 7; $n++) { //jos viikonpäivä on isompi kuin $a, joka on viikonpäivän numero käsittelyssä olevasta päivämäärästä, jos ei, tulostetaan tyhjä taulukon solu if($n >= $a) { //lisätään päivämäärää $o++; //jos päivämäärä on pienempi tai yhtäkuin nykyisen kuukauden päivät... if($o <= $days_in_this_month) { //...ja jos päivä on sama kuin nykyinen päivä.... if($o == $n_day) { //...tulostetaan lihavoitu luku echo "<td width='60' height='60'><b>$o</b></td>"; } else { //...tulostetaan normaali luku echo "<td width='60' height='60'>$o</td>"; } } else { break; } } else { echo "<td width='60' height='60'></td>"; } } echo "</tr>"; } echo "</table>"; ?>
Ja nyt itse ongelmaan. Siis, nyt jos tuon koodin laittaa php-tiedostoon ja katsoo, näkee tammikuun 2009 kalenterin, nykyisen päivän vahvistettuna. Jopa päivät osuvat viikonpäivien kohtaan. Mutta sitten, siirretään tietokoneen kelloa kuukaudella eteenpäin, ja mitä näemmekään, kalenteri näyttää aivan väärin. Helmikuun ensimmäisen päivänhän tulisi olla sunnuntai, ei torstai kuten tammikuussa, eikä kalenterissa tunneta kahta tyhjää päivää keskellä viikkoa.
Itse olen nyt pähkäillyt ainakin päivän että miten sen saisi näyttämään joka kuukaudelle oikein, mutta ainoastaan tammikuu näkyy oikein. Jatkan vielä pähkäilyä, mutta toivon että joku voisi tässä asiassa auttaa :)
Pyydän anteeksi jos koodini näyttää epäselvältä, koitan kommentoida selityksiä.
Kuukaudet ja päivät kannattaa pistää johonkin array-muuttujaan, jolloin ei tarvi millään if-else switch-caseilla leikkiä.
Ilmoitan vielä että tällä hommalla on pienoinen kiire, en panosta ketään, mutta toivon kovasti että apua löytyisi nopeasti.
Teinpä huvikseen vielä yhden testin. Siinä käytiin for-silmukalla 7 päivää läpi, tyyliin näin:
<?php for($i = 0; $i < 7; $i++) { $paivays = strtotime(date("{$i}.m.Y")); $viikonpaiva = date("w", $paivays); echo $viikonpaiva."<br>"; } ?>
Tämä toimi oikein, se antoi oikean viikonpäivän, jopa samalle päivämäärälle kuin mitä käyn läpi tällä kalenterikoodilla, johon se jostain syystä tulee väärin. Mietin vain, että mistä se voi mennä sekaisin, että antaa joka ikisillä kerralla neljän, eli torstain vastaukseksi...
erakko- kirjoitti:
Mutta sitten, siirretään tietokoneen kelloa kuukaudella eteenpäin, ja mitä näemmekään, kalenteri näyttää aivan väärin.
Oletko siis palvelimen vai koneen, jolla katselet sivua kelloa siirtänyt?
Lebe80 kirjoitti:
Kuukaudet ja päivät kannattaa pistää johonkin array-muuttujaan, jolloin ei tarvi millään if-else switch-caseilla leikkiä.
Laitetaan vielä esimerkki tuosta 'name_of_day' -funktiosta:
<?php function name_of_day($nod) { $values = array('ma','ti','ke','to','pe','la','su'); return (isset($values[$nod]) ? $values[$nod] : False); } ?>
Samaa voi soveltaa muihinkin.
trilog kirjoitti:
Oletko siis palvelimen vai koneen, jolla katselet sivua kelloa siirtänyt?
Koneen.
Jälleen edennyt hieman lisää. Huomasin, että 1-9 lukujen edessä on oltava nolla ($o muuttujassa siis), ja nyt sen lisättyä loput päivistä näkyvät oikein (kuulostaa ehkä oudolta mutta näin se vaan on :/). Ainoastaan kuukauden ensimmäisen viikon 1-4 päivää (aina torstai-sunnuntai) pysyvät edelleen samoina. Jokin tuntuu ensimmäisellä rivillä sekoittavan viikonpäivän, pitää vain keksiä että mikä...
Toivottavasti tiedät, että PHP-skriptien aikatietoihin ei vaikuta kuin palvelimen kello.
Annan saman ohjeen kuin edellisessä vastaavassa ketjussa: käsittele aikoja sisäisesti vain aikaleimoina ja tee tarvittavat muunnokset niissä yksittäisissä kohdissa, joissa dataa pitää tulostaa tai lukea. Siellä tulikin jo todistettua, että aikaleimasta tulee aivan oikeita päiviä ja viikkoja. Voit helposti soveltaa ongelmaasi sinne lähettämääni koodia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.