Elles correspondent aux paramètres de connexion et sont déclarées dans fonction.php
Elles doivent etre declarées dans index.php c'est ca ?
Elles correspondent aux paramètres de connexion et sont déclarées dans fonction.php
Elles doivent etre declarées dans index.php c'est ca ?
Tu a deux possibilités.
Soit tu les déclare dans la classe MaBase, mais dans ce cas tu ne les passe pas à la méthode comme ça.
Soit tu les déclare dans index.php mais tu les défini dans index.php
Solution 1
Solution 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 class MaBase { //Attributs public $conn = NULL; public $hostname="localhost"; public $dbname="lcesa"; public $username="root"; public $pw="lcesa"; //---------------Méthodes--------------- //Constructeur public function __construct() { $this->connect(); } //Ouverture BDD public function connect() { try { $this->conn = new PDO ("mssql:host=$this->hostname;dbname=$this->dbname","$this->username","$this->pw"); } catch( PDOException $Exception ) { echo $Exception->getMessage(); } } }
Mais avant de continuer sur ton code, essais de combler tes lacunes niveau POO.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $hostname="localhost"; $dbname="lcesa"; $username="root"; $pw="lcesa"; $base = new MaBase($hostname, $dbname, $username, $pw);
J'ai l'impression d'avoir deja fais ca masi euh les messages d'erreurs ne bougent pas
----
Bah en faite je me sers de ce code pour m'exercer et faire rentrer dans ma p'tite tête le POO ca fais 3 semaines que je lis des doc interminables que je suis des tutos mais la j'en es un peu marre je ne comprend rien avec leurs exemples
Du coup je me dis que ne m'exercant directement sur mon code alors je comrpednrais mieux
Oui mais je pense qu'il te manque quelques notions de base pour pouvoir comprendre le code.
Par exemple sur la porté des variables, sur la visibilité, les valeurs de retour ...
Normalement tu devrais pouvoir débuggé ce code, il est très basique.
Bah les variables sont soit privées soit publiques, le -> sert a invoqué si je puis dire des methodes sur un objet, $this represente l'objet qu'on utlise,et valeur de retour bah un tableau par exemple ...
j'dis des betises ?
En faisant ceci sur index.php :
Je n'ai plus d'erreur concernant mes variables,
Code : Sélectionner tout - Visualiser dans une fenêtre à part $base = new MaBase($hostname='localhost', $dbname='lcesa', $username='root', $pw='lcesa');
Par contre celle sur la function prepare persiste alors j'ai regardé plus attentivement sur le manuel de php et j'ai essayé ceci mais en vain :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public function doSelect($conn) { $sql = "SELECT * FROM technicien"; $sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sql->execute(); return $sql->fetchAll(); }
Pas du tout ^^
Je suis en pleine recherche de la fonction prepare qui ne va pas mais rien a faire je ne comprend pas =)
Tout vient a point a qui sait attendre du coup je continue de chercher ca finira bien par payer
il y a quelques erreurs au niveau de la classe MaBase:
au lieu de:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $this->conn = new PDO ("mssql:host=$this->hostname;dbname=$this->dbname","$this->username","$this->pw");
il faut plutôt écrire:
comme les tableaux, les attributs d'une classe dans une chaîne de caractères doivent être entourés d'accolades.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $this->conn = new PDO ("mysql:host={$this->hostname};dbname={$this->dbname}",$this->username,$this->pw);
Voici une des implémentions de ta classe MaBase quoique un pattern singleton est tout à fait conseillé dans ce cas préçis:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 class MaBase { //pourquoi des attributs ? des constantes de classe ne sont-elles pas plus adaptées pour ton cas? //Attributs public $conn = NULL; public $hostname="localhost"; public $dbname="lcesa"; public $username="root"; public $pw="lcesa"; //---------------Méthodes--------------- //Constructeur public function __construct() //constructeur vide { //$this->connect(); } /** * Renvoie une instance de connexion à la BD * * @return type PDO :une instance de connexion à la BD */ public function connect() { try { $this->conn = new PDO ("mysql:host={$this->hostname};dbname={$this->dbname}",$this->username,$this->pw ); return $this->conn; } catch( PDOException $Exception ) { echo $Exception->getMessage(); } } }
et plus loin pour exécuter une requête sql avec la classe précédente:
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public function doSelect() { $base = new MaBase();//création d'une instance de la classe MaBase() $sql = "SELECT * FROM technicien"; $sth = $base->connect()->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sth->execute(); return $sth->fetchAll(); }
Bonjour armel merci de ta réponse et de ton aide..
Peux tu m'expliquer mes erreurs si je t'en demande pas trop ?
Je vois ce que tu fais mais je ne le comprend pas ^^
Peux tu me faire un bref résumé s'il te plait ?
-----------
J'ai bien appliquer ton code avec un vulgaire copier coller par curiosité du resultat, dans ma page index.php j'ai une boucle for :
Il m'indique cette erreur a son sujet :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // on fait une boucle qui va faire un tour pour chaque enregistrement foreach ($technicienList as $onetechnicien) { // on affiche les informations de l'enregistrement en cours echo '<input type="submit" class="btn btn-default btn-lg btn-block" name="nom_acc" value="'.$onetechnicien->getNom().'" >'; }
Cette erreur veut bien dire que le getNom n'est pas renseigné et donc qu'il ne peux rien afficher?Fatal error: Call to a member function getNom() on a non-object in C:\wamp\www\LCEsa\index.php on line 38
Armel, pour répondre à cette remarque, lis mon post #4...pourquoi des attributs ? des constantes de classe ne sont-elles pas plus adaptées pour ton cas?
Ca, je savais pas...comme les tableaux, les attributs d'une classe dans une chaîne de caractères doivent être entourés d'accolades.
et je me demande un truc : est-ce que dans la classe MaBase, on pourrait y mettre une méthode "disconnect" :car il faut bien se déconnecter à la fin...
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public function disconnect(){ $this=NULL; }
Sinon, Gwendoline, pour qu'on puisse t'indiquer tes erreurs, donne ton code exhaustif.
Bonjour =)
Voici le code de index.php:
Voici le code de fonction .php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 <?php $request = new Request(); if ($request->hasParameter('accesrefu')) { echo '<script language="Javascript"> alert ("'.$request->getParameter('accesrefu').'" ) </script>'; } $base = new MaBase($hostname='localhost', $dbname='lcesa', $username='root', $pw='lcesa'); $technicien = new technicien(); $technicienList = $technicien->doSelect($base->conn); //On ouvre la connexion a la BDD $base->connect(); ?> <form method="post" name="nom_acc2" action="log_tech.php"> <?php // on fait une boucle qui va faire un tour pour chaque enregistrement foreach ($technicienList as $onetechnicien) { // on affiche les informations de l'enregistrement en cours echo '<input type="submit" class="btn btn-default btn-lg btn-block" name="nom_acc" value="'.$onetechnicien->getNom().'" >'; } // on ferme la connexion à mysql $base->stopConnect(); ?> </form>
VOici l'erreur qui s'affiche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 <?php class MaBase { //pourquoi des attributs ? des constantes de classe ne sont-elles pas plus adaptées pour ton cas? //Attributs public $conn = NULL; public $hostname="localhost"; public $dbname="lcesa"; public $username="root"; public $pw="lcesa"; //---------------Méthodes--------------- //Constructeur public function __construct() //constructeur vide { //$this->connect(); } /** * Renvoie une instance de connexion à la BD * * @return type PDO :une instance de connexion à la BD */ public function connect() { try { $this->conn = new PDO ("mysql:host={$this->hostname};dbname={$this->dbname}",$this->username,$this->pw ); return $this->conn; } catch( PDOException $Exception ) { echo $Exception->getMessage(); } } } // --------------------------------------Gestion des techniciens------------------------------- class Technicien { public function doSelectById(Array $id) { // code select } public function doSelect() { $base = new MaBase();//création d'une instance de la classe MaBase() $sql = "SELECT * FROM technicien"; $sth = $base->connect()->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sth->execute(); return $sth->fetchAll(); } public function doUpdate() { // code update } }
VOici la ligne 38 de index:Fatal error: Call to a member function getNom() on a non-object in C:\wamp\www\LCEsa\index.php on line 38
Code : Sélectionner tout - Visualiser dans une fenêtre à part echo '<input type="submit" class="btn btn-default btn-lg btn-block" name="nom_acc" value="'.$onetechnicien->getNom().'" >';
Dans ton doselect tu ne construis pas des objets technicien, et donc l'erreur est tout a fait logique.
C'est inutile maintenant (en effet, dans ton constructeur de 'MaBase' tu n'attends aucun parametres) et moche de faire l'affectation des valeurs dans l'appel de la fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part $base = new MaBase($hostname='localhost', $dbname='lcesa', $username='root', $pw='lcesa');
Bonjour marcuscircus et merci de ta réponse
Du coup je dois ajouter un objet technicien dans doselect pour que le foreach fonctionne c'est cela ?
Comment faire autrement pour affecter les valeurs alors? Si je ne fais pas ça il me retourne plein d'erreurs .
Ta méthode va récupérer tes éléments en base de données mais si tu veux faire de la POO (et ensuite appelle des méthodes sur les objets) elle doit aussi te créer un tableau d'objets technicien)Du coup je dois ajouter un objet technicien dans doselect pour que le foreach fonctionne c'est cela ?
Au début le constructeur de MaBase attendait 4 paramètres obligatoires, il fallait donc lui passer ces 4 paramètres, mais la tu as changer ton constructeur et celui ci ne fait plus rien et n'attends plus de paramètres donc je ne vois pas ou tu peux encore avoir des erreurs la dessus.Comment faire autrement pour affecter les valeurs alors? Si je ne fais pas ça il me retourne plein d'erreurs .
AVANT :MAINTENANT :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public function __construct($hostname, $dbname, $username, $pw) { $this->connect($hostname, $dbname, $username, $pw); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //Constructeur public function __construct() //constructeur vide { //$this->connect(); }
Donc ma méthode do select doit générer un tableau ?
J'avais mis ca dans doSelect :
Ca ne fais pas un tableau ca ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part return $sth->fetchAll();
Et les valeurs des attribut je les déclare dans le constructeur et du coup pas besoin de les mettre dans la déclaration de la méthode c'est ça ?
En faisant ceci dans fonction.php :
Et ceci dans index.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public $conn = NULL; public $hostname="localhost"; public $dbname="lcesa"; public $username="root"; public $pw="lcesa"; //---------------Méthodes--------------- //Constructeur public function __construct($hostname, $dbname, $username, $pw) //constructeur vide { $this->connect($hostname, $dbname, $username, $pw); }
Voici les erreurs que ca génère:
Code : Sélectionner tout - Visualiser dans une fenêtre à part $base = new MaBase($hostname, $dbname, $username, $pw);
x5Notice: Undefined variable: hostname in C:\wamp\www\LCEsa\index.php on line 23
x5Warning: Missing argument 1 for MaBase::__construct(), called in C:\wamp\www\LCEsa\fonctions.php on line 53 and defined in C:\wamp\www\LCEsa\fonctions.php on line 18
x5Notice: Undefined variable: hostname in C:\wamp\www\LCEsa\fonctions.php on line 20
x1Fatal error: Call to a member function getNom() on a non-object in C:\wamp\www\LCEsa\index.php on line 38
Si ca te fait un tableau mais pas un tableau d'objet Technicien, d'ou l'erreur que tu ne peux pas appelle getNom() car c'est une methode de Technicien.
Laisses le constructeur vide comme armel te la sugeré :
Mais du coup dans ton index tu ecris :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //Constructeur public function __construct() //constructeur vide { }
Code : Sélectionner tout - Visualiser dans une fenêtre à part $base = new MaBase();
Apres si tu veux laisser tes parametres dans ton constructeur alors appel le de cette facon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $base = new MaBase('localhost', 'lcesa', 'root', 'lcesa');
Et il va savoir les valeurs des attributs ?
Sans lui dire que ce sont des variables dont les valeurs sont présentes dans fonction.php ?
Mais c'est magique ce truc la
Bon maintenant il reste le problème d'affichage des noms des techniciens...
Est ce que j'ai bien compris ce qu'il fallait faire pour ce soucis ?
Je crois que tu n'as pas compris ce qu’était la POO et le principe d'encapsulation des données...Bah je dois mettre quoi alors pour afficher les résultat de mon tableau je comprend pas ..
Je dois créer un tableau d'objet que je vais appeler Technicien c'est ça ?
Et ensuite j'appel une fonction qui va m'afficher un a un les noms situés dans le tableau ?
Technicien est une classe qui doit contenir des proprietes et des methodes spécifiques au Technicien.
Le tien n'a ni propriétés ni la methodes getNom() que tu essayes d’appeler...
De plus tu construis un tableau mais pas un tableau d'objets, et donc si tu veux appelé la methode getNom() (qu'il faut d'abord definir dans la classe Technicien) Il faut que ce soit un objet de type Technicien....
Partager