Page 1 sur 1

Problème de classe php

Posté : 06 mai 2009, 23:34
par soulflow132
Bonsoir. je ne m'y connais pas trop en POO mais je suis confronté à un problème plutot 'merdique'
Donc voila :

J'ai crée une classe nommée bd_connec et enregistrée seule dans un fichier bd_connec.php
qui définit des méthode de connxexion et deconnexion à une base de donnée dans les infos figurent dans un fichier config.php

Description du fichier config.php
<?php
//info base de donnée
define('bd_serveur', 'localhost');
define('bd_login', 'jocker');
define('bd_pass', '123456');
define('bd_nom', 'sopsi');
define('contact_email', '[email protected]');

?>


Description du fichier bd_connec.php
<?php

include "../config.php";
class bd_connec{

	//fonction qui permet de se connecter à la base de donnée dont les infos figurent dans le fichier config.php
	function seconnecter()
	{
		$mysql = mysql_connect( bd_serveur, bd_login, bd_pass );
		mysql_select_db(bd_nom, $mysql);
		return $mysql;
	}
	
	//permet de se déconnecter de la base de donnée après une connexion 
	function sedeconnecter($mysql)
	{
		mysql_close($mysql);
	}
}
?>

Ensuite j'ai créé deux autre classes administrateur et categorie sachant que chacune d'elles attaque une table différente de la bd.

Description de la classe administrateur.php
<?php
include "bd_connec.php";
class administrateur extends bd_connec
{
	function supprimer_admin($id_admin)
	{
		$sql="DELETE FROM administrateur WHERE id_admin='$id_admin' ";
		$id=$this->seconnecter();
		mysql_query($sql);
		$this->sedeconnecter($id);
	}
}
?>






Description de la classe categorie.php

<?php
include "bd_connec.php";
class categorie extends bd_connec
{
        function supprimer_categorie($id_categorie)
	{
		$sql="DELETE FROM categorie WHERE id_categorie='$id_categorie' ";
		$id=$this->seconnecter();
		mysql_query($sql);
		$this->sedeconnecter($id);
	}
}
?>


Dans une derniere page test.php j'appelle une instance d'administrateur et une autre de categorie


Description de test.php

<?php
$categorie= new categorie();
$admin= new administrateur();

echo 'initialisation des objets effectuée' ;
?>

Quand j'exécute cela m'affiche un message d'erreur


Fatal error: Cannot redeclare class bd_connec in D:\wamp\www\sfe\classes\bd_connec.php on line 4


S'il vous plait comment dois-je procéder sans avoir à changer la structure c'est a dire en ayant le même nombre de classe et le même nombre de fichiers .
Merciiii et bonne soirée

Posté : 06 mai 2009, 23:53
par Nagol
remplaces tous tes includes par des require_once

différence entre include et require:

require produit une fatal error si le fichier n'est pas à l'endroit ou on lui dit d'aller voir
et require_once fera que tu ne pourras pas inclure deux fois le même fichier

et voila

penses à spécifier les path en les précedant d'un dirname(__FILE__) . '/' pour éviter qu'en incluant un fichier qui inclue un fichier tu te retrouves avec un path différent, les path absolus sont généralement mieux que les relatifs en php d'ailleurs.

Posté : 06 mai 2009, 23:56
par sadeq
Ce problème est dû à l'inclusion d'un fichier plusieurs fois. Pour palier aux erreurs de redéclaration dues à ça utilise plutôt l'instruction include_once au lieu de include.

Pour plus d'infos voir : http://www.apc.univ-paris7.fr/~revenu/D ... -once.html

On peut aussi utiliser la fonction class_exists() pour éviter de redéclarer une classe plusieurs fois.
Voir: http://fr2.php.net/class_exists

Posté : 07 mai 2009, 10:57
par Hywan
Hey :-),

Attention, car les fonctions _once (typiquement, include_once et require_once) sont lentes. Si on veut comprendre pourquoi, il faut se pencher sur la fonction stat() de PHP, qui fait un appel stat en C. Les informations sont longues à obtenir (c'est toujours les accès disque qui font ralentir les applications — dans notre cadre de travail —). Même si PHP a un cache pour les appels stat (avec remise à zéro possible via la fonction clearstatcache()), les premiers appels sont longs.

Je conseille donc l'utilisation d'une fonction qui utilise require_once mais de façon intelligente, i.e. on utilise notre propre système de cache. C'est plus rapide que si on laisse PHP tout gérer lui-même, surtout si on a beaucoup de fichiers (sinon, c'est négligeable j'imagine).