Avatar billede shjorth Nybegynder
11. marts 2007 - 11:18 Der er 21 kommentarer og
1 løsning

php kalender

Hejsa..

Det er lidt et longshot, men hvis der nu var nogen der ikke vidste hvad de skulle bruge deres søndag på så har jeg da her en lille opgave :)

Jeg har en masse datoer i min mysql database.
Disse datoer ville jeg gerne have smidt i en kalender, så alle datoerne i databasen kommer til at stå med rødt i kalenderen (booked).
Jeg har prøvet frem og tilbage men må give fortabt, så måske der er nogen der kender et sted hvor man kan "lære" det. Eller nogen der har lyst til at hjælpe mig?

Mange tak, og god søndag :)
Avatar billede morpheus Nybegynder
11. marts 2007 - 11:31 #1
Og det giver altså 200 point?
Avatar billede shjorth Nybegynder
11. marts 2007 - 11:41 #2
Jeg er da mere end villig til at kaste en flaske vin eller lign i puljen... Men altså som sagt et longshot ;)
Avatar billede jakobdo Ekspert
11. marts 2007 - 12:10 #3
Har du kigget på denne kalender: http://keithdevens.com/software/php_calendar

Hvis du så lavet et udtræk for den pågældende måned, og bruge denne notation:

<?php

$days = array(

    2=>array('/weblog/archive/2004/Jan/02','linked-day'),

    3=>array('/weblog/archive/2004/Jan/03','linked-day'),

    8=>array('/weblog/archive/2004/Jan/08','linked-day'),

    22=>array('/weblog/archive/2004/Jan/22','linked-day'),

);

?>

Så burde det jo hurtigt være løst.
Avatar billede morpheus Nybegynder
11. marts 2007 - 20:22 #4
Var det en løsning der kunne bruges eller skal du have noget der er mere customized?
Avatar billede shjorth Nybegynder
12. marts 2007 - 14:30 #5
Altså umidlebart´kan jeg ikke lige få det til at fungere. Har du noget ved hånden?
Ellers er løsningen jo nok at jeg sætter mig ned og læser det igennem ;)
Avatar billede shjorth Nybegynder
12. marts 2007 - 14:38 #6
Måske en forklaring med..

I min database ligger flg:
an (ankomstdag)
og
af (afgangsdag)

De kan bestå af følgende 3/17/07 - 3/22/07.
Mit problem er så at jeg gerne vil have disse datoer smidt i kalenderen, så folk kan se at her er der booket, ligeledes de mellemliggende datoer (18-19-20-21) skal markeres.

Det her overstiger langt mine evner, jeg kan kun the bascis. Så det er selvfølgelig naivt at tro jeg kan sætte mig og lave det ;)
Jeg har prøvet at hente diverse opensource scripts, men igen bliver det "Way to advanced" for mig :)
Avatar billede dkfire Nybegynder
13. marts 2007 - 00:41 #7
Er det noget ala kalenderen på denne side:
http://mindevej.hotserv.dk/

Jeg har lavet den lidt for sjov, der kan man resevere et antal dage i kalenderen, de vil blive makeret med rødt.
Den er selvfølgelig ikke helt perfekt, men det er da noget ala det du savner.
Avatar billede shjorth Nybegynder
13. marts 2007 - 19:44 #8
Det er simpelthen ligepræcis det jeg leder efter...
Er det noget du vil dele??
Avatar billede jakobdo Ekspert
13. marts 2007 - 20:59 #9
Hvis du kunne en smule php, burde du altså hurtigt kunne bygge en løsning videre på denne: http://www.codebreaker.dk/exp/767295exp.php
Avatar billede shjorth Nybegynder
16. marts 2007 - 10:07 #10
Jeg syntes ikke jeg kan få det til at hænge sammen :S
Det er nu en tand for svært for mig :(
Avatar billede dkfire Nybegynder
16. marts 2007 - 13:42 #11
<?php
    if ( isset($_GET[month]))
        $mon = $_GET[month];
    else
        $mon = idate("m");
    if (isset($_GET[year]))
        $year = $_GET[year];
    else
        $year = idate("Y");
       
    $timestamp = mktime(0 ,0 ,0 ,$mon, 1, $year);
    $mon = idate("m", $timestamp);
    $year = idate("Y", $timestamp);
   
    setlocale(LC_TIME, 'danish');
   
    // Opretter forbindelse til database
    require_once('../Connections/mindevej.php');
    mysql_select_db($database);
   
    $thismonth = mktime(0 ,0 ,0 ,$mon, 1, $year);
    $nextmonth = mktime(0, 0, 0, $mon+1, 30, $year);
    $firstday = "'" . date('Y-m-d',$thismonth) . "'";
    $lastday = "'" . date('Y-m-d',$nextmonth) . "'";
    $query = "SELECT * FROM kalender WHERE Slut BETWEEN $firstday AND $lastday ORDER BY Start ASC";
    $result = mysql_query($query) or die(mysql_error());
    $row = mysql_fetch_assoc($result);
    mysql_close();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>
<form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>" name="sel_date">
<select name="month" onchange="sel_date.submit();">
    <?php for($i = 1; $i < 13 ; $i++)
    {
   
    echo '<option value="'.$i.'" ';
    if ($i == $mon )
        echo 'selected="selected"';
    echo '>'.ucfirst(strftime("%B", mktime(0 ,0 ,0 ,$i, 1, $year)))."</option>\r\n      ";
    }?>
</select>
<select name="year" onchange="sel_date.submit();">
    <?php
        for($i = (idate("Y")-1); $i < 2010 ; $i++)
        {
            echo '<option value="'.$i.'" ';
            if ($i == $year)
                echo 'selected="selected"';
            echo '>'.$i."</option>\r\n";
        } ?>
</select>
</form>


Denne måned er: <?php echo ucfirst(strftime("%B", mktime(0 ,0 ,0 ,$mon, 1, $year)))." $year"; ?> <br />
<br />
<table cellpadding="0" cellspacing="0" border="1" >
    <tr>
        <th>Uge</th>
        <th>Mandag</th>
        <th>Tirsdag</th>
        <th>Onsdag</th>
        <th>Torsdag</th>
        <th>Fredag</th>
        <th>Lørdag</th>
        <th>Søndag</th>
    </tr>
    <tr>
<?php
    $weekday = 1;
    for ($day=1; $day < idate("t", mktime(0 ,0 ,0 ,$mon, 1, $year))+1 ; $day++)
    {   
       
        $tid = mktime(0 ,0 ,0 ,$mon, $day, $year); // Timestamp for dagen udregnes
        $dagsdato = date('Y-m-d',mktime(0 ,0 ,0 ,$mon, $day, $year)); //Datoen for dagen udregnes til mysql-værdi
        while($row['Slut'] < $dagsdato)
            {
                if(!$row = mysql_fetch_assoc($result))
                    break 1;
           
            }

        // Skifter til en ny uge   
        if( $weekday==8 )
        {
            echo "</tr><tr>\r\n";
            echo "<td>".strftime("%W", $tid)."</td>";
            $weekday=1;
        }
       
        //Den forige måneds sidste dage.
        if ( $day==1)
        {
            echo "<td>".strftime("%W", $tid)."</td>";
            $weekday = intval(strftime("%u", $tid));
            for ($k=1 ; $k < $weekday ; $k++)
            {
                $lastdays=$k-$weekday;
                echo '<td style="background-color: gray;">'.date("d", strtotime("$lastdays day", $tid))."</td>\r\n";;
            }
        }
               
       
        // En optaget dag farves rød 
        if ($row['Start'] <= $dagsdato and $row['Slut'] >= $dagsdato )
        {
            echo "<td ";
            echo 'style=" background-color: red;" ';
            echo ">".date("d", $tid);
            echo "</td>\r\n";
            //strftime(" er en %A", $tid).
           
        }
        else
        {
            echo "<td ";
            echo '> <a href="create_date.php?day='.$day.'&month='.$mon.'">'.date("d", $tid).'</a>';
            echo "</td>\r\n";
        }
        //næste måneds datoer når den sidste dag i måneden er nået
        if ( $day == idate("t", mktime(0 ,0 ,0 ,$mon, 1, $year)))
        {
            $weekday = intval(strftime("%u", $tid));
            $nextdays = 0;
            for ($k=7 ; $k > $weekday ; $k--)
            {
                $nextdays += 1;
                echo '<td style="background-color: gray;">'.date("d", strtotime("+$nextdays day", $tid))."</td>\r\n";;
            }
        }
       
        $weekday +=1;
       
       
    }
?>
    </tr>
</table>
<a href="<?php echo $_SERVER['PHP_SELF']; ?>?month=<?php echo $mon-1; ?>&year=<?php echo $year; ?>">&lt;-- Forrige måned </a>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="<?php echo $_SERVER['PHP_SELF']; ?>?month=<?php echo $mon+1; ?>&year=<?php echo $year; ?>">Næste måned --&gt;</a>

</body>
</html>

Kan være det skal optimeres lidt, det var kun noget jeg somsagt lavede for sjov.
Det er en god lille test i dato håndtering.
Avatar billede dkfire Nybegynder
16. marts 2007 - 13:42 #12
Laver da også lige et svar
Avatar billede shjorth Nybegynder
16. marts 2007 - 21:19 #13
Det ser godt ud.. Måske du evt kunne give mig "insert" delen også?
Avatar billede shjorth Nybegynder
17. marts 2007 - 00:26 #14
Eller insert delen er vel i teorien ikke nødvendig..
Men hvis du kan forklare mig hvordan ;)
Jeg har lavet to felter i tabellen "kalender".
Start
og
Slut.
De står som tinytext (eftersom det er det eneste jeg er bekendt med at bruge), men hvordan skal værdien indsættes??
f.eks 16/03 eller måske 16/03/07.

Det er den ene ting..
og så er der checket om datoerne nu også er booket.. Hvordan det ? :)

Beklager jeg er lidt krævende :)
Avatar billede shjorth Nybegynder
17. marts 2007 - 00:48 #15
Nåh.. Jeg har fundet ud af at indsætte (tinytext var fejlen ;) skulle være date istedet..

Nu skal jeg bare lure hvordan man laver et "check" så der ike kan dobbeltbookes :)
Har lavet flg, men virker ikke rigtig:

<?php
require("conn.inc.php");
$firstday = "'" . date('Y-m-d',$thismonth) . "'";
$lastday = "'" . date('Y-m-d',$nextmonth) . "'";
$query = "SELECT * FROM kalender WHERE Slut BETWEEN $firstday AND $lastday ORDER BY Start ASC";
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($result);
if ($row['Start'] <= $dagsdato and $row['Slut'] >= $dagsdato )
{
Header("Location: http://www.politi.dk");
}else{
mysql_query("INSERT INTO `kalender` (`start`, `slut`) VALUES ('2009-01-01', '2009-01-09')")or die(mysql_error());
print("indsat");
}
?>
Avatar billede dkfire Nybegynder
17. marts 2007 - 12:13 #16
Du kan nøjes med at kører en sql query som tjekker for om der bliver dobbeltbooket

$BookingStart // Startdato for din booking
$BookingSlut // Slutdato for din booking

$query = "SELECT * FROM kalender WHERE Start BETWEEN $BookingStart AND $BookingSlut OR Slut BETWEEN $BookingStart AND $BookingSlut";

Hvis der så kommer nogle rækker ud af det, ved du at der er ved at blive dobbletbooket, noget ala:
$result = mysql_query( $query );
if( !$result )
{
echo "Databasefejl";
}elseif( 0 < mysql_num_rows( $result ) )
{
echo "Du har valgt en tid som er optaget";
}else
{
insæt datoer
}

Men husk lige at tjekke for om start og lsutdatoer er fortløbende, således at slutdato ikke kommer før startdato, kan give nogle uoverskuelige konsekvenser.
Avatar billede shjorth Nybegynder
17. marts 2007 - 17:32 #17
Smukkest. Det er bare perfekt.. Jeg bukker og takker mange gange :)
Avatar billede shjorth Nybegynder
17. marts 2007 - 18:00 #18
Et sidste spørgsmål..

Jeg kan godt få det til at virke på min webserver, men ikke på localhost.. Noget jeg skal slå til/fra??
Avatar billede dkfire Nybegynder
17. marts 2007 - 20:50 #19
localhost ??? mener du på din egen maskine ?
Hvad siger den af fejl ?
Avatar billede shjorth Nybegynder
18. marts 2007 - 13:17 #20
Ja min egen maskine :) (Xampp)Den siger ikke nogen fejl som sådan, men kalender bliver fucked.. Troede måske der var noget opsætning i php.ini eller noget i den stil jeg lige skulle fikse. :)
Avatar billede dkfire Nybegynder
19. marts 2007 - 17:59 #21
pas det vel jeg ikke.
Avatar billede poulchristian Juniormester
13. april 2012 - 07:45 #22
Halløjsa

Nu er godtnok ikke lige så hård til PHP, men løsningen fra dkfire er faktisk den bedste, jeg har kunnet finde. Uheldigvis har jeg kludder med forrige og næste måneds dage, for eksempel:

if ( $day == idate("t", mktime(0 ,0 ,0 ,$mon, 1, $year)))
{
$weekday = intval(strftime("%u", $tid));
$nextdays = 0;
for ($k=7 ; $k > $weekday ; $k--)
{
$nextdays += 1;
echo '<td style="background-color: gray;">'.date("d", strtotime("+$nextdays day", $tid))."</td>\r\n";;
}
}

Derved ser det ud til for mig, at der er flere kolonner, end der skulle være. Håber, det giver lidt mening.

Er der lige een, der kan give en hånd med. På forhånd tak.
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