Bonjour à tous,
j'ai commencé il y a peu à m'intéresser à la POO, et je tente de mettre en pratique ces derniers jours en créant ... ma première classe
, que je ne parviens pas à faire fonctionner, pour de nombreuses raisons, je pense, que j'ignore et que je ne comprends pas.
Si vous aviez des pistes, des conseils, ou si vous repériez des "étrangetés", vous me seriez d'un grand secours, je n'y vois pas clair du tout.
D'avance je vous en remercie.
Voici donc :
le tout est constitué comme suit :
--dossier-- site
-----index.php
-----dossier-- includes
----------config.php
----------dossier-- class
---------------Connexion.class.php
---------------Gestion.class.php
---------------Contact.class.php
et, dans l'ordre : index.php
config.php
Connexion.class.php
Gestion.class.php
Contact.class.php
Deux erreurs à la ligne 17 :
Notice: Undefined property: Client::$_connexionBdd
Fatal error: Call to a member function prepare() on a non-object
J'ai bien essayé de passer en paramètre de ma fonction lire() $_connexionBdd, qui est retournée dans $connexion : $Client->lire('',$connexion);
tout en la récupérant de l'autre coté mais ça ne fonctionne pas non plus.
dans ma fonction lire() également, j'utilise des $this-> mais je ne suis pas sûre qu'ils soient utiles, dans la mesure où mon champ est "public"... je voulais savoir ce que vous en pensiez.
Pour finir, je me demande si mon destructeur dans ma classe Connexion a une utilité.
En bref, mon code est bien bancal. Donc si vous pouviez me donner des pistes pour mieux comprendre tout ça...
Merci du courage déployé pour me lire jusque là et merci d'avance de vos réponses.
Modifié par ClR (18 Jul 2011 - 23:15)
j'ai commencé il y a peu à m'intéresser à la POO, et je tente de mettre en pratique ces derniers jours en créant ... ma première classe

Si vous aviez des pistes, des conseils, ou si vous repériez des "étrangetés", vous me seriez d'un grand secours, je n'y vois pas clair du tout.
D'avance je vous en remercie.
Voici donc :
le tout est constitué comme suit :
--dossier-- site
-----index.php
-----dossier-- includes
----------config.php
----------dossier-- class
---------------Connexion.class.php
---------------Gestion.class.php
---------------Contact.class.php
et, dans l'ordre : index.php
<?php
//INCLUSIONS environement de travail
//CONFIG includes
define('INCLUDES','includes/');
set_include_path(get_include_path().PATH_SEPARATOR.INCLUDES);
//CONFIG bdd + classes
require_once('config.inc');
//CONSTANTES bdd
$config['driver'] = DRIVER;
$config['dbname'] = DBNAME;
$config['host'] = HOST;
$config['user'] = USER;
$config['password'] = PASSWORD;
$config['dsn'] = $config['driver']
. ':dbname=' . $config['dbname']
. ';host=' . $config['host'];
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<?php
//$connexion =
$connexion = Connexion::getInstanceConnexion($config);
//Durée d'exécution du script de connexion
$connexion->getTimeScriptConnexion();
?>
$Contact=new Contact();
$Contact->lire();
?>
</body>
</html>
config.php
define('DRIVER','mysql');
define('DBNAME','poo1');
define('HOST','localhost');
define('USER','root');
define('PASSWORD','');
define('CLASS_DIR', 'includes/class/');
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);
//spl autoload pour charger les fichiers .class
spl_autoload_extensions('.class.php');
spl_autoload_register();
Connexion.class.php
// Connexion BDD = classe Singleton
class Connexion
{
//durée d'execution du script
private $_startTime;
private $_endTime;
private $_time;
//valeurs de la connexion à la BDD à null
public static $_connexionBdd = null;
private static $_instanceConnexion = null;
private static $_host = null;
private static $_bdd = null;
private static $_user = null;
private static $_pswd = null;
private function __construct($config=false)
{
//si fction construct déclenchée, tps départ en microsecondes
$this->_startTime = round(microtime(), "6");
self::$_instanceConnexion = null;
self::$_host = $config['host'];
self::$_bdd = $config['dbname'];
self::$_user = $config['user'];
self::$_pswd = $config['password'];
//connexion
try
{
self::$_instanceConnexion = new PDO($config['dsn'],$config['user'],$config['password']);
}
//gestion des erreurs
catch(PDOException $e)
{
echo 'Erreur de connexion au serveur MySQL ! <br /> Erreur détectée : '.$e->getMessage();
exit();
}
}
//"anti-cloning" (classe Singleton)
private function __clone()
{
}
/* 2nd type d'"anti-cloning" :
public function __clone()
{
throw new Exception('ERREUR DE MANIPULATION : Tentative de clônage de la classe Singleton Connexion !');
}
*/
//lancement de la connexion
public static function getInstanceConnexion($config)
{
//si la propriété $_instanceConnexion vaut null, créée la connexion, sinon renvoit sa valeur
if (is_null(self::$_instanceConnexion))
{
self::$_connexionBdd = new Connexion($config);
}
return self::$_connexionBdd;
}
public function __destruct()
{
if (!is_null(self::$_instanceConnexion))
{
self::$_connexionBdd = null;
self::$_instanceConnexion = null;
echo 'Connexion fermée.';
}
}
public function getTimeScriptConnexion()
{
//fin du script
$this->_endTime = round(microtime(), "6");
//calcul du temps d'éxecution du script de connexion BDD en microsecondes
$this->_time = $this->_endTime - $this->_startTime;
$this->_time = round($this->_time, "6");
$this->_timeScript =
'<table border="1" cellspacing="0" cellpadding="5">
<th colspan=2 style="background:#cccccc">Temps du script
</th>
<tr>
<td style="background:#eeeeee">Début du script
</td>
<td>' . $this->_startTime . '
</td>
</tr>
<tr>
<td style="background:#eeeeee">Fin du script
</td>
<td>' . $this->_endTime . '
</td>
</tr>
<tr>
<td style="background:#eeeeee">Tps d\'éxecution total
</td>
<td>' . $this->_time . '
</td>
</tr>
</table>' ;
echo $this->_timeScript ;
}
}
Gestion.class.php
class Gestion
{
//propriété nom de la table
public $_table;
//$id pr delete
public $id;
//fction lecture champs BDD
public function lire($champs=null)
{
//si pas de paramètre
if ($champs==null) { $champs='*'; }
try{
//prépare la requete
$this->_connexionBdd->prepare("SELECT $champs FROM ".$this->_table." WHERE id=".$this->id);
//execute la requete
$this->_connexionBdd->execute();
//récup les résultats de la requete sous forme de tableau
$result=$this->_connexionBdd->fetch(PDO::FETCH_ASSOC);
}
catch(PDOException $e){
echo 'Erreur : '.$e->getMessage();
exit();
}
//parcours du tableau et récupération des données
foreach ($result as $cle=>$valeur)
{
$this->$cle = $valeur;
}
}
}
Contact.class.php
class Contact extends Gestion
{
public $_table = 'contacts';
}
Deux erreurs à la ligne 17 :
Notice: Undefined property: Client::$_connexionBdd
Fatal error: Call to a member function prepare() on a non-object
J'ai bien essayé de passer en paramètre de ma fonction lire() $_connexionBdd, qui est retournée dans $connexion : $Client->lire('',$connexion);
tout en la récupérant de l'autre coté mais ça ne fonctionne pas non plus.
dans ma fonction lire() également, j'utilise des $this-> mais je ne suis pas sûre qu'ils soient utiles, dans la mesure où mon champ est "public"... je voulais savoir ce que vous en pensiez.
Pour finir, je me demande si mon destructeur dans ma classe Connexion a une utilité.
En bref, mon code est bien bancal. Donc si vous pouviez me donner des pistes pour mieux comprendre tout ça...
Merci du courage déployé pour me lire jusque là et merci d'avance de vos réponses.
Modifié par ClR (18 Jul 2011 - 23:15)