[PHP] Problem mit "Cannot redeclare..."

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Gn0m, 3. September 2007 .

  1. 3. September 2007
    Problem mit "Cannot redeclare..."

    Hey Jungs

    Eig. eine recht einfache Frage...

    Es geht darum das ich eine Seite bauen will die mit classes arbeitet und natürlich Datenbanken.

    Ich habe eine index.php in der anhand von $_POST-Übergabe-Werten andere Dateien wie forum.php oder news.php usw included werden.

    Nun habe ich aber auch Dateien wie class_db.php (Für den Datenbank Connect) und z.B. eine class_user.php (Aufrufen von Profilen usw)

    Nun soll den Dateien "index.php", "news.php" und "forum.php" der Zugriff auf die classes gleich erlaubt sein.

    Nun hab ich aber folgendes Problem. Damit ich in der index.php UND z.B. in der forum.php UND in der class_user.php die Datei class_db.php nutzen kann (wodurch Befehle wie $db = new db(); möglich sind) müsste ich in diesen Dateien überall einen include('class_db.php'); haben.

    Wenn ich das aber mache und in der index.php z.B. die forum.php includen lasse kommt der Fehler "Cannot redeclare....."

    Nun ist meine Frage wie kann ich das lösen das ich von der index.php, forum.php, news.php UND der class_user.php auf die class_db.php zugreifen kann ohne Fehler UND ich muss von der index.php, forum.php und news.php auf die class_user.php zugreifen können OHNE den Fehler.

    Ich hab das derzeit so gelöst das in der index.php steht:

    Code:
    <?php
    
    require('classes/class_db.php');
    
    $db = new db();
    $userID = $db->get_single("SELECT * FROM tblUser WHERE idUser = 1");
    
    require('classes/class_user.php');
    $user = new user($userID, $db);
    
    $user->show_all($userID);
    
    ?>
    
    in der class_db.php

    Code:
    <?php
    
    class db {
    
     //Sonstige lokale Variablen
     private $connect_ok = 0;
     private $query_ok = 0;
     private $query = "";
     private $fetch = array();
     private $mysqlerror = "";
     private $mysqlerrornumber = 0;
    
     //Lokale Server Daten
     private $host = "xxx";
     private $user = "xxx";
     private $password = "xxx";
     private $database = "xxx";
    
     //Name der Seite
     private $pagename = "xxx";
    
     //Konstruktor der Connect zur Datenbank öffnen lässt und Server-Daten in lokale Variablen speichert
     function db() {
     $this->connect();
     }
    
     //Gibt Fetch-Row-Array zurück
     function get($query) {
     $this->query($query);
     $returnarray = $this->fetch_row($this->query_ok);
     return $returnarray;
     }
    
     //Gibt ein einzelnes Query-Ergebnis zurück
     function get_single($query) {
     $this->query($query);
     $returnarray = $this->fetch_row($this->query_ok);
     return $returnarray[0];
     }
     
     //Connect zur Datenbank mit evt. Fehlerausgabe und speichern der ausgewählten Datenbank in lokale Variable
     private function connect() {
     $this->connect_ok = mysql_connect($this->host,$this->user,$this->password);
     if (!$this->connect_ok) {
     $this->error("Datenbank Zugriff ist fehlgeschlagen!");
     }
     if ($this->database!="") {
     $this->select_db($this->database);
     }
     }
    
     //Auswahl der Datenbank mit evt. Fehlerausgabe
     private function select_db($database) {
     if(!@mysql_select_db($this->database, $this->connect_ok)) {
     $this->error("Kann Datenbank ".$this->database." nicht nutzen!");
     }
     }
    
     //SQL-Query überprüfen und in lokale Variable speichern
     private function query($query) {
     $this->query[]= $query_string;
     $this->query_ok = mysql_query($query,$this->connect_ok);
     if (!$this->query_ok) {
     $this->error("Ungültiger Befehl: ".$query);
     }
     return $this->query_ok;
     }
    
     //Speichert Fetch-Row-Ergebnisse in lokales Array ab
     private function fetch_row($query_ok) {
     $this->fetch = mysql_fetch_row($this->query_ok);
     return $this->fetch;
     }
    
     //Gibt Error-Meldungen aus
     private function error($msg) {
     $this->mysqlerror = mysql_error();
     $this->mysqlerrornumber = mysql_errno();
    
     $errormsg = "Datenbank Fehler in ".$this->pagename.": ".$msg."<br>";
     $errormsg .= "MySQL Fehler: ".$this->mysqlerror."<br>";
     $errormsg .= "MySQL Fehler Nummer: ".$this->mysqlerrornumber."<br>";
     $errormsg .= "Datum:</b> ".date("d.m.Y H:i:s")."<br>";
    
     echo($errormsg);
     }
    }
    
    ?>
    
    und in der class_user.php:

    Code:
    <?php
    
    class user {
    
     private $id;
     private $nick;
     private $mail;
     private $passwort;
     
     function user($id, $db) {
     $this->id = $id;
     $this->nick = $db->get_single("SELECT name FROM tblUser WHERE idUser = ".$id."");
     }
     
     function show_all() {
     echo $this->id."<br>";
     echo $this->nick;
     }
    
    }
    
    ?>
    

    So wie nun sicherlich jeder sehen kann ist das mit dem Datenbank Connect in der class_user so geregelt das ich die Variable einfach an den Konstruktor übergebe....

    Das würde aber wenn ich das so mache bedeuten das ich jedes mal wenn ich eine Methode aus der index.php aufrufe die in der class_user.php steht diese Variable wieder übergeben müsste....

    Wenn jemand zufällig verstanden hat was ich will dann wäre es super wenn ich da ne ANtwort bekommen könnte^^


    Bye TranceTeddy
     
  2. 3. September 2007
    AW: Problem mit "Cannot redeclare..."

    hab den thread ned gnau gelesen, aber ich denk ich kanns jetz scho lösen.

    undzwar ist es immer von vorteil bei komplexen scripten eine 'global.php' anzulegen.
    in dieser datei kannst du alles was du brauchst includieren und instanzen von klassen erzeugen.

    die index.php braucht diese klassen -> einfach die global.php includieren und ferig.
    die forum.php braucht die klassen -> einfach die global.php includieren und feritg.

    dann hast du auch das problem mit doppelt includierten klassen nicht mehr
     
  3. 3. September 2007
    AW: Problem mit "Cannot redeclare..."

    jaja auf die Idee bin ich auch schon gekommen^^

    Nur wenn ich nun diese 2 Sachen mache und daraufhin die forum.php in die index.php include weil sie halt da rein soll wenn sie aufgerufen wird dann kommt ja eben dieser Fehler das es nicht nochmal deklariert werden kann...

    Es geht ja darum das die index.php die Dateien die ebenfalls die klassen includiert haben auch noch includiert bekommt... dadurch würden die klassen 2 mal da rein kommen und das ruft ja den Fehler hervor...
     
  4. 3. September 2007
    AW: Problem mit "Cannot redeclare..."

    require_once
    include_once

    PHP: require_once - Manual
     
  5. 3. September 2007
    AW: Problem mit "Cannot redeclare..."

    Hab das jetzt mal probiert aber irgendwie läufts zwar schon aber ich hab das Gefühl das ist unschön...

    Kannste mir das evt kurz optimiert wieder rein kopieren?

    Weil irgendwie ist das komisch das die class_user.php die global.php required und die global.php required die class_user... -.-

    ausserdem muss ich in den einzelnen klassen die $db trotzdem neu machen wie man sieht....


    index.php
    PHP:
    <? php

    require_once( 'global.php' );

    $db  = new  db ();
    $userID  $db -> get_single ( "SELECT * FROM tblUser WHERE idUser = 1" );

    $user  = new  user ( $userID );

    $user -> show_all ( $userID );

    ?>
    global.php
    PHP:
    <? php

    require_once( 'classes/class_db.php' );
    require_once(
    'classes/class_user.php' );

    ?>
    class_user.php
    PHP:
    <? php

    require_once( '../global.php' );

    class 
    user  {

     private 
    $id ;
     private 
    $nick ;
     private 
    $mail ;
     private 
    $passwort ;
     private 
    $db ;

     function 
    user ( $id ) {
      
    $this -> db  = new  db ();
      
    $this -> id  $id ;
      
    $this -> nick  $this -> db -> get_single ( "SELECT name FROM tblUser WHERE idUser = " . $id . "" );
     }
     
     function 
    show_all () {
      echo 
    $this -> id . "<br>" ;
      echo 
    $this -> nick ;
     }

    }

    ?>
    class_db.php
    PHP:
    <? php

    class  db  {

     
    //Sonstige lokale Variablen
     
    private  $connect_ok  0 ;
     private 
    $query_ok  0 ;
     private 
    $query  "" ;
     private 
    $fetch  = array();
     private 
    $mysqlerror  "" ;
     private 
    $mysqlerrornumber  0 ;

     
    //Lokale Server Daten
     
    private  $host  "xxx" ;
     private 
    $user  "xxx" ;
     private 
    $password  "xxx" ;
     private 
    $database  "xxx" ;

     
    //Name der Seite
     
    private  $pagename   "xxx" ;

     
    //Konstruktor der Connect zur Datenbank öffnen lässt und Server-Daten in lokale Variablen speichert
     
    function  db () {
      
    $this -> connect ();
     }

     
    //Gibt Fetch-Row-Array zurück
     
    function  get ( $query ) {
      
    $this -> query ( $query );
      
    $returnarray  $this -> fetch_row ( $this -> query_ok );
      return 
    $returnarray ;
     }

     
    //Gibt ein einzelnes Query-Ergebnis zurück
     
    function  get_single ( $query ) {
      
    $this -> query ( $query );
      
    $returnarray  $this -> fetch_row ( $this -> query_ok );
      return 
    $returnarray [ 0 ];
     }
     
     
    //Connect zur Datenbank mit evt. Fehlerausgabe und speichern der ausgewählten Datenbank in lokale Variable
     
    private function  connect () {
      
    $this -> connect_ok  mysql_connect ( $this -> host , $this -> user , $this -> password );
      if (!
    $this -> connect_ok ) {
       
    $this -> error ( "Datenbank Zugriff ist fehlgeschlagen!" );
      }
      if (
    $this -> database != "" ) {
       
    $this -> select_db ( $this -> database );
      }
     }

     
    //Auswahl der Datenbank mit evt. Fehlerausgabe
     
    private function  select_db ( $database ) {
      if(!@
    mysql_select_db ( $this -> database $this -> connect_ok )) {
       
    $this -> error ( "Kann Datenbank " . $this -> database . " nicht nutzen!" );
      }
     }

     
    //SQL-Query überprüfen und in lokale Variable speichern
     
    private function  query ( $query ) {
      
    $this -> query []=  $query_string ;
      
    $this -> query_ok  mysql_query ( $query , $this -> connect_ok );
      if (!
    $this -> query_ok ) {
       
    $this -> error ( "Ungültiger Befehl: " . $query );
      }
      return 
    $this -> query_ok ;
     }

     
    //Speichert Fetch-Row-Ergebnisse in lokales Array ab
     
    private function  fetch_row ( $query_ok ) {
      
    $this -> fetch  mysql_fetch_row ( $this -> query_ok );
      return 
    $this -> fetch ;
     }

     
    //Gibt Error-Meldungen aus
     
    private function  error ( $msg ) {
      
    $this -> mysqlerror  mysql_error ();
      
    $this -> mysqlerrornumber  mysql_errno ();

      
    $errormsg   "Datenbank Fehler in " . $this -> pagename . ": " . $msg . "<br>" ;
      
    $errormsg  .=  "MySQL Fehler: " . $this -> mysqlerror . "<br>" ;
      
    $errormsg  .=  "MySQL Fehler Nummer: " . $this -> mysqlerrornumber . "<br>" ;
      
    $errormsg  .=  "Datum:</b> " . date ( "d.m.Y H:i:s" ). "<br>" ;

      echo(
    $errormsg );
     }
    }

    ?>
     
  6. 3. September 2007
    AW: Problem mit "Cannot redeclare..."

    global.php
    PHP:
    require_once( 'classes/class_db.php' );
    require_once(
    'classes/class_user.php' ); 
    $db  = new  db ();
    $user  = new  user ( $db $id );
    class db so lassen

    class_user.php
    PHP:
    <? php
    class  user  {

    private 
    $id ;
    private 
    $nick ;
    private 
    $mail ;
    private 
    $passwort ;
    private 
    $db ;

    function 
    user ( $db , $id ) {
      
    $this -> db  $db ;
      
    $this -> id  $id ;
      
    $this -> nick  $this -> db -> get_single ( "SELECT name FROM tblUser WHERE idUser = " . $id . "" );
    }

    function 
    show_all () {
      echo 
    $this -> id . "<br>" ;
      echo 
    $this -> nick ;
    }

    }

    ?> 
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.