Christian: Fatal error: Cannot redeclare...

Hallo,

ich bin dabei ein Trainingslog mit Hilfe einer MySQL Datenbank zu programmieren. Nun habe ich folgendes Problem:

Datei weekoutput.php:

?php
include 'check.php';
include 'connect.php';
include_once 'datefunction.php';

$query = "SELECT date FROM training ORDER BY date LIMIT 1";
$result = mysql_query($query);

/*Erster Eintrag wird gesucht und Datum ausgelesen, daraus der timestamp des Beginns der ersten Woche errechnet*/

while($row = mysql_fetch_object($result))
    {$date = $row->date;
    $firstweek = date("W",$date);
    $firstyear = date("Y",$date);
    $week = week($firstweek, $firstyear);
    $weekstart = $week[0];
    $weekend = $week[1];}

$now = time();

/*Hier möchte ich alle Trainingseinheiten der ersten Woche auslesen und ihre Anzahl angeben. Dann wird die Woche um eins erhöht, dann der timestamp von Wochenanfang und Wochenende errechnet. Anschließend wird das ganze wiederholt, bis wir den jetzigen Zeitpunkt erreichen. */

while ($weekstart <= $now) {

$query = "SELECT * FROM training WHERE date >= '".$weekstart."' AND date <= '".$weekend."' ORDER BY date";
  $result = mysql_query($query);

while($row = mysql_fetch_object($result))
    {$date = $row->date;
    $calweek = date("W",$date[0]);
    $year = date("Y",$date[0]);

$numberofresults = mysql_num_rows($result);
    echo $numberofresults."<br />";

$calweek++;
    $week = week($calweek, $year);
    $weekstart = $week[0];
    $weekend = $week[1];

}

}

?>

----------------------------------------------
Datei datefunction.php (Hier werden Wochenanfang, und Wochenende errechnet):

<?php
function week($week, $year) {

function firstmonday($year)
{
$fourth = mktime(0,0,0,1,4,$year);
$weekday = date("w",$fourth);
if ($weekday == 0) {$weekday = 7;}
$firstmonday = $fourth-($weekday-1)*86400;
return $firstmonday;}

$firstmonday = firstmonday($year);
$week = $week-1;

$weekmonday = strtotime("@$firstmonday +$week weeks");
$weeksunday = strtotime("@$weekmonday +1 week -1 second");

$week = array($weekmonday,$weeksunday);

return $week;}
?>

-------------------------------------

Das Problem ist, dass ich wenn ich das Skript weekoutput.php aufrufe, folgende Fehlermeldung erhalte:

Fatal error: Cannot redeclare firstmonday() (previously declared in [...]/training/datefunction.php:4) in [...]/training/datefunction.php on line 4

Die Funktion in datefunction.php selbst funktioniert jedoch einwandfrei, der Fehler liegt irgendwo in der zweiten Datenbankabfrage. Über Google habe ich nur rausgefunden, dass man include durch include_once ersetzen kann um solche Fehler zu vermeiden. Das hat ja aber nun nicht funktioniert. Wo könnte der Fehler sonst liegen?

Vielen Dank im Voraus,

Christian

  1. Hi!

    was steht denn in check.php und connect.php?

    1. Hi,

      was steht denn in check.php und connect.php?

      check.php überprüft ob man angemeldet ist:

      <?php
           session_start();

      if (!isset($_SESSION['angemeldet']) || !$_SESSION['angemeldet']) {
            header('Location: http://[...]/training/login.php?error=2');
            }

      else {
            $angemeldet = yes;}

      ?>

      Und connect.php verbindet zur Datenbank (funktioniert auch, mit anderen Skripts getestet):

      <?php
        mysql_connect("localhost",
        "username","passwort") or die
        ("Keine Verbindung m&ouml;glich.");
        mysql_select_db("d872lf7g") or die
        ("Die Datenbank existiert nicht.");
      ?>

      Vielen Dank,

      Christian

  2. Moin!

    Fatal error: Cannot redeclare firstmonday() (previously declared in [...]/training/datefunction.php:4) in [...]/training/datefunction.php on line 4

    Logisch. Die "Funktion" deiner Funktion week ist es, die Funktion firstmonday zu definieren. Das funktioniert beim ersten Aufruf von week noch, beim zweiten schlägt es fehl:

    <?php
    function week($week, $year) {

    function firstmonday($year)
    {

    [...]

    ?>

    Du kannst in PHP keine Funktionen schachteln, um "lokale" Funktionen zu erreichen. Funktionen sind in PHP immer global.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Moin,

      also ich habe verstanden, dass ich Funktionen nicht schachteln kann, aber was heißt, dass Fuktionen immer global sind?

      Außerdem funktioniert es ja, wenn ich das Skript außerhalb einer MySQL-Abfrage benutze und ich weiß nicht warum.

      Wie könnte ich die Schachtelung umgehen, brauche ich dann zwei Funktionen? Ich muss ja erst die Funktion firstmonday laufen lassen, und dann mit deren Ergebnis weiterarbeiten...

      Danke,

      Christian

      1. Nabend,

        Dass Funktionen global sind heisst, dass jede Funktion immer und ueberall yur Verfuegung steht.
        es gibt keine Funktionen, die z.b. (wie bei dir) nur in einer anderen Funktion zur verfuegung stehen.

        Dein Konstrukt funktioniert. Genau 1x. Wenn du die Funktion week() ein zweites Mal aufrufst, gibt es die darin enthaltende Funktion schon und es wird ein Fehler generiert.

        Verschiebe Die Funktion firstmonday einfach aus der week() und fertig.

      2. Hallo Christian,

        also ich habe verstanden, dass ich Funktionen nicht schachteln kann, aber was heißt, dass Fuktionen immer global sind?

        das heißt, PHP unterstützt keine Funktionen, die nur innerhalb einer anderen Funktion "sichtbar" sind, d.h. aufgerufen werden können. Andere Programmiersprachen wie z.B. Pascal als alter Klassiker oder Javascript als moderne Scriptsprache können Funktionen verschachteln:

        function fa()
         { var xy ...
           function fb()
            { ...
            }
         }

        Die Funktion fb() kann dann nur von innerhalb der Funktion fa() aufgerufen werden (lokal), von außerhalb ist sie sozusagen unsichtbar. Und genau diese Abgrenzung kann PHP nicht leisten.

        Außerdem funktioniert es ja, wenn ich das Skript außerhalb einer MySQL-Abfrage benutze und ich weiß nicht warum.

        Das hat damit nichts zu tun.

        Wie könnte ich die Schachtelung umgehen, brauche ich dann zwei Funktionen? Ich muss ja erst die Funktion firstmonday laufen lassen, und dann mit deren Ergebnis weiterarbeiten...

        Deklariere die Funktionen nacheinander, ohne sie zu schachteln. In welcher Reihenfolge du sie dann _verwendest_, ist völlig wurscht. Du kannst eine Funktion jederzeit aus einer anderen heraus aufrufen, das ist kein Problem.

        Schönen Abend noch,
         Martin

        --
        Was du heute kannst besorgen,
        das geht sicher auch noch morgen.
        1. Hello,

          das heißt, PHP unterstützt keine Funktionen, die nur innerhalb einer anderen Funktion "sichtbar" sind,

          Nur in der OOP-Variante von PHP...

          Weißt Du, ob es in PHP 6 jettz endlich eine Möglichkeit gibt, deklaierte Funktionen wieder zu "undeklarieren" und aus dem Speicher zu entfernen?

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

          1. Hallo Tom,

            das heißt, PHP unterstützt keine Funktionen, die nur innerhalb einer anderen Funktion "sichtbar" sind,
            Nur in der OOP-Variante von PHP...

            ja, innerhalb von Klassen sieht es anders aus - eigentlich nicht einleuchtend, warum man diese Fähigkeit der Kapselung nicht gleich allgemein implementiert hat ...

            Weißt Du, ob es in PHP 6 jettz endlich eine Möglichkeit gibt, deklaierte Funktionen wieder zu "undeklarieren" und aus dem Speicher zu entfernen?

            Nein, weiß ich leider nicht. Meine PHP-Kenntnisse konzentrieren sich auf die Versionen 4 und 5, die 6 kenne ich bisher nur partiell und nur anhand von Gerüchten.

            So long,
             Martin

            --
            F: Was ist wichtiger: Die Sonne oder der Mond?
            A: Der Mond. Denn er scheint nachts. Die Sonne dagegen scheint tagsüber, wenn es sowieso hell ist.
          2. Moin!

            das heißt, PHP unterstützt keine Funktionen, die nur innerhalb einer anderen Funktion "sichtbar" sind,

            Nur in der OOP-Variante von PHP...

            Auch dort nicht. Funktionen in Funktionen gibts nicht. Funktionen in Klassen ist was anderes.

            Weißt Du, ob es in PHP 6 jettz endlich eine Möglichkeit gibt, deklaierte Funktionen wieder zu "undeklarieren" und aus dem Speicher zu entfernen?

            Mit "runkit" kann man auch schon ab PHP 4 einige Spielereien tätigen, ab 5.1 mit Sandboxing auch Funktionen entfernen. Ich glaube aber nicht, dass eine Sandbox dir Speicher spart.

            Insofern hielte ich dein Anliegen eher für Praxisfern. PHP hat, wenn überhaupt, Speicherprobleme nur mit zuvielen Daten, aber nicht mit zuviel Programmcode - der ja sowieso nur geparst und ausführungsfreundlich in entsprechenden Syntaxbäumen abgelegt wird, und nicht identisch zum Quelltext ist, der in der Datei steht.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
        2. Hallo Martin,

          vielen Dank für die schnelle Antwort. Jetzt verstehe ich es und es funktioniert auch einwandfrei.

          Ebenfalls einen schönen Abend,

          Christian