Héritage d'une class
Fermé
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
-
6 nov. 2014 à 14:42
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 - 17 nov. 2014 à 20:22
papyclic Messages postés 446 Date d'inscription mercredi 5 novembre 2014 Statut Membre Dernière intervention 18 octobre 2016 - 17 nov. 2014 à 20:22
18 réponses
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
Modifié par Pitet le 6/11/2014 à 16:31
Modifié par Pitet le 6/11/2014 à 16:31
Salut,
Le message d'erreur est explicite : tu appelles la méthode insert() de la classe Membre alors que celle-ci n'existe pas (en effet, la méthode insert() appartient à la classe Admin).
Puisque ta classe Admin hérite de Membre, déplaces la méthode insert() dans la classe Membre, tu pourras ainsi l'appeler depuis la classe Membre et depuis la classe Admin.
Bonne journée
Le message d'erreur est explicite : tu appelles la méthode insert() de la classe Membre alors que celle-ci n'existe pas (en effet, la méthode insert() appartient à la classe Admin).
Puisque ta classe Admin hérite de Membre, déplaces la méthode insert() dans la classe Membre, tu pourras ainsi l'appeler depuis la classe Membre et depuis la classe Admin.
Bonne journée
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
6 nov. 2014 à 18:25
6 nov. 2014 à 18:25
Bonjour,
Merci pour ton retour, j'ai bien compris comme dirait l'autre, ça c'est fait.
Ca me retourne un autre message d'erreur.
Cela concerne la class Membre de la méthode insert.
Je ne comprend pas, je te remercie encore une fois de ton aide.
Merci pour ton retour, j'ai bien compris comme dirait l'autre, ça c'est fait.
Ca me retourne un autre message d'erreur.
Fatal error: Access to undeclared static property: Membre::$db in C.......
Cela concerne la class Membre de la méthode insert.
Je ne comprend pas, je te remercie encore une fois de ton aide.
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
7 nov. 2014 à 01:40
7 nov. 2014 à 01:40
Bonjour,
Ce que je ne comprend pas c'est que l'erreur me dit en gros que $db n'existe nul part dans la classe, donc c'est surement mon appel à la connexion qui tourne pas rond, mais je ne vois vraiment pas comment résoudre cela.
Merci de votre aide.
Ce que je ne comprend pas c'est que l'erreur me dit en gros que $db n'existe nul part dans la classe, donc c'est surement mon appel à la connexion qui tourne pas rond, mais je ne vois vraiment pas comment résoudre cela.
Merci de votre aide.
//variable de connexion private static $con; //Appel à la connexion public function __construct() { $db = connexion::getInstance(); $this->con = $db->getDbh(); }
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
7 nov. 2014 à 09:32
7 nov. 2014 à 09:32
Ta propriété $con est déclarée statique : https://www.php.net/manual/fr/language.oop5.static.php
On ne peut donc pas y accéder à travers une instance ($this->con) mais seulement à travers la classe elle même (Membre::$con ou self::$con).
Attention également dans la méthode insert() tu appel self::$db alors que celle-ci n'existe pas, à corriger en appelant self::$con
Bonne journée
On ne peut donc pas y accéder à travers une instance ($this->con) mais seulement à travers la classe elle même (Membre::$con ou self::$con).
private static $con; //Appel à la connexion public function __construct() { $db = connexion::getInstance(); self::$con = $db->getDbh(); }
Attention également dans la méthode insert() tu appel self::$db alors que celle-ci n'existe pas, à corriger en appelant self::$con
Bonne journée
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
7 nov. 2014 à 16:04
7 nov. 2014 à 16:04
Bonjour
Merci de ton retour pour me venir en aide, maintenant un nouveau message d'erreur me disant que j'appel la fonction prepare sur un non object......
j'ai essayé de résoudre cela mais je ne vois vraiment pas.
Merci une nouvelle fois de ton aide.
Merci de ton retour pour me venir en aide, maintenant un nouveau message d'erreur me disant que j'appel la fonction prepare sur un non object......
Fatal error: Call to a member function prepare() on a non-object in C
j'ai essayé de résoudre cela mais je ne vois vraiment pas.
Merci une nouvelle fois de ton aide.
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
10 nov. 2014 à 10:24
10 nov. 2014 à 10:24
Bonjour
Toujours dans l'impasse, s'il te plait un petit coup de main j'ai toujours cette erreur qui me dit.
j'appel la fonction prepare sur un non object......
Merci beaucoup
Toujours dans l'impasse, s'il te plait un petit coup de main j'ai toujours cette erreur qui me dit.
j'appel la fonction prepare sur un non object......
Fatal error: Call to a member function prepare() on a non-object in C
Merci beaucoup
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
10 nov. 2014 à 11:38
10 nov. 2014 à 11:38
La variable depuis laquelle tu appelles la méthode prepare n'est pas un objet :
- soit tu utilises la mauvaise variable
- soit ta connexion a échouée
Montre nous la ligne qui provoque cette erreur et ton code de connexion.
- soit tu utilises la mauvaise variable
- soit ta connexion a échouée
Montre nous la ligne qui provoque cette erreur et ton code de connexion.
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
Modifié par papyclic le 10/11/2014 à 11:47
Modifié par papyclic le 10/11/2014 à 11:47
Bonjour
C'est la méthode insert
Ma viable de connexion et mon appel à la connexion
Tous cela dans le même fichier Membre.php
C'est la méthode insert
public function insert() { $req = self::$con->prepare('INSERT INTO tb_adherent (nom, prenom, email, naissance, fixe, mobile, adresse, lieu_dit, code_postal, ville, username, password) VALUES (:nom, :prenom, :email, :naissance, :fixe, :mobile, :adresse, :lieu_dit, :code_postal, :ville, :username, :password, :actif, :debut, :fin)'); $req->bindParam(':nom', $this->nom, PDO::PARAM_STR); $req->bindParam(':prenom', $this->prenom, PDO::PARAM_STR); $req->bindParam(':email', $this->email, PDO::PARAM_STR); $req->bindParam(':naissance', $this->naissance, PDO::PARAM_STR); $req->bindParam(':fixe', $this->fixe, PDO::PARAM_STR); $req->bindParam(':mobile', $this->mobile, PDO::PARAM_STR); $req->bindParam(':adresse', $this->adresse, PDO::PARAM_STR); $req->bindParam(':lieu_dit', $this->lieu_dit, PDO::PARAM_STR); $req->bindParam(':code_postal', $this->code_postal, PDO::PARAM_STR); $req->bindParam(':ville', $this->ville, PDO::PARAM_STR); $req->bindParam(':username', $this->username, PDO::PARAM_STR); $req->bindParam(':password', $this->password, PDO::PARAM_STR); $req->bindParam(':actif', $this->actif, PDO::PARAM_STR); $req->bindParam(':debut', $this->debut, PDO::PARAM_STR); $req->bindParam(':fin', $this->fin, PDO::PARAM_STR); $req->execute(); }
Ma viable de connexion et mon appel à la connexion
//variable de connexion private static $con; //Appel à la connexion public function __construct() { $db = connexion::getInstance(); $this->con = $db->getDbh(); }
Tous cela dans le même fichier Membre.php
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
Modifié par Pitet le 10/11/2014 à 11:50
Modifié par Pitet le 10/11/2014 à 11:50
D'où vient
Comme précisé dans mon précédent message, tu ne peux pas affecter une variable statique via l'instance de la classe :
$db = connexion::getInstance();?
Comme précisé dans mon précédent message, tu ne peux pas affecter une variable statique via l'instance de la classe :
self::$con = $db->getDbh();
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
Modifié par papyclic le 10/11/2014 à 14:39
Modifié par papyclic le 10/11/2014 à 14:39
Bonjour
Dans ma class connexion
l'instance de la class connexion
et les méthodes
Les autres attributs de connexion à ma BDD je ne les ai pas mis afin d'éviter d'alourdir l'envoi.
Merci de ton coup de main avec la connexion je suis faché
Dans ma class connexion
l'instance de la class connexion
private static $instance;
et les méthodes
Les autres attributs de connexion à ma BDD je ne les ai pas mis afin d'éviter d'alourdir l'envoi.
private static $dbh; /*** Lance la connexion à la base de donnée en le mettant * dans un objet PDO qui est stocké dans la variable $dbh * @access private */ private function __construct() { try { $this->dbh = new PDO ( $this->type.':host='.$this->host.'; dbname='.$this->dbname, $this->username, $this->password, array(PDO::ATTR_PERSISTENT => true) ); $req = "SET NAMES UTF8"; $result = $this->dbh->prepare($req); $result->execute(); } catch(PDOException $e) { echo "<div class='error'>Erreur !: ".$e->getMessage()."</div>"; die(); } } /*** Regarde si un objet connexion a déjà été instancier, * si c'est le cas alors il retourne l'objet déjà existant * sinon il en créer un autre. * @return $instance */ public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; } /*** Permet de récuprer l'objet PDO permettant de manipuler la base de donnée * @return $dbh */ public function getDbh() { return $this->dbh; }
Merci de ton coup de main avec la connexion je suis faché
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
Modifié par Pitet le 10/11/2014 à 15:03
Modifié par Pitet le 10/11/2014 à 15:03
Par défaut les erreurs PDO ne sont pas affichées (ERRMODE_SILENT), il faut modifier les options dans le constructeur pour les afficher : https://www.php.net/manual/fr/pdo.error-handling.php
Avec mysql, tu peux également passer la requête "SET NAMES utf8" dans le paramètres PDO::MYSQL_ATTR_INIT_COMMAND.
Essaye de corriger le constructeur de ta classe comme ceci :
Tu devrais alors voir les erreurs sql.
Avec mysql, tu peux également passer la requête "SET NAMES utf8" dans le paramètres PDO::MYSQL_ATTR_INIT_COMMAND.
Essaye de corriger le constructeur de ta classe comme ceci :
private function __construct() { try { $this->dbh = new PDO ( $this->type.':host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password, array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ) ); } catch(PDOException $e) { echo "<div class='error'>Erreur !: ".$e->getMessage()."</div>"; die(); } }
Tu devrais alors voir les erreurs sql.
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
10 nov. 2014 à 16:57
10 nov. 2014 à 16:57
Bonjour
Même en modifiant ma class comme tu me l'a suggéré toujours la même erreur.
Même en modifiant ma class comme tu me l'a suggéré toujours la même erreur.
Fatal error: Call to a member function prepare() on a non-object in C
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
Modifié par Pitet le 10/11/2014 à 17:10
Modifié par Pitet le 10/11/2014 à 17:10
Tu as bien modifier $this->con par self::$con dans le constructeur de la classe Membre ?
Sinon essaye d'utiliser uniquement ta classe connexion pour vérifier que celle-ci fonctionne :
Sinon essaye d'utiliser uniquement ta classe connexion pour vérifier que celle-ci fonctionne :
<?php require 'connexion.php'; // chemin vers la classe connexion $db = connexion::getInstance(); $sql = 'SELECT nom FROM tb_adherent LIMIT 10'; foreach ($db->query($sql) as $row) { echo $row[0] . '<br />'; }
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
10 nov. 2014 à 20:30
10 nov. 2014 à 20:30
Alors voilà où j'en suis. Avec la requète que tu m'as fait essayé ça me retourne cette erreur
sinon avec
self::$con
dans le constructeur de la classe Membre
Aucune erreur retournée mais aucun insert dans la BDD
Je suis vraiment perdu perdu..
Merci
Fatal error: Call to undefined method connexion::query() in C:
sinon avec
self::$con
dans le constructeur de la classe Membre
Aucune erreur retournée mais aucun insert dans la BDD
Je suis vraiment perdu perdu..
Merci
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
12 nov. 2014 à 11:35
12 nov. 2014 à 11:35
Effectivement mon dernier code de test contient une erreur car ta classe connexion ne renvoie pas l'instance PDO depuis le constructeur mais via la méthode getDbh(). Donc une fois corrigé tu peux tester ceci pour vérifier que ta classe connexion fonctionne :
Ajoute ce code à la fin de ta méthode insert pour vérifier si l'insert est bien effectué :
<?php require 'connexion.php'; // chemin vers la classe connexion $connexion = connexion::getInstance(); $db = $connexion->getDbh(); $sql = 'SELECT nom FROM tb_adherent LIMIT 10'; foreach ($db->query($sql) as $row) { echo $row[0] . '<br />'; }
Ajoute ce code à la fin de ta méthode insert pour vérifier si l'insert est bien effectué :
public function insert() { $req = self::$con->prepare('INSERT INTO tb_adherent (nom, prenom, email, naissance, fixe, mobile, adresse, lieu_dit, code_postal, ville, username, password) VALUES (:nom, :prenom, :email, :naissance, :fixe, :mobile, :adresse, :lieu_dit, :code_postal, :ville, :username, :password, :actif, :debut, :fin)'); $req->bindParam(':nom', $this->nom, PDO::PARAM_STR); $req->bindParam(':prenom', $this->prenom, PDO::PARAM_STR); $req->bindParam(':email', $this->email, PDO::PARAM_STR); $req->bindParam(':naissance', $this->naissance, PDO::PARAM_STR); $req->bindParam(':fixe', $this->fixe, PDO::PARAM_STR); $req->bindParam(':mobile', $this->mobile, PDO::PARAM_STR); $req->bindParam(':adresse', $this->adresse, PDO::PARAM_STR); $req->bindParam(':lieu_dit', $this->lieu_dit, PDO::PARAM_STR); $req->bindParam(':code_postal', $this->code_postal, PDO::PARAM_STR); $req->bindParam(':ville', $this->ville, PDO::PARAM_STR); $req->bindParam(':username', $this->username, PDO::PARAM_STR); $req->bindParam(':password', $this->password, PDO::PARAM_STR); $req->bindParam(':actif', $this->actif, PDO::PARAM_STR); $req->bindParam(':debut', $this->debut, PDO::PARAM_STR); $req->bindParam(':fin', $this->fin, PDO::PARAM_STR); $req->execute(); echo 'Nombre de ligne insérées : ' . $req->rowCount(); echo 'Erreurs sql : ' . $req->errorInfo(); }
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
12 nov. 2014 à 20:24
12 nov. 2014 à 20:24
Bonjour
Merci de m'aider.
Voici maintenant l'erreur retournée
Merci de m'aider.
Voici maintenant l'erreur retournée
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in C
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
13 nov. 2014 à 09:12
13 nov. 2014 à 09:12
Donne le message d'erreur complet stp (fichier et n° de la ligne).
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
13 nov. 2014 à 12:29
13 nov. 2014 à 12:29
Bonjour
Voici le message complet, l'erreur ce situe sur la ligne de la requète $sql
J'ai mon fichier class complet
Merci
Je te donne aussi le fichier de ma class connexion
Merci
Voici le message complet, l'erreur ce situe sur la ligne de la requète $sql
J'ai mon fichier class complet
Merci
class Membre { private $id_membre; private $nom; private $prenom; private $email; private $naissance; private $fixe; private $mobile; private $adresse; private $lieu_dit; private $code_postal; private $ville; private $username; private $password; //variable de connexion private static $con; //Appel à la connexion public function __construct() { $connexion = connexion::getInstance(); $db = $connexion->getDbh(); } $sql = 'SELECT nom FROM tb_adherent LIMIT 10'; foreach ($db->query($sql) as $row) { echo $row[0] . '<br />'; } public function insert() { $req = self::$con->prepare('INSERT INTO tb_adherent (nom, prenom, email, naissance, fixe, mobile, adresse, lieu_dit, code_postal, ville, username, password) VALUES (:nom, :prenom, :email, :naissance, :fixe, :mobile, :adresse, :lieu_dit, :code_postal, :ville, :username, :password, :actif, :debut, :fin)'); $req->bindParam(':nom', $this->nom, PDO::PARAM_STR); $req->bindParam(':prenom', $this->prenom, PDO::PARAM_STR); $req->bindParam(':email', $this->email, PDO::PARAM_STR); $req->bindParam(':naissance', $this->naissance, PDO::PARAM_STR); $req->bindParam(':fixe', $this->fixe, PDO::PARAM_STR); $req->bindParam(':mobile', $this->mobile, PDO::PARAM_STR); $req->bindParam(':adresse', $this->adresse, PDO::PARAM_STR); $req->bindParam(':lieu_dit', $this->lieu_dit, PDO::PARAM_STR); $req->bindParam(':code_postal', $this->code_postal, PDO::PARAM_STR); $req->bindParam(':ville', $this->ville, PDO::PARAM_STR); $req->bindParam(':username', $this->username, PDO::PARAM_STR); $req->bindParam(':password', $this->password, PDO::PARAM_STR); $req->bindParam(':actif', $this->actif, PDO::PARAM_STR); $req->bindParam(':debut', $this->debut, PDO::PARAM_STR); $req->bindParam(':fin', $this->fin, PDO::PARAM_STR); $req->execute(); echo 'Nombre de ligne insérées : ' . $req->rowCount(); echo 'Erreurs sql : ' . $req->errorInfo(); }
Je te donne aussi le fichier de ma class connexion
Merci
<?php class connexion { /*** Instance de la classe connexion * @access private * @var connexion * @see getInstance */ private static $instance; /*** Type de la base de donnée. * @access private * @var string * @see __construct */ private $type = "mysql"; /*** Adresse du serveur hôte. * @access private * @var string * @see __construct */ private $host = "localhost"; /*** Nom de la base de donnée. * @access private * @var string * @see __construct */ private $dbname = "cliquedecruet7"; /*** Nom d'utilisateur pour la connexion à la base de données * @access private * @var string * @see __construct */ private $username = "root"; /*** Mot de passe pour la connexion à la base de donnée * @access private * @var string * @see __construct */ private $password = ''; private static $dbh; /*** Lance la connexion à la base de donnée en le mettant * dans un objet PDO qui est stocké dans la variable $dbh * @access private */ private function __construct() { try { $this->dbh = new PDO ( $this->type.':host='.$this->host.'; dbname='.$this->dbname, $this->username, $this->password, array(PDO::ATTR_PERSISTENT => true) ); $req = "SET NAMES UTF8"; $result = $this->dbh->prepare($req); $result->execute(); } catch(PDOException $e) { echo "<div class='error'>Erreur !: ".$e->getMessage()."</div>"; die(); } } /*** Regarde si un objet connexion a déjà été instancier, * si c'est le cas alors il retourne l'objet déjà existant * sinon il en créer un autre. * @return $instance */ public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; } /*** Permet de récuprer l'objet PDO permettant de manipuler la base de donnée * @return $dbh */ public function getDbh() { return $this->dbh; } } ?>
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
Modifié par Pitet le 13/11/2014 à 14:31
Modifié par Pitet le 13/11/2014 à 14:31
Le code avec la requête select et le foreach était juste un code de test à mettre dans un fichier à part (pour tester la classe connexion).
Ce code ne doit pas apparaitre dans ta classe : supprime la requête et la boucle foreach.
Dans le constructeur de la classe Membre, remplace la ligne
par
Ce code ne doit pas apparaitre dans ta classe : supprime la requête et la boucle foreach.
Dans le constructeur de la classe Membre, remplace la ligne
$db = $connexion->getDbh();
par
self::$con = $connexion->getDbh();
papyclic
Messages postés
446
Date d'inscription
mercredi 5 novembre 2014
Statut
Membre
Dernière intervention
18 octobre 2016
3
Modifié par papyclic le 17/11/2014 à 20:26
Modifié par papyclic le 17/11/2014 à 20:26
Bonjour
J'ai voulu essayer de me débrouiller seul depuis 3 jours mais vraiment je n' compprends plus rien.
ce que j'ai fait
Ca me retourne plusiqurs erreurs
et cette requète me retourne ça
Je suis vraiment desespéré.
Merci de ton secours
J'ai voulu essayer de me débrouiller seul depuis 3 jours mais vraiment je n' compprends plus rien.
ce que j'ai fait
public function __construct() { $db = connexion::getInstance(); self::$con = $connexion->getDbh();
Ca me retourne plusiqurs erreurs
Notice: Undefined variable: connexion in C Fatal error: Call to a member function getDbh() on a non-object in
et cette requète me retourne ça
$sql = 'SELECT nom FROM tb_adherent LIMIT 10'; foreach ($db->query($sql) as $row) { echo $row[0] . '<br />'; }
Fatal error: Call to a member function query() on a non-object in C:.............. Notice: Undefined variable: connexion in C............................
Je suis vraiment desespéré.
Merci de ton secours