#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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... + Multi-Zitat Zitieren
#4 3. September 2007 AW: Problem mit "Cannot redeclare..." require_once include_once PHP: require_once - Manual + Multi-Zitat Zitieren
#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 ); } } ?> + Multi-Zitat Zitieren
#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 ;} } ?> + Multi-Zitat Zitieren