Gast: "Cannot redeclare .. " - Funktion in While-Schleife möglich?

Hallo!
Zu meiner Seitenstruktur:
Ich rufe Daten aus einer MySQL-Tabelle in einer While-Schleife ab.
Gleichzeitig habe ich noch eine if-Anweisung in dieser While-Schleife,
das System soll bestimmte Felder anzeigen,
je nachdem wie viele Tage es noch bis X sind.

Hier kommt die Funktion ins Spiel: da das System ja nicht weiß, wie viele Tage es denn noch bis X sind, binde ich die Funktion ein.
Tue ich dies ausserhalb der While-Schleife, wird die Funktion nur einmal abgerufen, und zwar mit dem neuesten Datensatz aus der Tabelle.

Ich möchte aber, dass diese Funktion zweimal abgerufen wird, dh dass bei zwei (oder mehr) Datensätzen angezeigt wird, wie viele Tage es noch bis dahin sind. Dementsprechend werden ja dann auch die Felder angezeigt.

Ist an meiner Überlegung etwas dran, dass ich die Funktion in die While-Schleife miteinbeziehen müsste, damit diese so oft abgerufen wird, wie Datensätze in der Tabelle zur Verfügung stehen?

Wie schon erwähnt, 1x klappt es, ansonsten kommt:
Cannot redeclare DaysUntilX() (previously declared...

Bin PHP-Neuling, also bitte keine Kommentare wie "Das weiß doch jeder.."..
Danke schonmal für die Antworten :)

  1. Hi,

    Ich rufe Daten aus einer MySQL-Tabelle in einer While-Schleife ab.
    Gleichzeitig habe ich noch eine if-Anweisung in dieser While-Schleife, das System soll bestimmte Felder anzeigen, je nachdem wie viele Tage es noch bis X sind.
    Hier kommt die Funktion ins Spiel: da das System ja nicht weiß, wie viele Tage es denn noch bis X sind, binde ich die Funktion ein. Tue ich dies ausserhalb der While-Schleife, wird die Funktion nur einmal abgerufen, und zwar mit dem neuesten Datensatz aus der Tabelle.

    mir scheint, du verwechselst die Deklaration/Definition einer Funktion mit ihrem Aufruf.

    Ist an meiner Überlegung etwas dran, dass ich die Funktion in die While-Schleife miteinbeziehen müsste, damit diese so oft abgerufen wird, wie Datensätze in der Tabelle zur Verfügung stehen?

    Ja. Aber nur den Funktionsaufruf. Die Definition der Funktion steht bitteschön außerhalb der Schleife.

    Bin PHP-Neuling, also bitte keine Kommentare wie "Das weiß doch jeder.."..
    Danke schonmal für die Antworten :)

    Für konkretere Antworten oder gezielte Hilfe zeig mal ein Stück relevanten Quellcode.

    Ciao,
     Martin

    --
    Das einzige Problem beim Nichtstun: Man weiß nie, wann man damit fertig ist.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
  2. Hello,

    Ich möchte aber, dass diese Funktion zweimal abgerufen wird, dh dass bei zwei (oder mehr) Datensätzen angezeigt wird, wie viele Tage es noch bis dahin sind. Dementsprechend werden ja dann auch die Felder angezeigt.

    Es wird wohl eher eine philosophische Schlacht werden, wenn man Dich fragen wüde, warum Du die Funktion denn jedes Mal einbindest?

    Aber um das Redeclar zu vermeiden, kannst Du die Funktion

    function_exists()
       http://de3.php.net/manual/en/function.function-exists.php

    verwenden.

    Kapsele Deine Funktionsdefinition in eine Bedingung mit dieser Funktion und schon wird sie nicht ein zweites Mal deklariert und definiert.

    Alternanativ solltest Du ggf. aber auch Dein Konzept überprüfen. Das zu beurteilen, fehlen mir allerdings die übrigen Informationen.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. Moin!

    Du bindest in der Schleife mit include() oder require() ein externes Skript ein und darin wird die Funktion deklariert. Das geht dann nicht mehrfach.

    Benutze include_once() oder angemessener require_once(). Diese Funktionen wurden geschaffen um Dein Problem zu lösen, können also benutzt werden, wenn die selbe Datei an mehreren Stellen eingebunden wird, um Problemen durch erneute Definitionen von Funktionen, erneute Zuweisung von Variablen oder ähnliches zu vermeiden.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hallo, Danke, das klingt schon einmal vielversprechend.. ich fürchte, ich mache hier aber trotzdem irgendwo einen Fehler; mein Code schaut nun so aus:

        
      <?php  
      session_start();  
      $username = $_SESSION['username'];  
      ?>  
        
      <?php  
      $link = mysql_connect("localhost","root","") or die ("Keine Verbindung moeglich");  
      mysql_select_db("homepageanwendungen") or die ("Die Datenbank existiert nicht");  
        
      $abfrage = "SELECT * FROM note WHERE username LIKE '$username'";  
      $ergebnis = mysql_query($abfrage);  
      ?>  
        
      <?php  
      while ($daten = mysql_fetch_array( $ergebnis, MYSQL_ASSOC))  
      {  
          extract($daten);  
        
          echo "Name: ";  
          echo $name;  
          echo "<br />";  
        
          echo "Datum: ";  
          echo $tag;  
          echo ".";  
          echo $monat;  
          echo ".";  
          echo $jahr;  
          echo "<br />";  
          echo "<a href='lpconfig.php?note=$note'>Einteilung</a>";  
          echo "<p>";  
          echo "<b>Verbleibende Tage bis zu $note-:</b> $zahl";  
          echo "<br>";  
        
          echo "</b></P>";  
          include_once 'time.inc.php';  
        
          if ($zahl == 14) {  
       echo ("$t14")  
      } elseif ($zahl == 13) {  
       echo ("$t13")  
      }  
      .... (Den Rest erspare ich euch an der Stelle mal)  
       echo "</p>";  
      }  
      ?>  
      
      

      In time.inc.php steht jetzt:

        
      <?php  
      function DaysUntilX($day,$month,$year)  
          {  
          $dayX = mktime(0,0,0,$month,$day,$year);  
        
          $now = time();  
        
          $diff = $dayX - $now;  
        
          $days= ceil($diff/(60*60*24));  
        
           return $days;  
           }  
           $zahl = DaysUntilX($tag,$monat,$jahr);  
        
      ?>  
      
      

      Ich muss include_once falsch gesetzt haben, denn er gibt immer noch nur die verbleibenden Tage von einer Zeile aus und nicht von beiden :/

      Könnt ihr mir bitte sagen, wo ich das hinsetzen muss?

      1. Hallo,

        ich fürchte, ich mache hier aber trotzdem irgendwo einen Fehler

        ja, irgendwie schon.

        <?php

        while ($daten = mysql_fetch_array( $ergebnis, MYSQL_ASSOC))
        {
            extract($daten);

        echo "Name: ";
            echo $name;
            echo "<br />";
        [...]
            include_once 'time.inc.php';

        if ($zahl == 14) {
        echo ("$t14")
        } elseif ($zahl == 13) {
        echo ("$t13")
        }

          
        Warum setzt du das include in die Schleife? Damit deklarierst du die Funktion n-fach (okay, nur noch 1fach, da du jetzt include\_once verwendest). An der Stelle sollte nur der Funktionsaufruf stehen!  
          
        
        > In time.inc.php steht jetzt:  
        >   
        > ~~~php
        
        <?php  
        
        > function DaysUntilX($day,$month,$year)  
        >     {  
        >     $dayX = mktime(0,0,0,$month,$day,$year);  
        >   
        >     $now = time();  
        >   
        >     $diff = $dayX - $now;  
        >   
        >     $days= ceil($diff/(60*60*24));  
        >   
        >      return $days;  
        >      }  
        >      $zahl = DaysUntilX($tag,$monat,$jahr);  
        > ?>
        
        

        Und hier deklarierst du die Funktion, und rufst sie gleich mit irgendwelchen zufälligen, eventuell gar nicht definierten Parametern auf. Das *kann* ja nicht gut gehen. Hier hat der Funktionsaufruf nichts verloren.

        So long,
         Martin

        --
        Zwei Freundinnen tratschen: "Du, stell dir vor, die Petra kriegt ein Kind!" - "Ich kann mir schon denken, von wem." - "Dann ruf sie mal schnell an, das würde ihr bestimmt weiterhelfen."
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo,

          ich fürchte, ich mache hier aber trotzdem irgendwo einen Fehler

          ja, irgendwie schon.

          <?php

          while ($daten = mysql_fetch_array( $ergebnis, MYSQL_ASSOC))
          {
              extract($daten);

          echo "Name: ";
              echo $name;
              echo "<br />";
          [...]
              include_once 'time.inc.php';

          if ($zahl == 14) {
          echo ("$t14")
          } elseif ($zahl == 13) {
          echo ("$t13")
          }

          
          >   
          > Warum setzt du das include in die Schleife? Damit deklarierst du die Funktion n-fach (okay, nur noch 1fach, da du jetzt include\_once verwendest). An der Stelle sollte nur der Funktionsaufruf stehen!  
            
          \--->DAS ist das Problem, ich möchte sie n-fach AUSRUFEN nicht deklarieren!  
          Und ich warte darauf, dass mir endlich jmd sagt, wie das funktioniert :D  
            
          
          >   
          > > In time.inc.php steht jetzt:  
          > >   
          > > ~~~php
          
          <?php  
          
          > > function DaysUntilX($day,$month,$year)  
          > >     {  
          > >     $dayX = mktime(0,0,0,$month,$day,$year);  
          > >   
          > >     $now = time();  
          > >   
          > >     $diff = $dayX - $now;  
          > >   
          > >     $days= ceil($diff/(60*60*24));  
          > >   
          > >      return $days;  
          > >      }  
          > >      $zahl = DaysUntilX($tag,$monat,$jahr);  
          > > ?>
          
          

          Und hier deklarierst du die Funktion, und rufst sie gleich mit irgendwelchen zufälligen, eventuell gar nicht definierten Parametern auf. Das *kann* ja nicht gut gehen. Hier hat der Funktionsaufruf nichts verloren.

          ----> Also wieder in die Ausgangsseite schreiben?, .. doch, funktionieren tut es, und das ist mir jetzt erstmal egal wie abenteuerlich der Countdown-Code ist - es soll nur erstmal vom Prinzip her funktioneren :)

          Danke schonmal :D

          1. EDIT :D

            ich habe den Wert der Funktion in einer Variablen ("$zahl") gespeichert,
            und dann mit echo abgerufen.

            Jetzt wird der Wert 0 ausgegeben, ich vermute, weil die Funktion Werte aus der MySQL-Tabelle benötigt (zuvor wird Tag,Monat,Jahr als Datum gespeichert)
            Und ich die Funktion ja nicht vor der While-Schleife deklarieren kann, weil es ja da noch nicht die Variablen empfangen hat?

            Also ich meine hiervor:

            ``

            Das überfordert mich einfach :D Aufgerufen hab ich die Funktion jetzt an der richtigen Stelle, aber wo setze ich die Deklaration hin, wenn sie MySQL-Daten benötigt, die ich erst mit der WHile-Schleife abrufe? Nach der While-Schleife geht ja auch nicht, oder? Weil die Variable in der While-Schleife steht und auf die Funktion zugreifen muss..versteh ich das richtig?

            1. Hi,

              hast Du die Tipps der anderen, Dich mit Funktionen zu beschäftigen, bereits befolgt?

              Und ich die Funktion ja nicht vor der While-Schleife deklarieren kann, weil es ja da noch nicht die Variablen empfangen hat?

              Doch. Das ist ja gerade der Sinn der Deklaration. Sie benutzt doch  Variablennamen, nicht feste Werte. Die Deklaration muss (genau ein mal) erfolgen irgendwann bevor Du die Funktion das erste mal aufrufst (üblicherweie ganz oben in der  Datei). Sie ist lediglich eine Anweisung für den Interpreter, wie er bei einem Aufruf mit den Daten umzugehen hat. Also streiche den Funktionsaufruf (die letzte Zeile Deiner Incluce-Datei) und binde die Datei nur einmal oben ein. Und dort, wo Dir die Daten tatsächlich zur Verfügung stehen, belässt Du nur noch die Zeile mit dem Aufruf. Nur durch den Aufruf werden dann dieser Stelle die tatsächlichen Daten verarbeitet, also der Funktionscode mit den dann konkret angegebenen Daten durchlaufen.

              Ciao, Stefanie

              1. Morgen,
                ja die Ausgabe muss zwei Zeilen sein, weil ich die zwei Zeilen selbst in die MySQL-Tabelle gepostet habe.. Datumsausgabe sollte 4 + 5 sein; ich kriege leider Gottes immer nur noch die "4" als Wert raus.

                Bin echt am Verzweifeln, wenn ich's heut nicht hinkrieg, werd ich das sein lassen ^^..

                Mein Code:

                  
                <?php  
                session_start();  
                $username = $_SESSION['username'];  
                ?>  
                  
                <?php  
                $link = mysql_connect("localhost","root","") or die ("Keine Verbindung moeglich");  
                mysql_select_db("homepageanwendungen") or die ("Die Datenbank existiert nicht");  
                  
                $abfrage = "SELECT * FROM note WHERE username LIKE '$username'";  
                $ergebnis = mysql_query($abfrage);  
                ?>  
                <?php  
                require 'time.inc.php';  
                ?>  
                <?php  
                while ($daten = mysql_fetch_array( $ergebnis, MYSQL_ASSOC))  
                {  
                    extract($daten);  
                  
                    echo "Name: ";  
                    echo $name;  
                    echo "<br />";  
                  
                    echo "Datum: ";  
                    echo $tag;  
                    echo ".";  
                    echo $monat;  
                    echo ".";  
                    echo $jahr;  
                    echo "<br />";  
                    echo "<a href='lpconfig.php?name=$name'>Notiz</a>";  
                    echo "<p>";  
                    echo "<b>Verbleibende Tage:</b> $tage";  
                    echo "<br>";  
                    echo "$tage";  
                  
                    echo "</b></P>";  
                ?>  
                
                

                Die Require-Datei:

                  
                <?php  
                $datum = date("d.m.Y.");  
                $datum2 = "$tag.$monat.$jahr";  
                  
                function return_timestamp($date){  
                $pieces = split("\.",$date);  
                $stamp = mktime(0, 0, 0, $pieces[1],$pieces[0] , $pieces[2]);  
                return($stamp);  
                }  
                  
                $beginn = return_timestamp($datum);  
                $ende = return_timestamp($datum2);  
                  
                $s = ($ende - $beginn)/86400;  
                $tage = round($s,0);  
                  
                echo $tage;  
                ?>  
                
                

                Die Ausgabe:

                Name: ..
                Datum: 18.06.2010
                Verbleibende Tage:

                Name ..
                Datum 17.06.2010
                Verbleibende Tage:

                4

                (die 4 durch die require-Datei)
                Ich verstehe leider immer noch nicht, welchen Fehler ich dareingebaut habe.. :/

                1. Moin!

                  Du bindest das einmal ein, also wird es auch nur einmal ausgeführt und zwar genau an der Stelle an der Du es einbindest. Stell Dir einfach vor Du hättest diesen Code dort stehen, wo require 'datei'; steht.

                  MFFG (Mit freundlich- friedfertigem Grinsen)

                  fastix

                2. Hi!

                  Ich verstehe leider immer noch nicht, welchen Fehler ich dareingebaut habe.. :/

                  Du verstehst immer noch nicht, wie das mit den Funktionen funktioniert. Stell dir vor du benötigst zur Erledigung einer Aufgabe ein Werkzeug. Wenn es ein mehrfach verwendbares ist, wird es in irgendeiner Fabrik hergestellt, die sich sonstwo befinden kann. Auch der Zeitpunkt der Herstellung spielt keine Rolle. Es muss nur bereits irgendwann in der Vergangenheit passiert sein. Dieses Werkzeug kannst du nun da einsetzen, wo du es benötigst, die Fabrik dazu benötigst du an den Stellen jedenfalls nicht.

                  Genauso wie du die Session vorbereitest, indem du am Scriptanfang session_start() verwendest, kannst du die Nutzung deiner Funktion vorbereiten, indem du sie am Scriptanfang notierst oder dort per include/require hinzulädst. An den Stellen, an denen du ihr Ergebnis benötigst, rufst du sie nur noch mit ihrem Namen und den benötigten Parametern auf.

                  Du kannst das Ganze auch mit jeder x-beliebigen PHP-Funktion vergleichen, strlen() beispielsweise. Sie ist bereits irgendwo in den Tiefen PHPs deklariert worden - das musst du nicht mehr tun - aber verwenden kannst du sie überall da, wo es dir beliebt.

                  Lo!

                3. Hi,

                  Mein Code:

                  das ist aber nicht das, wozu ich Dir geraten hatte. Ich bezog mich auf Deinen ursprünglich geposteten Code und schrieb dazu:

                  "Also streiche den Funktionsaufruf (die letzte Zeile Deiner Incluce-Datei) und binde die Datei nur einmal oben ein. Und dort, wo Dir die Daten tatsächlich zur Verfügung stehen, belässt Du nur noch die Zeile mit dem Aufruf."

                  Deine hier geposteten Änderungen haben damit kaum was zu tun. Du rufst die Funktion immer noch innerhalb der includeten Datei auf und zudem hast Du auch noch andere Anweisungen da rein gepackt (das ist sowieso heikel).

                  Verzichte am besten einfach ganz auf den Include, um erstmal nur die Sache mit den Funktionen zu verstehen. Deklariere die Funktion direkt im Code Deiner PHP-Datei (heisst: kopiere den Funktionscode ganz oben in Deine  PHP-Datei, schreibe den Aufruf an die Stelle, wo die Daten verarbeitet werden müssen).

                  Ich verstehe leider immer noch nicht, welchen Fehler ich dareingebaut habe.. :/

                  Du verstehst ganz einfach immer noch nicht, was Funktionen sind, wie man sie benutzt und was bei einem include passiert. Aber das kann man ja lesen und üben...

                  Ciao, Stefanie

          2. Hi,

            --->DAS ist das Problem, ich möchte sie n-fach AUSRUFEN nicht deklarieren!

            Ja, das wussten wir alle schon.

            Und ich warte darauf, dass mir endlich jmd sagt, wie das funktioniert :D

            Wenn du nicht weißt, wie man eine Funktion aufruft, dann solltest du dich mit den Grundlagen beschäftigen.
            http://www.php.net/manual/en/language.functions.php

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
          3. Hi!

            Warum setzt du das include in die Schleife? Damit deklarierst du die Funktion n-fach (okay, nur noch 1fach, da du jetzt include_once verwendest). An der Stelle sollte nur der Funktionsaufruf stehen!

            Ja, aber nicht in der Include-Datei, denn durch das _once wird nicht nur die Deklaration nur einmal ausgeführt sondern auch der Aufruf.

            --->DAS ist das Problem, ich möchte sie n-fach AUSRUFEN nicht deklarieren!
            Und ich warte darauf, dass mir endlich jmd sagt, wie das funktioniert :D

            Du könntest auch ein Grundlagentutorial zu Rate ziehen um dir grundlegend die Verwendung von Funktionen zu Gemüte zu führen. Funktionen sind dafür da, dass man einmalig definiert, was passieren soll. Dies soll aber nicht sofort passieren sondern erst bei einem Aufruf. Also steht die Deklaration an einer "einmaligen" Stelle und der Aufruf dort wo man ihn benötigt.

            Funktionen und deren Aufruf sind getrennte Sachen. Der Chef erzählt seinen Mitarbeitern einmalig, wie eine Aufgabe zu erledigen ist. Wenn diese Aufgabe wirklich ansteht, nennt er nur noch ihren Namen und die dafür notwendigen Parameter. Die Definition der Aufgabe selbst ist Geschichte und kommt nie wieder vor.

            Was außerdem mal wieder nicht beachtet wurde ist der Kontextwechsel.

            Lo!

      2. Moin!

        Hallo, Danke, das klingt schon einmal vielversprechend.. ich fürchte, ich mache hier aber trotzdem irgendwo einen Fehler; mein Code schaut nun so aus:

        Oh ja. Aber das lernst Du noch...

          
        <?php  
        session_start();  
        $username = $_SESSION['username'];  
        $link = mysql_connect("localhost","root","") or die ("Keine Verbindung moeglich"); # ich hoffe dies ist nur auf einem localen Host und experimentell.  
        mysql_select_db("homepageanwendungen") or die ("Die Datenbank existiert nicht");  
          
        $abfrage = "SELECT `Spalte1`, `Spalte2`, `Spalte3` FROM `note` WHERE `username` LIKE '".mysql_real_escape_string($username)."'"; # Besser, sicherer  
        # Like macht ohne '%' das selbe wie "=". Gibt es deshalb nur ein Ergebnis? Du scheinst aber zwei zu erwarten?  
          
        $ergebnis = mysql_query($abfrage);  
        print  mysql_num_rows($ergebnis)." Zeilen zurück gegeben."; # Test  
          
        while ($daten = mysql_fetch_array( $ergebnis, MYSQL_ASSOC)) {  
             /* was macht denn extract(daten) so wichtiges?  
             Doch nicht etwa $month,$day,$year in globale Variablen schreiben? Weg damit! */  
             $zahl =  ceil((mktime(0,0,0,$month,$day,$year) - time())/86400); # Das war Deine Funktion  
             if ($zahl == 14) {  
                   print $t14; # warum print?  
             } elseif ($zahl == 13) {  
                   print $t13;  
             }  
             /* und so weiter. Warum nimmst Du hier nicht [link:http://php.net/manual/de/control-structures.switch.php@title=switch / case]?  
              Der "Fehler" kann auch hier liegen. */  
        }  
        ?>  
        
        

        In time.inc.php steht jetzt:

        nichts mehr.

        Ich muss include_once falsch gesetzt haben, denn er gibt immer noch nur die verbleibenden Tage von einer Zeile aus und nicht von beiden :/

        Was für zwei Zeilen? Woher weisst Du, dass "SELECT * FROM note WHERE username LIKE '$username'" zwei Zeilen zurück liefert? Warum sollte es das?

        Könnt ihr mir bitte sagen, wo ich das hinsetzen muss?

        Innerhalb von Schleifen sollte man gewohnheitsmäßig so wenig Aufwand verursachen wie möglich. Also raus mit dem include/require aus der Schleife.

        wenn in der zu includierenden Datei eine benötigte Funktion ist, dann nimm require, nicht include. Die Funktion ist unbedingt notwendig, ist die Datei nicht vorhanden oder nicht lesbar, dann ist der Fehler fatal- Abbruch. require oder require_once macht genau das.

        Deine Funktion lsst sich zu einem übersichtlichen Einzeiler reduzieren - weg damit und also weg mit dem include/require.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Hi,

          Deine Funktion lsst sich zu einem übersichtlichen Einzeiler reduzieren - weg damit und also weg mit dem include/require.

          Sieht die Zeile:
          "$zahl =  ceil((mktime(0,0,0,$month,$day,$year) - time())/86400); "

          übersichtlicher aus als folgende...?

          "$zahl = DaysUntilX($day,$month,$year)"

          Im Sinne eines selbsterklärenden Codes und Kapselung von Algorithmen ist es durchaus sinnvoll, auch Einzeiler in Funktionen auszulagern. Wenn sie mehrfach angewendet werden, ist das ohnehin ein fester Bestandteil vom Refactoring.

          Ciao, Stefanie

          1. Moin!

            Sieht die Zeile:
            "$zahl = ceil((mktime(0,0,0,$month,$day,$year) - time())/86400); "

            übersichtlicher aus als folgende...?

            "$zahl = DaysUntilX($day,$month,$year)"

            Ja. Du musst das vorherige Include, den Funktionsaufruf, die Funktion selbst mit berücksichtigen.

            Im Sinne eines selbsterklärenden Codes und Kapselung von Algorithmen ist es durchaus sinnvoll, auch Einzeiler in Funktionen auszulagern. Wenn sie mehrfach angewendet werden, ist das ohnehin ein fester Bestandteil vom Refactoring.

            Jein... Im konkreten Fall sieht es nicht danach aus als käme dies mehrfach vor. Was die Komplexität angeht befinden wir uns hier in einer Grenzzone. Da lässt sich gut streiten.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

          2. Hallo,

            Sieht die Zeile:
            "$zahl =  ceil((mktime(0,0,0,$month,$day,$year) - time())/86400); "

            übersichtlicher aus als folgende...?

            "$zahl = DaysUntilX($day,$month,$year)"

            ja, hier schon.

            Im Sinne eines selbsterklärenden Codes und Kapselung von Algorithmen ist es durchaus sinnvoll, auch Einzeiler in Funktionen auszulagern.

            "Ja, aber". Wenn der Funktionsname gut gewählt ist und sowohl Zweck als auch Ergebnis der Funktion hinreichend klar beschreibt, stimme ich zu. Oft ist das aber nicht der Fall, und dann ist es IMHO übersichtlicher, eine etwas komlexere Anweisung hinzuschreiben, in der nur noch Standardfunktionen der Programmiersprache und einfache Operationen auftauchen.

            Hier ist es das X, das den Funktionsnamen geheimnisvoll macht. Ohne dieses X, also DaysUntil(), wäre die Sachlage klar und ich würde mich deinem Standpunkt vorbehaltlos anschließen. Aber gerade dieses X macht einen beim Lesen wieder nachdenklich, weil nicht klar ist, wofür es steht oder was es bedeuten soll.

            So long,
             Martin

            --
            Das Leben ist lebensgefährlich und endet meistens tödlich.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        2. Hi!

          $username = $_SESSION['username'];

          Das Umkopieren ist üblicherweise unsinnig. Ganz besonders wenn die neue Variable anschließend nur ein einziges Mal verwendet wird.

          $zahl =  ceil((mktime(0,0,0,$month,$day,$year) - time())/86400); # Das war Deine Funktion

          Diese Rechnung (und auch das Original) kann je nach Aufgabenstellung falsch sein, weil sie die Sommerzeitumstellung nicht berücksichtigt.

          Lo!

          1. Moin!

            $zahl = ceil((mktime(0,0,0,$month,$day,$year) - time())/86400); # Das war Deine Funktion

            Diese Rechnung (und auch das Original) kann je nach Aufgabenstellung falsch sein, weil sie die Sommerzeitumstellung nicht berücksichtigt.

            Na dann ...

            $zahl = (mktime(0,0,0,$month,$day,$year) - mktime(0,0,0,date('m'),date('d'),date('Y')))/86400;

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix