php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 16-08-2009, 01:55
Jester_Prince
 Registrierter Benutzer
Links : Onlinestatus : Jester_Prince ist offline
Registriert seit: Jul 2009
Ort: Berlin
Beiträge: 33
Jester_Prince befindet sich auf einem aufstrebenden Ast
Standard Kalender-Script funktioniert bei Schaltjahren nicht

Guten Abend/Morgen!

Heute habe ich ein Problem, bei dem ich nicht ganz weiß, ob ich einfach nur schusselig bin oder ob es tatsächlich an einer Lücke in meinem Wissen über die Datumsfunktionen von PHP geht.

Ich habe mir ein Script für eine Kalenderfunktion geschrieben. Diese ist vielleicht nicht perfekt, aber sie ist vollständig auf meinem Mist gewachsen und deshalb bin ich an sich sehr zufrieden damit, zumal das Script, bis auf eine Sache super funktioniert.

Bei einem Schaltjahr funktioniert das Script nämlich nicht und ich kann einfach nicht den Grund dafür herausfinden.

Es wäre klasse, wenn mir jemand mit meinem Problem helfen könnte.

Das Script sieht wie folgt aus:
PHP-Code:
<?php

// The current month
$month date("n");
// The current year
$year date("Y");
// The current day
$day date("j");

if(isset(
$_SESSION['posted'])) {
    
$date $_SESSION['posted'];
    
$set "yes";
    
$year substr($date04);
    
$month substr($date52);
    
$day substr($date82);
}

function 
displayCalendar($month$year$day$date$set) {

    
$cal "<table cellspacing=\"0\" id=\"calendar\" summary=\"Calendar table\">\n";
    
$cal .= "\t<caption>" strftime("%B %Y"strtotime($date)) . "</caption>\n";
    
$cal .= "\t<thead>\n";
    
$cal .= "\t\t<tr>\n";
    
$cal .= "\t\t\t<th id=\"calendarHead\" scope=\"col\" title=\"Monday\">Mon</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Tuesday\">Tue</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Wednesday\">Wed</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Thursday\">Thu</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Friday\">Fri</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Saturday\">Sat</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Sunday\">Sun</th>\n";
    
$cal .= "\t\t</tr>\n";
    
$cal .= "\t</thead>\n";
    
$cal .= "\t<tbody>\n";

    
// The first day of the current month
    
$first_day_in_month date("D"mktime(000$month1$year));

    
// How many days does the current month have?
    
$month_has_days cal_days_in_month(CAL_GREGORIAN$month$year);

    
// An array containing the days of the week in sequence
    
$day_nr = array("Mon" => 1,
                    
"Tue" => 2,
                    
"Wed" => 3,
                    
"Thu" => 4,
                    
"Fri" => 5,
                    
"Sat" => 6,
                    
"Sun" => 7);

    
// The number of the first table data element containing a date
    
$begin_at_day_nr $day_nr[$first_day_in_month];

    
// The total number of tr tags
    
$trs ceil(($begin_at_day_nr $month_has_days)/7);

    
// The total number of td tags
    
$total_tds $trs 7;

    for(
$i=1$i<=$total_tds$i++) {

        
// Begin with a tr tag
        
if($i == 1) {
            
$cal .= "\t\t<tr class=\"odd\">\n";
        }

        
// Seven table data tags per row are needed, so put
        // a </tr> after every seventh td tag
        
if($i == AND $i != 1) {
            if(
$i-$month_has_days != 0) {
                
$cal .= "\t\t</tr>\n";
                
// Assign a class to every second tr tag
                
if($i == 1) {
                    
$cal .= "\t\t<tr class=\"odd\">\n";
                } else {
                    
$cal .= "\t\t<tr>\n";
                }
            }
        }

        
// Since not every month starts with the same week day there will
        // have to be some td tags without a calendar day. Fill them with
        // the word "empty" and use CSS with a high negative text-indent
        // value to make them appear empty, in order to keep the Markup valid
        
if($i<$begin_at_day_nr OR $i-$begin_at_day_nr+1>$month_has_days) {
            
$cal .= "\t\t\t<td class=\"empty\">empty</td>\n";
        } else {
        
// Substract the number of empty tds from the actual number of tds
        // in order to display the correct calendar day
            
$cal_day $i-$begin_at_day_nr+1;
            if(
$cal_day 10) {
                
$cal_day "0". (string)$cal_day;
            }
            if(
$cal_day == $day) {
                if(
$set == "yes") {
                    
$cal .= "\t\t\t<td class=\"marked\" title=\"Current blog\">" $cal_day "</td>\n";
                } else {
                    
$cal .= "\t\t\t<td class=\"marked\" title=\"Today's date\">" $cal_day "</td>\n";
                }
            } else {
                
$cal .= "\t\t\t<td>" $cal_day "</td>\n";
            }
        }
    }

    
$earlier date("F"mktime(000$month-10$year));
    
$later date("F"mktime(000$month+20$year));

    
$cal .= "\t\t</tr>\n";
    
$cal .= "\t</tbody>\n";
    
$cal .= "</table>\n";

    return 
$cal;

}

echo 
displayCalendar($month$year$day$date$set);

unset(
$date$_SESSION['posted'], $set);

?>
Beachtet einfach den obersten Block nicht, und gebt einmal die Daten eines Schaltjahres ein, bspw.:
PHP-Code:
 echo displayCalendar(022004$day$date$set); 
Dann werdet Ihr sehen, dass die letzte Reihe von table data tags nicht mehr von table row tags umschlossen wird. Und es scheint tatsächlich nur bei Schaltjahren nicht zu funktionieren.

Ich komme einfach nicht auf den Fehler und bin für jede Hilfe dankbar!

EDIT: Ich hoffe, der Code ist nicht zu unübersichtlich.

Geändert von Jester_Prince (16-08-2009 um 03:59 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 16-08-2009, 03:51
Jester_Prince
 Registrierter Benutzer
Links : Onlinestatus : Jester_Prince ist offline
Registriert seit: Jul 2009
Ort: Berlin
Beiträge: 33
Jester_Prince befindet sich auf einem aufstrebenden Ast
Standard

Ich habe den Fehler selbst gefunden.


PHP-Code:
if($i == AND $i != 1) {
    if(
$i-$month_has_days != 0) {    /* In dieser überflüssigen Abfrage liegt der Fehler */
        
$cal .= "\t\t</tr>\n";
         if(
$i == 1) {
            
$cal .= "\t\t<tr class=\"odd\">\n";
        } else {
            
$cal .= "\t\t<tr>\n";
        }
    }

Ich muss vergessen haben, diese Zeile nach einem Test aus dem Script zu löschen. Wenn man zu lange an etwas arbeitet, geht die Konzentration eben verloren.

Geändert von Jester_Prince (16-08-2009 um 03:54 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 16-08-2009, 04:15
Jester_Prince
 Registrierter Benutzer
Links : Onlinestatus : Jester_Prince ist offline
Registriert seit: Jul 2009
Ort: Berlin
Beiträge: 33
Jester_Prince befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
<?php

$date 
date("Y-m-H");
$set "no";
$month date("n");
$year date("Y");
$day date("j");

function 
displayCalendar($month$year$day$date$set) {

    
$cal "<table cellspacing=\"0\" id=\"calendar\" summary=\"Calendar table\">\n";
    
$cal .= "\t<caption>" strftime("%B %Y"strtotime($date)) . "</caption>\n";
    
$cal .= "\t<thead>\n";
    
$cal .= "\t\t<tr>\n";
    
$cal .= "\t\t\t<th id=\"calendarHead\" scope=\"col\" title=\"Monday\">Mon</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Tuesday\">Tue</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Wednesday\">Wed</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Thursday\">Thu</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Friday\">Fri</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Saturday\">Sat</th>\n";
    
$cal .= "\t\t\t<th scope=\"col\" title=\"Sunday\">Sun</th>\n";
    
$cal .= "\t\t</tr>\n";
    
$cal .= "\t</thead>\n";
    
$cal .= "\t<tbody>\n";

    
// The first day of the current month
    
$first_day_in_month date("D"mktime(000$month1$year));

    
// How many days does the current month have?
    
$month_has_days cal_days_in_month(CAL_GREGORIAN$month$year);

    
// An array containing the days of the week in sequence
    
$day_nr = array("Mon" => 1,
                    
"Tue" => 2,
                    
"Wed" => 3,
                    
"Thu" => 4,
                    
"Fri" => 5,
                    
"Sat" => 6,
                    
"Sun" => 7);

    
// The number of the first table data element containing a date
    
$begin_at_day_nr $day_nr[$first_day_in_month];

    
// The total number of tr tags
    
$trs ceil(($begin_at_day_nr $month_has_days-1)/7);

    
// The total number of td tags
    
$total_tds $trs 7;

    for(
$i=1$i<=$total_tds$i++) {

        
// Begin with a tr tag
        
if($i == 1) {
            
$cal .= "\t\t<tr class=\"odd\">\n";
        }

        
// Seven table data tags per row are needed, so put
        // a </tr> after every seventh td tag
        
if($i == AND $i != 1) {
        if(
$i-$first_day_in_month-!= 0) {
            
$cal .= "\t\t</tr>\n";
            
// Assign a class to every second tr tag
            
if($i == 1) {
                
$cal .= "\t\t<tr class=\"odd\">\n";
            } else {
                
$cal .= "\t\t<tr>\n";
            }
        }
        }

        
// Since not every month starts with the same week day there will
        // have to be some td tags without a calendar day. Fill them with
        // the word "empty" and use CSS with a high negative text-indent
        // value to make them appear empty, in order to keep the Markup valid
        
if($i<$begin_at_day_nr OR $i-$begin_at_day_nr+1>$month_has_days) {
            
$cal .= "\t\t\t<td class=\"empty\">empty</td>\n";
        } else {
        
// Substract the number of empty tds from the actual number of tds
        // in order to display the correct calendar day
            
$cal_day $i-$begin_at_day_nr+1;
            if(
$cal_day 10) {
                
$cal_day "0". (string)$cal_day;
            }
            if(
$cal_day == $day) {
                if(
$set == "yes") {
                    
$cal .= "\t\t\t<td class=\"marked\" title=\"Current blog\">" $cal_day "</td>\n";
                } else {
                    
$cal .= "\t\t\t<td class=\"marked\" title=\"Today's date\">" $cal_day "</td>\n";
                }
            } else {
                
$cal .= "\t\t\t<td>" $cal_day "</td>\n";
            }
        }
    }

    
$earlier date("F"mktime(000$month-10$year));
    
$later date("F"mktime(000$month+20$year));

    
$cal .= "\t\t</tr>\n";
    
/*
    $cal .= "\t\t<tr>\n";
    $cal .= "\t\t\t<td colspan=\"3\" class=\"monthLink\">&lt;&lt; " . $earlier . "</td>\n";
    $cal .= "\t\t\t<td class=\"empty noHover\">empty</td>\n";
    $cal .= "\t\t\t<td colspan=\"3\" class=\"monthLink\">" . $later . " &gt;&gt;</td>\n";
    $cal .= "\t\t</tr>\n";
    */
    
$cal .= "\t</tbody>\n";
    
$cal .= "</table>\n";

    return 
$cal;

}

echo 
displayCalendar($month$year$day$date$set);

unset(
$date$_SESSION['posted'], $set);
So! Nun arbeitet das Script genau so, wie es soll. Es geht vielleicht einfacher, effektiver und vielleicht auch schöner, aber es geht doch nichts über eigenen Code.

Wer die Funktion benutzen/erweitern/verbessern möchte, kann dies gerne tun. Es wäre aber schön, wenn Ihr Eure Version dann auch hier postet, damit jeder was davon hat.

Und hier noch einmal ein Bild von der CSS formatierten Version meines Kalenders ;-)

Mit Zitat antworten
  #4 (permalink)  
Alt 16-08-2009, 14:32
Benutzerbild von Berni Berni
  OWNER
Links : Onlinestatus : Berni ist offline
Registriert seit: Jan 2001
Ort: Frankfurt / Egelsbach
Beiträge: 6.306
Blog-Einträge: 6
Berni befindet sich auf einem aufstrebenden Ast
Standard

danke für deine die Lösung!
Viele werden vor ähnlichen Problemen stehen
__________________

php-Entwicklung | ebiz-consult.de
PHP-Webhosting für PHP Entwickler | ebiz-webhosting.de
die PHP Marktplatz-Software | ebiz-trader.de
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Script funktioniert nicht x16 HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 5 01-10-2008 18:02
Script env.cgi funktioniert nicht bweichel ASP, PERL, CGI, C und alles andere 4 11-10-2007 16:26
[JavaScript] Kalender von dynarch.com funktioniert nicht im IE st@tic HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 5 12-07-2007 17:42
Script funktioniert nicht PHPbeginner Tutorials 15 04-01-2005 21:59
PHP Script funktioniert nicht Tarlar PHP Developer Forum 9 13-07-2004 20:32

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:18 Uhr.