Avatar billede straszek Praktikant
27. maj 2003 - 12:17 Der er 24 kommentarer og
1 løsning

Fejl i kalender

jeg bruger nedenstående kalender, til at vise en arrangements kalender på min side. Den har virket glimerende indtil nu hvor juni står for døren.....

Den 1. juni er på søndag, kalenderen mener det er på mandag. jeg har ikke selv hjerne til at genneskue hvor fejlen ligger, så jeg håber på hjælp.

Kalenderen kan ses på www.danstud.dk

kode:

function str2unix($str){
$split=explode("/",$str);
$unixstamp=mktime(0,0,0,$split[1],$split[0],$split[2]);
return $unixstamp;
}

// Variable som anviser nuvÊrende dato
$date = getdate();
$CurrentDate = $date['mday'];
$CurrentMonth = $date['mon'];
$CurrentYear = $date['year'];

// Variable som anviser den viste mÂned, m.m.
if(!(isset($month))) $month = $date['mon'];
if ($month == 0)
{    $month = 12;
    $year--;}
if ($month == 13)
{    $month = 1;
    $year++;}
if(!(isset($year))) $year = $CurrentYear;


// Funktion til at oversÊtte engelsk til dansk
function Translate($weekday)
{
    switch ($weekday) {
    case 'Monday':         return "Mandag";
    case 'Tuesday':     return "Tirsdag";
    case 'Wednesday':    return "Onsdag";
    case 'Thursday':     return "Torsdag";
    case 'Friday':         return "Fredag";
    case 'Saturday':    return "L¯rdag";
    case 'Sunday':        return "S¯ndag";

    case 'January':        return "Januar";
    case 'February';    return "Februar";
    case 'March';        return "Marts";
    case 'April';        return "April";
    case 'May';            return "Maj";
    case 'June';        return "Juni";
    case 'July';        return "Juli";
    case 'August';        return "August";
    case 'September';    return "September";
    case 'October';        return "Oktober";
    case 'November';    return "November";
    case 'December';    return "December";
        }
}



function CheckForMessage($nixdato)
{
GLOBAL $submenu;

$retvalue = "";
$caldata = mysql_query("select * from kalender where dato='$nixdato' and vises='ja'") or die(mysql_error());
            while ($raekke = mysql_fetch_array($caldata)) {
            extract($raekke);
           
  $retvalue .= "<a href=\"java script:void(0)\" onClick=\"window.open('arr.php?arrid=$id','arr','width=580,height=550,menubar=no,scrollbars=yes')\">$overskrift</A><br>";
}

return $retvalue;
}


// Funktion hvori layoutet til ugedagene ligger
function LayoutWeekday($date,$weekday)
{
    global $CurrentDate, $CurrentMonth, $CurrentYear, $month, $year;

    // Hvis brugeren skal redigere
   
            $datoen .="$date/";
            $datoen .="$month/";
            $datoen .="$year";
            $nixdato=str2unix($datoen);
           
    if((isset($date)) && (strlen($date) > 0) && (isset($weekday)) && (strlen($weekday) > 0)) // En dag i kalenderen
    {
                if(($CurrentDate == $date) && ($CurrentMonth == $month) && ($CurrentYear == $year))


           
           
           
                        //WEEKEND

            echo "<td width=100 valign=top bgcolor=#CCCCCC><span class=\"textsmallb\">
            <font face=Verdana size=2>".$date." <br>".CheckForMessage($nixdato)."</td>\n</span>";
        else
       
        // DEN DER GÿR NOGET!!
            echo "<td width=100 valign=top bgcolor=#CCCCCC><span class=\"textsmallb\">
            <font face=Verdana size=-2><b>".$date." </b><br>".CheckForMessage($nixdato)."</td>\n</span>";
    }
    else // Uden for kalenderen
        echo "<td width=100 valign=top bgcolor=#CCCCCC><span class=\"textsmallb\">&nbsp;</td>\n</span>";
}

// Funktion hvori layoutet til weekenden ligger
function LayoutWorkday($date,$weekday)
{
    global $CurrentDate, $CurrentMonth, $CurrentYear, $month, $year;
    global $password, $pass, $username, $user, $task;

   
   
   
    // Hvis brugeren skal redigere
    $datoen .="$date/";
            $datoen .="$month/";
            $datoen .="$year";
            $nixdato=str2unix($datoen);
   
   
    if (($user == $username) && ($pass == $password) && ($task=="ChooseDayToEdit"))
        $editbutton = "<input type=submit name=ChosenDay value=".$date."/".$month."-".$year.">";


    if((isset($date)) && (strlen($date) > 0) && (isset($weekday)) && (strlen($weekday) > 0)) // En dag i kalenderen
    {
        if(($CurrentDate == $date) && ($CurrentMonth == $month) && ($CurrentYear == $year))


///////////////////////////
//FINDER DEN AKTUELLE DAG//
///////////////////////////




            echo  "<td width=100 valign=top bgcolor=#ffffff><span class=\"textsmallb\">
            <font face=Verdana size=-2><b>".$date." </b><br>".CheckForMessage($nixdato)."</td>\n</span>";
       
        else
       
///////////////////////
//FINDER HVERDAGE//////
///////////////////////


       
            echo "<td width=100 valign=top bgcolor=#CCCCCC><span class=\"textsmallb\">
            <font face=Verdana size=-2><b>".$date." </b><br>".CheckForMessage($nixdato)."</td>\n</span>";
    }
    else // Uden for kalenderen
        echo "<td width=100 valign=top bgcolor=#CCCCCC><span class=\"textsmallb\">&nbsp;</td>\n</span>";
}


// Laver en query string, hvor resten af variable foruden month og year kommer med
// Derved bibeholdes andre variable, som siden er kaldt med

$query_string = $argv[0]; //Henter variable over i $query_string
$variables = explode('&',$query_string); // opdeler variable i et array
for($i=0 ; $i < sizeof($variables) ; $i ++) // sorterer month og year fra variable
    if (ereg('month',$variables[$i]))
        $variables[$i] = "";
    elseif (ereg('year',$variables[$i]))
        $variables[$i] = "";

unset($query_string);
for($i=0 ; $i < sizeof($variables) ; $i ++) // Skriver resten af variable til $query_string
    if (strlen($variables[$i]) > 1)
        $query_string = $query_string."&".$variables[$i];



$jdday = GregorianToJD($month,1,$year); //Datonummer i Julian Day
$NoInWeek = JDDayOfWeek($jdday,0); //Nummer dag i ugen


// TÊller antal dage i mÂned
$i = $jdday;
$DaysInMonth = 0;
while(JDMonthName($i++,1) == JDMonthName($jdday,1))
    $DaysInMonth++;


// TÊller dage i f¯rste uge
$DaysInFirstWeek = 1;
$i = $jdday;
while(JDDayOfWeek($i++,0) != "Sunday")
    $DaysInFirstWeek++;


// Udskriver MÂned og links til forrige og nÊste mÂned
echo "<p class=\"tekst\"><font face=Verdana size=2>".Translate(JDMonthName($jdday,1))." $year</font><br>\n";
echo "<a href=$PHP_SELF?month=".($month-1)."&year=$year$query_string>Forrige mÂned</a> - ";
echo "<a href=$PHP_SELF?month=".($month+1)."&year=$year$query_string>NÊste mÂned</a>";


//Udskriver starten p tabellen
echo "<table width=700 cellpadding=4 cellspacing=1 border=0>
    <td width=100 align=center bgcolor=#999999><span class=\"textsmallw\">Mandag</span></td>
    <td width=100 align=center bgcolor=#999999><span class=\"textsmallw\">Tirsdag</span></td>
    <td width=100 align=center bgcolor=#999999><span class=\"textsmallw\">Onsdag</span></td>
    <td width=100 align=center bgcolor=#999999><span class=\"textsmallw\">Torsdag</span></td>
    <td width=100 align=center bgcolor=#999999><span class=\"textsmallw\">Fredag</span></td>
    <td width=100 align=center bgcolor=#999999><span class=\"textsmallw\">L¯rdag</span></td>
    <td width=100 align=center bgcolor=#999999><span class=\"textsmallw\">S¯ndag</span></td>
</tr>";



// ----------- Udskriver kalenderen ------------
$ok = 1;
while($ok == 1)
{
    echo "<tr>\n";
    for($i=1 ; $i<=7 ; $i++)
    {

        // Skiller month/day/year fra hinanden
        $MonthDayYear = explode('/',JDToGregorian($jdday));


    //Opdeler mÂneden i to (starten, indenfor de f¯rste ugedage, og resten)
        if($MonthDayYear[1] < $DaysInFirstWeek)
        {
            if($NoInWeek <= $i) // Skriver f¯rst datoer, fra f¯rste korrekte ugedag i mÂneden
                {
                    if(($i == 6) || ($i == 7)) // Weekend-dage i andre farver
                        LayoutWeekday($MonthDayYear[1],JDDayOfWeek($jdday,1));
                    else
                        LayoutWorkday($MonthDayYear[1],JDDayOfWeek($jdday,1));
                    $NoInWeek++;
                    $jdday++;
                }
            else
                if(($i == 7) || ($i == 6)) // Weekend-dage i andre farver
                    LayoutWeekday('','');
                else
                    LayoutWorkday('','');
        }
        else
        {
            if(($i == 6) || ($i == 7)) // Weekend-dage i andre farver
                LayoutWeekday($MonthDayYear[1],JDDayOfWeek($jdday,1));
            else
                LayoutWorkday($MonthDayYear[1],JDDayOfWeek($jdday,1));

            if($MonthDayYear[1] == $DaysInMonth) // HÈr nÂet til sidste dag i mÂneden
            {
                for($i ; $i<7 ; $i++)// Udskriver nu resten af kalenderen for dÈn mÂned
                {
                    if(($i == 5) || ($i == 6)) // Weekend-dage i andre farver
                        LayoutWeekday('','');
                    else
                        LayoutWorkday('','');
                }
                $ok = 0;
                break;
            }
            $jdday++;
        }

    }
    echo "</tr>";
}
// Udskriver afslutning p tabellen
echo "</table>";
Avatar billede tipsen Nybegynder
27. maj 2003 - 13:12 #1
Det er jo oplagt fordi at søndag er dag nr. 0 i ugen og mandag er dag nr. 1 når man følger amerikansk standard - desværre er det henholdsvis dag 6 og dag 0 med dansk standard - altså de resultater du får når du trækker ugedagsnummeret du med php!

Hvor fejlen ligger i din kode kan jeg ikke lige finde, da den er alt for lang/rodet til at jeg kan overskue den i løbet af kort tid. Men det kan da være ovenstående fact kan hjælpe dig til selv at finde fejlen.
Avatar billede straszek Praktikant
27. maj 2003 - 13:17 #2
Jeg har ikke selv, lavet selve kalenderen - jeg har fundet den på nettet og tilrettet det til mit behov. Jeg er ikke selv i stand til at finde fejle, så lidt hjælp ville være fantastisk...

Jeg går udfra at fejlen skal findes i den sidste del efter // ----------- Udskriver kalenderen ------------



Søren
Avatar billede avminarm Juniormester
27. maj 2003 - 14:14 #3
som tipsen skriver så prøv at rette de steder du har flg. stående:

if(($i == 7) || ($i == 6))

til

if(($i == 0) || ($i == 6))
Avatar billede straszek Praktikant
27. maj 2003 - 14:25 #4
Det var ikke der problemet lå
Avatar billede tipsen Nybegynder
27. maj 2003 - 14:27 #5
Det er sgu godt set...
Avatar billede straszek Praktikant
27. maj 2003 - 14:29 #6
hvad mener du?
Avatar billede nop Nybegynder
27. maj 2003 - 14:33 #7
Det ser da ud til at virke nu, hvad var der galt ?
--nop
Avatar billede nop Nybegynder
27. maj 2003 - 14:34 #8
NEJ... ok det virker ikke, undskyld forstyrelsen.
Avatar billede tipsen Nybegynder
27. maj 2003 - 14:38 #9
En fejl kan godt omfatte flere liniers kode - det er ikke sikkert det bare er spørgsmål om at rette en enkelt linie, men måske snarere en grundlæggende tanketorsk i koden der betyder at større mængder kode skal omskrives - måske inklusive ovennævnte linie.
Avatar billede nop Nybegynder
27. maj 2003 - 14:46 #10
Er det mig der er farveblind i dag eller kommer weekend-dage stadig i samme farve som hverdage, jeg kigger bare lidt på koden, men vil ikke love at komme med en løsning. --nop
Avatar billede nop Nybegynder
27. maj 2003 - 14:59 #11
Du kunne prøve at udskifte:
    //Opdeler mÂneden i to (starten, indenfor de f¯rste ugedage, og resten)
        if($MonthDayYear[1] < $DaysInFirstWeek)
Skift "<" til "<=".

Men det her skal osse ændres:

// TÊller dage i f¯rste uge
$DaysInFirstWeek = 1;
$i = $jdday;
while(JDDayOfWeek($i++,0) != "Sunday")
    $DaysInFirstWeek++;
Til:
$DaysInFirstWeek = 0;
$i = $jdday;
while(JDDayOfWeek($i++,0) != "Sunday")
    $DaysInFirstWeek++;

Det er helt uden værken garenti eller at have prøvet det.
--nop
Avatar billede nop Nybegynder
27. maj 2003 - 15:11 #12
Ja måske er det sidste ikke rigtigt:
$DaysInFirstWeek = 0;
$i = $jdday;
while(JDDayOfWeek($i--,0) != "Monday")
    $DaysInFirstWeek++;
Nu tælles jo de dage som ikke er i måneden men skal vises, uden dato.
Avatar billede straszek Praktikant
27. maj 2003 - 18:26 #13
>Nop

jeg har nu prøvet at ændre de ting du forslår, situationen er stadig den samme -  ingen lørdag den 1.6!

// ----------- Udskriver kalenderen ------------
$ok = 1;
while($ok == 1)
{
    echo "<tr>\n";
    for($i=1 ; $i<=7 ; $i++)
    {

        // Skiller month/day/year fra hinanden
        $MonthDayYear = explode('/',JDToGregorian($jdday));


    //Opdeler mÂneden i to (starten, indenfor de f¯rste ugedage, og resten)
        if($MonthDayYear[1] <= $DaysInFirstWeek)
        {
            if($NoInWeek <= $i) // Skriver f¯rst datoer, fra f¯rste korrekte ugedag i mÂneden
                {
                    if(($i == 6) || ($i == 7)) // Weekend-dage i andre farver
                        LayoutWeekday($MonthDayYear[1],JDDayOfWeek($jdday,1));
                    else
                        LayoutWorkday($MonthDayYear[1],JDDayOfWeek($jdday,1));
                    $NoInWeek++;
                    $jdday++;
                }
            else
                if(($i == 0) || ($i == 6)) // Weekend-dage i andre farver
                    LayoutWeekday('','');
                else
                    LayoutWorkday('','');
        }
        else
        {
            if(($i == 6) || ($i == 7)) // Weekend-dage i andre farver
                LayoutWeekday($MonthDayYear[1],JDDayOfWeek($jdday,1));
            else
                LayoutWorkday($MonthDayYear[1],JDDayOfWeek($jdday,1));

            if($MonthDayYear[1] == $DaysInMonth) // HÈr nÂet til sidste dag i mÂneden
            {
                for($i ; $i<7 ; $i++)// Udskriver nu resten af kalenderen for dÈn mÂned
                {
                    if(($i == 5) || ($i == 6)) // Weekend-dage i andre farver
                        LayoutWeekday('','');
                    else
                        LayoutWorkday('','');
                }
                $ok = 0;
                break;
            }
            $jdday++;
        }

    }
    echo "</tr>";
}
// Udskriver afslutning p tabellen
echo "</table>";
Avatar billede straszek Praktikant
28. maj 2003 - 15:28 #14
Jeg har stadig bruge for hjælp!!!

Jeg har kigget mig søvnløs på koden, og er ikke kommet ret meget videre. Problemet er stadig at den først bliver vist som mandag i stedet for som søndag!


Søren
Avatar billede straszek Praktikant
31. maj 2003 - 11:28 #15
Avatar billede cyberdude Nybegynder
01. juni 2003 - 15:23 #16
citat : Den har virket glimerende indtil nu hvor juni står for døren.....

Så vidt jeg kan se så har den da aldrig virket korekt....
eks. så fortæller den mig at den 1 januar 2003 er en torsdag... det var altså en onsdag.....

Kan det tænkes at din webhotel udbyder har opdateret noget af deres software, som kan resultere i denne fejl... ??

Prøv evt. at smide en fil op med følgende indhold :
<?
phpinfo();
?>
og smid linket til filens placering... dette kan muligvis fortælle en smule o serveren's opsætning... som kan være behjælpelig
Avatar billede tipsen Nybegynder
01. juni 2003 - 15:34 #17
"Den har virket glimerende indtil nu hvor juni står for døren....."

*DING*

"På trods af fejl i koden har scriptet alligevel givet rigtige månedsoversigter de sidste par måneder, indtil juni - nu kan jeg godt se det er noget lort!"

*DING* "Gammel Dansk - gør godt!"
Avatar billede straszek Praktikant
01. juni 2003 - 15:40 #18
Jeg har været ved at rode lidt med scriptet, derfor har den vist fejl i januar. Jeg har lagt den oprindelige kode ud nu, og her opstå fejlen først i juni

Det er min egen server, og den er der ikke installeret noget nyt på.
link til phpinfo:
http://www.danstud.dk/sektorcare/phpinfo.php
Avatar billede cyberdude Nybegynder
01. juni 2003 - 15:47 #19
hmm hvis jeg blot kopiere ovenstående kode som den er og smider den i en fil på min server fåe jeg en fejl til et kald i en funktion som ikek findes i den kode som du har postet.... så der må da være noget mere kode / flere filer til scriptet... elller ??
Avatar billede straszek Praktikant
01. juni 2003 - 15:51 #20
Jeg har nogle include filer der åbne mysql adgang og laver database kald, der bruges til at hente arrangementer og lægge dem på de respektive datoer. Det har så vidt jeg kan se ingen betydning for selve kalender "tegningen". Så du kan bare disable de første 3 linjer...
Avatar billede tipsen Nybegynder
01. juni 2003 - 15:51 #21
Hvad er det for en funktion?
Avatar billede cyberdude Nybegynder
01. juni 2003 - 15:59 #22
Fatal error: Call to undefined function: gregoriantojd() in ......../index.php on line 177
Avatar billede cyberdude Nybegynder
01. juni 2003 - 15:59 #23
kan se at det er en php funktion... så måske min php ikke er compiled med denne ??
Avatar billede cyberdude Nybegynder
01. juni 2003 - 21:11 #24
tipsen -> kan det passe at det er en "komonent" der skal kompiles seperart ind i php ??
Avatar billede tipsen Nybegynder
01. juni 2003 - 22:01 #25
Jævnfør http://dk.php.net/manual/en/ref.calendar.php skal du have kompileret php med --enable-calendar for at disse funktioner vil fungere.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester