Avatar billede krel Nybegynder
13. marts 2007 - 21:10 Der er 15 kommentarer og
1 løsning

(simpel?) kalender php problemer

Hej.
(først og fremmest: kender intet til PHP!)

Jeg har en kalender der ikke helt virker. Jeg fandt dette script* (tilbage i 2006) og nu virker det ikke mere.. (har virket)
Det viser kun aktuel måned, hverken forrige eller næste virker, derudover virker funktionen "ret i kalender" heller ikke, førhen kom der en knap i hver datofelt hvor man kunne oprette en lille tekst som så blev gemt i en .txt-fil

Denne "ret-i-kalender"-funktion virkede dog heller ikke i første omgang - dataerne blev ikke gemt i .txt-fil.

* php kode:
<?
//  *****************************************************************************
//  *                                                                          *
//  *                          Dansk kalender i PHP                            *
//  *                                                                          *
//  *  Copyright 2002: Kenneth Lund-Petersen (kenneth@lund-petersen.dk)        *
//  *                                                                          *
//  *                                                                          *
//  *  Dette script er Freeware                                                *
//  *  Hvis der er en, som er klog og retter i scriptet, vil jeg meget gerne    *
//  *  have forbedringerne/ændringerne at vide :o)                              *
//  *                                                                          *
//  *****************************************************************************

//  ************** User settings **************

// Brugernavn og password til siden
      $user = "a";
      $pass = "a";
// Fil, hvori beskederne ligger
      $filnavn = "kalenderbeskeder.txt";

// Formatering af tabellen (kræver lidt HTML kendskab, men hvis du læser det her, kender du det sikkert...)
// ... Gå ned til funktionerne LayoutWeekend og LayoutWorkday, og ændr lidt html strengene, så er du på vej


unset($task);
if(($username == $user) && ($password == $pass))
{
    if($action == "TypedLogin") { $task = "ChooseDayToEdit"; }
    elseif($action == "HaveChosenDayToEdit") { $task = "EditDay"; }
    elseif($action == "HaveEditedMessage") { $task = "SaveMessage"; }
    else { $task = "DontKnowWhatToDo"; }

}
else
{
    if($action == "AttemptingToLogin") { $task = "ShowLogin"; }
    if($action == "TypedLogin") { $task = "ShowLoginWithError"; }
}

echo "<form method=post>";


//Henter kalenderbeskeder til buffer
$fd = @fopen ("$filnavn", "r");
while (!feof ($fd)) {
    $buffer[] = fgets($fd, 4096);
}
fclose ($fd);


// 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";
        }
}

// Skal her gemme til filen, hvis der er ændringer
if (($user == $username) && ($pass == $password) && ($task=="SaveMessage"))
{
    // Erstatter linjeskift med <br> i Message
    $Message = ereg_replace("\n",'<br>',$Message);

    //Tjecker om der er noget i bufferen i forvejen, og hvilken plads dagen ligger på
    if(sizeof($buffer) > 0)
    {

        for($i=0 ; $i < sizeof($buffer) ; $i++)
            if(ereg($ChosenDay,$buffer[$i]))
                { $PlaceInBuffer = $i; }
    }


    // Lægger den nye besked over i buffer
    if (strlen($Message) > 0)
        if (strlen($PlaceInBuffer) > 0)
            $buffer[$PlaceInBuffer] = $ChosenDay."|".$Message."\n"; // Hvis der ovenfor ikke findes en plads, vil PlaceInBuffer være tom,
        else                                                        // og Message vil blive lagt ind i en ny plads i buffer.
            $buffer[] = $ChosenDay."|".$Message."\n";
    elseif(strlen($PlaceInBuffer) > 0)
        $buffer[$PlaceInBuffer] = ''; // Sletter pladsen, hvis der ikke er en besked


    // Gemmer filen
    $fp = fopen("$filnavn", "w");
    for ($a=0; $a < sizeof($buffer); $a++) {
        if(strlen($buffer[$a] > 0))
              fwrite($fp, $buffer[$a]);
    }
    fclose($fp);
}


function CheckForMessage($Date)
{
global $buffer, $month, $year;
$Date = $Date."/".$month."-".$year;
    if(sizeof($buffer) > 0)
    {
        //Splitter datoer fra beskeder
        for($i=0 ; $i < sizeof($buffer) ; $i++)
        {
            $temp = explode('|',$buffer[$i]);
            $DateArray[] = $temp[0];
            $MessageArray[] = $temp[1];
        }

        for($i=0 ; $i < sizeof($buffer) ; $i++)
        {
            if((ereg($Date,$DateArray[$i])) && (strlen($Date) == strlen($DateArray[$i])))
                {
                    return $MessageArray[$i];
                    break;
                }
        }
    }
    else
        return "";
}

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

    // Hvis brugeren skal redigere
    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))
            echo "<td width=120 height=80 align=left valign=top  bgcolor=#ff9999><font face=Verdana size=2>".$date." - ".Translate($weekday).$editbutton."<br>".CheckForMessage($date)."</td>\n";
        else
            echo "<td width=120 height=80 align=left valign=top bgcolor=#aaaaaa><font face=Verdana size=2>".$date." - ".Translate($weekday).$editbutton."<br>".CheckForMessage($date)."</td>\n";
    }
    else // Uden for kalenderen
        echo "<td width=120 height=80 align=center valign=top bgcolor=#aaaaaa>&nbsp;</td>\n";
}

// 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
    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))
            echo "<td width=120 height=80 align=left valign=top bgcolor=#ff9999><font face=Verdana size=2>".$date." - ".Translate($weekday).$editbutton."<br>".CheckForMessage($date)."</td>\n";
        else
            echo "<td width=120 height=80 align=left valign=top bgcolor=#dddddd><font face=Verdana size=2>".$date." - ".Translate($weekday).$editbutton."<br>".CheckForMessage($date)."</td>\n";
    }
    else // Uden for kalenderen
        echo "<td width=120 height=80 align=center valign=top bgcolor=#dddddd>&nbsp;</td>\n";
}


// 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 "<table border=0 cellspacing=0 cellpadding=0 width=840>\n<tr>\n<td valign=top>";
echo "<font face=Verdana size=5>".Translate(JDMonthName($jdday,1))." $year</font><br>\n";
echo "<font face=Verdana size=3>";
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>";
echo "</font>";
echo "</td><td align=right valign=bottom>\n";
if(!(isset($action)))
                    {    echo "<input type=submit value='Ret i kalenderen'>";
                        echo "<input type=hidden name=action value=AttemptingToLogin>";
                    }
if($task == "SaveMessage")
                    {
                        echo "<input type=hidden name=username value=$username>";
                        echo "<input type=hidden name=password value=$password>";
                        echo "<input type=submit value='Ret i kalenderen'>";
                        echo "<input type=hidden name=action value=TypedLogin>";
                    }
echo "</td>\n</tr>\n</table>";

//Udskriver starten på tabellen
echo "\n<table border=1 cellspacing=0 cellpadding=0>\n";

// ----------- 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>";


// Udskriver form til
if (($user == $username) && ($pass == $password) && ($task=="ChooseDayToEdit"))
{
    echo "<input type=hidden name=username value=$username>";
    echo "<input type=hidden name=password value=$password>";
    echo "<input type=hidden name=action value=HaveChosenDayToEdit>";
}


// Til redigering af kalenderen
if ($task == "ShowLogin") // Brugeren skal indtaste oplysninger for første gang
{
    echo "<font face=Verdana size=2>";
    echo "<b>Indtast brugeroplysninger</b></font><br>";
}

if ($task == "ShowLoginWithError") // Brugeren har indtastet forkerte logon oplysninger
{
    echo "<font face=Verdana size=2>";
    echo "<b>Forkerte oplysninger. Du har ikke adgang.</b></font><br>";
}
if (($task == "ShowLoginWithError") || ($task == "ShowLogin")) // Fællesnævner for de to ovenstående
{
    echo "<font face=Verdana size=2>";
    echo "Brugernavn: <input type=text name=username><br>";
    echo "Kodeord: <input type=text name=password><br>";
    echo "<input type=hidden name=action value=TypedLogin>";
    echo "<input type=submit value=Send></font></font></form>";
}

if (($user == $username) && ($pass == $password) && ($task=="EditDay"))
{

//Henter kalenderbeskeder til buffer
$fd = @fopen ("$filnavn", "r");
while (!feof ($fd)) {
    $buffer[] = fgets($fd, 4096);
}
fclose ($fd);

if(sizeof($buffer)>0) //Denne blok udføres kun hvis der blev hentet noget fra filen
{

    for($i=0 ; $i < sizeof($buffer) ; $i++)
        if(ereg($ChosenDay,$buffer[$i]))
        {
            $TempBuffer = explode('|',$buffer[$i]);
            $Message = $TempBuffer[1];
        }
}


//Viser besked på skærm
$Message = ereg_replace("<br>","\n",$Message);
echo "<font face=Verdana size=2><b>Dato: $ChosenDay</b></font><br>\n";
echo "<textarea border=0 name=Message rows=5 cols=52>".trim($Message)."</textarea><br>\n";
echo "<input type=hidden name=username value=$username>";
echo "<input type=hidden name=ChosenDay value=$ChosenDay>";
echo "<input type=hidden name=password value=$password>";
echo "<input type=hidden name=action value=HaveEditedMessage>";
echo "<input type=\"submit\" value=\"Tilføj/Ret\"><br>\n";
// Vil herefter hente siden, og gå op til starten af filen
}
echo "</form>";


?>

anyone ?

|Krel
Avatar billede coderdk Praktikant
14. marts 2007 - 00:01 #1
Den første er register globals... http://dk.php.net/register_globals - du kan rette scriptet, eller emulere register_globals ON: http://dk.php.net/faq.misc#faq.misc.registerglobals
Avatar billede krel Nybegynder
14. marts 2007 - 21:52 #2
:O Ja.. HEST!

Er helt blank på de links du har sendt, kan se det handler om php men er det noget jeg skal redigere i mit script elelr i den der global.asa

???????????
Avatar billede coderdk Praktikant
14. marts 2007 - 22:06 #3
Dit script. Der er ikke noget der hedder global.asa i PHP, det er ASP ;P
Avatar billede krel Nybegynder
14. marts 2007 - 22:15 #4
ok tror jeg fik blandt lidt samme hehe. Når du så skriver "Den første er register globals" er det så det første problem med at den ikke vil bladre i månederne?
Avatar billede coderdk Praktikant
15. marts 2007 - 01:19 #5
Yep, i URL'en er der f.eks. month=3 som i scriptet tilgås som $month i stedet for $_GET['month'] - I FAQ'en som jeg linker til er der et trick til at simulere register globals on så du rent faktisk kan tilgå month som $month...
Avatar billede krel Nybegynder
15. marts 2007 - 13:31 #6
så jeg skal gå ind i min kode og finde alle '$month' og erstatte med $_GET['month'] og så lave et lille stykke php der laver den der register globals ??
Avatar billede coderdk Praktikant
15. marts 2007 - 14:56 #7
Du kan nøjes med den kode fra FAQ'en som simulerer register globals...
Avatar billede krel Nybegynder
15. marts 2007 - 15:00 #8
???
For at skære det helt ud i pap:
Så indsætter jeg dette stykke php

// Emulate register_globals on
if (!ini_get('register_globals')) {
  $superglobals = array($_SERVER, $_ENV,
      $_FILES, $_COOKIE, $_POST, $_GET);
  if (isset($_SESSION)) {
      array_unshift($superglobals, $_SESSION);
  }
  foreach ($superglobals as $superglobal) {
      extract($superglobal, EXTR_SKIP);
  }
}

et eller andet sted mellem <? og ?> eller skal det stå et bestemt sted?
Avatar billede coderdk Praktikant
15. marts 2007 - 15:05 #9
yeah det skal stå øverst, før den anden kode, inde i <?
Avatar billede krel Nybegynder
15. marts 2007 - 18:25 #10
SUPER TAK!
det virker 100% og nu kan man også åbne 'rette/skriv-i-kalender-funktionen

MEN det bliver stadig ikke gemt får nu fejlmeddelsen:

PHP Warning: fopen(kalenderbeskeder.txt) [function.fopen]: failed to open stream: Permission denied in D:\Domains\tourdefoxdecarvalho.dk\wwwroot\netCode(4)\kalender.php on line 135 PHP Warning: fwrite(): supplied argument is not a valid stream resource in D:\Domains\tourdefoxdecarvalho.dk\wwwroot\netCode(4)\kalender.php on line 138 PHP Warning: fwrite(): supplied argument is not a valid stream resource in D:\Domains\tourdefoxdecarvalho.dk\wwwroot\netCode(4)\kalender.php on line 138 PHP Warning: fclose(): supplied argument is not a valid stream resource in D:\Domains\tourdefoxdecarvalho.dk\wwwroot\netCode(4)\kalender.php on line 140

Kig evt. forbi: http://www.tourdefoxdecarvalho.dk/netCode(4)/kalender.php
(bruger/kode: a)
Avatar billede krel Nybegynder
15. marts 2007 - 20:09 #11
* og så alligevel kun 99%

Hvis den første i en måned falder på en søndag starter ugen med søndag i stedet for mandag (!) skal jeg så først begynde at rode i scriptet nu eller kan det lade sig gøre med endnu en simpel tilføjelse / rettelse?!
Avatar billede coderdk Praktikant
15. marts 2007 - 21:38 #12
hehe ok der må jeg lige melde pas - det må være kalenderkoden der er noget galt med
Avatar billede krel Nybegynder
15. marts 2007 - 21:48 #13
hmm det var da ærgeligt..
du ska selfølgelig have point, men håber du er ok med at du ikke får max da dette jo kun er den del af spm'et..?
Avatar billede coderdk Praktikant
15. marts 2007 - 22:06 #14
det er ok :)

Du skal sætte permissions (rettighederne) på den folder så webserveren får lov at skrive til filen - i unix hedder det mode 777 alle read/write/execute på selve folderen. Så burde den anden fejl forsvinde...

Den sidste ting med søndag pludselig bliver den første dag må være en fejl i koden - Jeg kan ikke lige overskue det dog ;P
Avatar billede krel Nybegynder
15. marts 2007 - 22:09 #15
hehe helt i orden. kan man acceptere et svar nu og så kun give lidt eller skal man vente på at andre evt. svare og så først herefter dele pointene ud?..

skal lige høre hurtigt:
hvordan laver man en funktion som Request.Querystring (i ASP) i php??
Altså så hvis man f.eks. har en URL der hedder: domaine.dk/vis.php?id=0 og man så ville hive dette '0' ud af URL'en?
Avatar billede coderdk Praktikant
15. marts 2007 - 23:41 #16
Ja, bare afvent andre, hvis det er :)
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