Avatar billede postbil Nybegynder
27. juli 2009 - 13:55 Der er 4 kommentarer

Er jeg låst fast i min php kalender kode?

Hejsa.

Jeg er meget ny inden for programmering, men jeg har været ved at lave min egen kalender hvilket også virker fint. men jeg ønsker at udvide min kalender med et link fra hver dato til en event side (På denne side skal der kunne skrived kommentar som sendes til en mysql database) der for vil jeg gerne have sendt måned, år og dato med. mit problem er at mine datoer skrives ved hjælp af et for statement hvor ved jeg ikke umidlbart kan sende datoen videre til næste link.
Er der nogen der kan hjælpe mig med at få den valgte dato sendt videre?

Forstod i det?
Her er min kode til kalenderen:

Den er også lagt ud på mit domene..


<?php
if (!checkdate($_POST[month], 1, $_POST[year])) {
    $nowArray = getdate();
    $month = $nowArray['mon'];
    $year = $nowArray['year'];
} else {
    $month = $_POST[month];
    $year = $_POST[year];
}
$start = mktime (12, 0, 0, $month, 1, $year);
$firstDayArray = getdate($start);
?>
<html>
    <head>
        <title>Calendar</title>
        <link rel="stylesheet" type="text/css" href="Style/mainStyle.css">   
        <style type="text/css" media="all">
                                                                                         

table {
    width: 125px;
    }

td {
    padding: 1px;
    border: 1px solid #666666;
    text-align: center;
    }
        </style>
    </head>
    <body>
<?php
// Hendt den aktuelle måned og år som integer
    $thismonth = $month;
    $thisyear = $year;

// Find antal dage i den aktuele månede
    $numdaysinmonth = cal_days_in_month( CAL_GREGORIAN, $thismonth, $thisyear );

// Opret kalender objekt
    $jd = cal_to_jd( CAL_GREGORIAN, $month, date( 7 ), $year );

// find den første dag i måneden som integer (0 = Søndag, 1 = Mmandag, osv)
    $startday = jddayofweek( $jd , 0 );

// find månedens navn
    if($thismonth == 01) {
        $monthname = Januar;
    }
   
    if($thismonth == 02) {
        $monthname = Februar;
    }
   
    if($thismonth == 03) {
        $monthname = Marts;
    }
   
    if($thismonth == 04) {
        $monthname = April;
    }
   
    if($thismonth == 05) {
        $monthname = Maj;
    }
   
    if($thismonth == 06) {
        $monthname = Juni;
    }
   
    if($thismonth == 07) {
        $monthname = Juli;
    }
   
    if($thismonth == 08) {
        $monthname = August;
    }
   
    if($thismonth == 09) {
        $monthname = September;
    }
   
    if($thismonth == 10) {
        $monthname = Oktober;
    }
   
    if($thismonth == 11) {
        $monthname = November;
    }
   
    if($thismonth == 12) {
        $monthname = December;
    }
       
?>
        <form method="post" action="<?php print "$_SERVER[PHP_SELF]"; ?>">
<select name="month">
<?php
$months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
for ($x=1; $x <= count($months); $x++) {
    print "\t<option value=\"$x\"";
    print ($x == $month)?" SELECTED":"";
    print ">".$months[$x-1]."\n";
}
?>
</select>
<select name="year">
<?php
for ($x=1980; $x<=2010; $x++) {
    print "\t<option";
    print ($x == $year)?" SELECTED":"";
    print ">$x\n";
}



?>
</select>
<input type="submit" value="Go!">
</form>
        <table>
            <tr>
                <td colspan="7"><div align="center"><strong><?= $monthname ?></strong></div></td>
            </tr>
            <tr>
                <td><strong>M</strong></td>
                <td><strong>T</strong></td>
                <td><strong>O</strong></td>
                <td><strong>T</strong></td>
                <td><strong>F</strong></td>
                <td><strong>L</strong></td>
                <td><strong>S</strong></td>
            </tr>
            <tr>

<?php

    // udfyld tomme celler
    $emptycells = 0;

    for( $counter = 0; $counter <  $startday; $counter ++ ) {
        echo "\t\t<td>-</td>\n";
        $emptycells ++;
    }

// udfyld dage
// her starter problemet for dagene udfyldes med et for statement
// Hvordan kan jeg så få den aktuelle dato dendt med i linket ?
    $rowcounter = $emptycells;
    $numinrow = 7;
    for( $counter = 1; $counter <= $numdaysinmonth; $counter ++ ) {
        $rowcounter ++;
        echo "\t\t<td>";
        echo '<a href="date.php">';                            // Her er linket
        echo $counter;
        echo "</a></td>\n";
        if( $rowcounter % $numinrow == 0 ) {
            echo "\t</tr>\n";
            if( $counter < $numdaysinmonth ) {
                echo "\t<tr>\n";
            }
            $rowcounter = 0;
        }
    }
   
// Reset variabler

  $numcellsleft = $numinrow - $rowcounter;

   

  if( $numcellsleft != $numinrow ) {

    for( $counter = 0; $counter < $numcellsleft; $counter ++ ) {

        echo "\t\t<td>-</td>\n";
        $emptycells ++;

    }

   

  }

  ?>

            </tr>
        </table>
    </body>
</html>

Jeg håber meget i kan hjælpe på for hånd tak

Mik Christensen
Avatar billede repox Seniormester
27. juli 2009 - 19:20 #1
Ja, kønt er det ikke - men det virker da.
Du kan se mit forslag til en løsning på http://php.pastebin.com/m7a37a28e

Dit link vil nu viderestille til date.php?date=TIMESTAMP hvor TIMESTAMP er et Unix Timestamp som du kan manipulere med date() funktionen jf. http://php.net/date
Avatar billede postbil Nybegynder
27. juli 2009 - 21:42 #2
Mange tak for hjælpen.. Det var et svar jeg kan bruge til noget og lære af..

Du skriver at det ikke er kønt.. men hvordan burde jeg have gjort i stedet for? for jeg lære jo nok mest ved at få noget konstruktiv kritik fra andre der har mere erfaring..

endnu en gang tak for hjælpen.
Avatar billede repox Seniormester
27. juli 2009 - 23:33 #3
Overordnet set er der mange ting du kunne gøre bedre.
Du har en del syntaks og struktur fejl, på trods af at tingene virker - en slags 'gaffatape' løsning.

Jeg kan lige tage noget af det.

1:
// find månedens navn
    if($thismonth == 01) {
        $monthname = Januar;
    }

Ovenstående stump eksisterer faktisk tolv gange.
Her er det flere 'issues'
Alle strenge skal angives i enten enkelte eller dobbelte quotes (dvs $monthname = "Januar";) - det samme gælder tilgangen til arrays - også $_POST arrayets indexes.
$_POST[month] er noget gris.
$_POST["month"] er den korrekte måde at gøre det på.
Din if() har også en syntaks fejl: 01 er en streng, ikke et tal. 1 er et tal. Altså, 0'et foran er forkert, så længe det skal være at typen int.
Udover det er der bedre og mere optimale alternativer til at opnå det du gerne vil. Her er et eksempel som jeg ville bruge:
    $monthNames[1] = "Januar";
    $monthNames[2] = "Februar";
    $monthNames[3] = "Marts";
    $monthNames[4] = "April";
    $monthNames[5] = "Maj";
    $monthNames[6] = "Juni";
    $monthNames[7] = "Juli";
    $monthNames[8] = "August";
    $monthNames[9] = "September";
    $monthNames[10] = "Oktober";
    $monthNames[11] = "November";
    $monthNames[12] = "December";

Et array med alle måneders navne.
Så ville det kunne tilgås (i dit system) således:
echo $monthNames[$thismonth];

2:
Denne stump
$months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
for ($x=1; $x <= count($months); $x++) {
    print "\t<option value=\"$x\"";
    print ($x == $month)?" SELECTED":"";
    print ">".$months[$x-1]."\n";
}

Alle arrays første index er som hovedregel angivet som 0 hvis ikke andet er angivet.

En smartere og pænere måde at gøre det på ville være at indexere januar som 1. Resten vil indexere sig opad derefter.
$months = array(1 => "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
Og så gøre således:
foreach($months as $key => $value)
{
    $selected = "";
    if($key == $month)
        $selected = " selected=\"selected\"";

  echo "<option value=\"".$key."\"".$selected.">".$value."</option>";
}

Kortere og pænere kode.

Resten er i princippet et spørgsmål om vane.
Shorttags er et no-go (i min verden ihvertfald).

Altså ingen:
<?=$monthname?>
selvom det virker. Væn dig til at skrive <?php echo $monthname; ?>
Så virker det også på servere som ikke tillader shorttags.

Men altså, find en stil, men gør tingene rigtigt. Det skaber færre fejl og det gør også din kode nemmere at overskue.
Avatar billede postbil Nybegynder
28. juli 2009 - 01:12 #4
Kanon det vil jeg prøve at kikke på igen..
endnu engan mange tak for hjælpen.
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