Avatar billede junold Nybegynder
15. oktober 2008 - 08:43 Der er 16 kommentarer og
1 løsning

Cannot redeclare class

Jeg går ud fra dette spørgsmål ikke re så svært.
Jeg får denne fejl:
"Fatal error: Cannot redeclare class log in /classes/log.class.php on line 4"


Filen ser således ud:

<?php
session_start();
class log
{
    //Skriver stringdata samt et timestamp til logfilen events.log.
    function log($stringData)
    {
        if (isset($stringData))
        {
        $logfil = "log/events.log";
        $date = date("F j, Y, g:i a");
        //$date = "morfar";
            $fh = fopen($logfil, 'a') or die("");
            fwrite($fh, $stringData);
            fwrite($fh, $date." \n");
            fclose($fh);
        }
    } // log function
   
} // log class
?>

Det der er underligt, er at det er taget fra en side der virker som den skal.. Hvad kan der dog være galt?
Avatar billede jakobdo Ekspert
15. oktober 2008 - 09:18 #1
Kører du php5 ?
Hvis ja, så prøv:
<?php
session_start();
class log
{
    //Skriver stringdata samt et timestamp til logfilen events.log.
    function __construct($stringData)
    {
        if (isset($stringData))
        {
        $logfil = "log/events.log";
        $date = date("F j, Y, g:i a");
        //$date = "morfar";
            $fh = fopen($logfil, 'a') or die("");
            fwrite($fh, $stringData);
            fwrite($fh, $date." \n");
            fclose($fh);
        }
    } // log function
 
} // log class
?>
Avatar billede dkfire Nybegynder
15. oktober 2008 - 09:30 #2
Kalder du filen flere gange måske ???
Avatar billede olebole Juniormester
15. oktober 2008 - 09:37 #3
<ole>

Nej, linje fire indeholder øjensynligt en constructor funktion med samme navn som klassen. Det kan man godt have i PHP4, men ikke med den nye OOP-model i PHP5. Jeg tror, Jakob har ret  =)

/mvh
</bole>
Avatar billede olebole Juniormester
15. oktober 2008 - 09:37 #4
- men ellers har du helt ret i, at gentagne inkluderinger af samme kode ofte giver en lign. fejl  ;o)
Avatar billede junold Nybegynder
15. oktober 2008 - 09:41 #5
Okay, jeg troede godt man kunne lave en constructor på den måde i PHP5... Men det skal altså være function __construct i stedet for?
Avatar billede dkfire Nybegynder
15. oktober 2008 - 09:42 #6
Avatar billede jakobdo Ekspert
15. oktober 2008 - 10:06 #7
15/10-2008 09:41:31: Ja, i php5 hedder den __construct()
Avatar billede pidgeot Nybegynder
15. oktober 2008 - 10:06 #8
Ole: Det kan man nu godt - på det punkt er PHP5 bagudkompatibel:

"For backwards compatibility, if PHP 5 cannot find a __construct() function for a given class, it will search for the old-style constructor function, by the name of the class."
(http://www.php.net/manual/en/language.oop5.decon.php)

Dermed ikke sagt at det ikke kan være en bedre ide at bruge __construct.

*går igen*
Avatar billede olebole Juniormester
15. oktober 2008 - 10:12 #9
Oooops ... I stand corrected! Tak  ;o)

Så må jeg formode, at dkfire alligevel havde ret i sin første kommentar. Jeg undskylder, hvis jeg kun har bidraget til yderligere forvirring  =)
Avatar billede junold Nybegynder
15. oktober 2008 - 12:49 #10
Ja, det hjalp ikke noget at rette den til _construct..

Måske ligger problemet i en anden fil? Den vil heller ikke lave header location rigtigt, og der er også noget rod med dens sessions. Men når det virker andre steder, kan jeg ikke se hvorfor det pludselig er galt nu!

Jeg vil skyde på det er her der sker en fejl:

<?php
session_start();
include("classes/currentpage.class.php");
include("classes/log.class.php");
$_SESSION['reference']=array (curPageURL(),"Admin");
//Tjekker om bruger er admin, hvis ikke, sendes bruger til forsiden.
if($_SESSION['admin'] != 1 ) {
    $Log = new log;$Log->log($_SERVER['REMOTE_ADDR']." Har forsøgt uautoriseret adgang til admin.php!!! ");
    header("Location: index.php");
}
include ("classes/users.class.php");
include ("classes/main.class.php");
include ("classes/templates.class.php");
include ("classes/modules.class.php");

//opretter en instans af klasserne main og modules, samt selecter data
$objMain = new main;
$maindata= $objMain->getData($where);
$objModule = new modules;
$moduledata = $objModule->getData($where);

//inkluderer alle installerede modulers klasser
for($i=0; $i<=count($moduledata);$i++) { 
    if (isset ($moduledata[$i]["modulename"]))
    {
        include 'modules/'.$moduledata[$i]["modulename"].'s/'.$moduledata[$i]["modulename"].'s.class.php';
    }//Slut på if
}//Slut på for

switch($_GET["type"])
{   
    case "endsession": 
    {
        //destruerer session, og sender bruger til forside
    $Log = new log;$Log->log($_SESSION['username']." loggede ud af systemet. ");
    $_SESSION['login'] = 0;
    $_SESSION['admin'] = 0;
    session_destroy();
    if($_SESSION['login'] != "666") header("Location: index.php");
    }//slut på case
..........

For, hvis man prøver at komme ind på denne side (uden at være logget ind) skulle den som i kan se, sende bruger tilbage til index.php. MEN siden forbliver bare blank!
Avatar billede olebole Juniormester
15. oktober 2008 - 19:10 #11
Hvis du slet ikke selv kan debugge, tror jeg, det bliver svært at indkredse problemet. Med alle dine include-filer kan din(e) fejl ligge rigtig mange steder
Avatar billede junold Nybegynder
16. oktober 2008 - 09:37 #12
Jeg synes bare det er svært at debugge på et system der virker alle andre steder.
Det virker på andre domæner hvor jeg har brugt det, og jeg tog en ren kopi ned på min pc og kørte det med wamp - ingen problemer der heller.

Så jeg har spurgt dem der hoster sitet, om der er noget galt der, eller om jeg skal foretage nogen indstillinger eller lign. :)
Avatar billede olebole Juniormester
16. oktober 2008 - 10:47 #13
I forbindelse med debugging ændrer det intet, at koden fungerer andre steder. Debugging er debugging - det er bare at følge kæden af hændelser og skrive ud og/eller logge, om der sker det forventede alle steder. Det er ikke svært, når bare man starter ét sted og arbejder sig planmæssigt igennem applikationen  =)
Avatar billede junold Nybegynder
16. oktober 2008 - 11:02 #14
Ja det har du nok ret i Ole.
Jeg må nok bare i gang fra en ende af! Det irriterer mig bare at et system der virker upåklageligt, pludselig ikke virker når man flytter det over på et andet domæne. (Samme host - Surftown)

Men, ting tolkes jo forskelligt. f.eks. kan en side se fin ud i Firefox, og ligne lort i IE. Det er måske lidt det samme her, det virker på en server, og ikke på en anden.
Avatar billede mcardle Nybegynder
18. oktober 2008 - 18:54 #15
Tror måske du inkludere flere steder.

Prøv evt. alle de steder du inkludere at bruge include_once() eller require_once().

//mcardle
Avatar billede erikjacobsen Ekspert
18. oktober 2008 - 19:04 #16
Det har næppe noget med sagen at gøre, men

  for($i=0; $i<=count($moduledata);$i++) { 

kan ikke være rigtig. Det skal givetvis være:

  for($i=0; $i<count($moduledata);$i++) { 

Det kunne så tyde på at du ikke ser advarsler fra PHP, hvilket under udvikling nok er lidt mindre smart.
Avatar billede junold Nybegynder
17. juni 2010 - 09:28 #17
lukker
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