Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2012, 22h03   #1
Invité de passage
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 2
Points : 2
Par défaut PHP POO et PDO

Bonjour à tous,
Je me mets tout juste à la POO en PHP après avoir quelques petits projets en procédural...
Je suis désolé, j'ai lu pas mal de choses sur la prog. objet et PDO mais je n'arrive pas bien à comprendre comment peut-on utiliser dans une classe...

Voici une petite classe d'identification pour faire des petits essais :

Code :
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
 
<?php
class Identification
{
	private $login;
	private $password;
	private $mail;
	private $cat;
 
	public function resultat($mail, $pass)
	{
		$this->mail = strip_tags($mail);
		$this->password = strip_tags($pass);
 
		if($this->testInfos($this->mail, $this->password) == true)
		{
			$_SESSION['acces_visiteur']= "oui";
			$_SESSION['login'] = $this->login;
			$_SESSION['mail'] = $this->mail;
			$_SESSION['cat'] = $this->cat;
 
			$message_erreur = "Identification OK";
		}
		else
		{
			$message_erreur = "L'identification a échouée";
		}
 
	}
 
 
	private function emailValide($mail)
	{
		return preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $mail);
	}
 
 
	private function testInfos($login, $password)
	{
		$bool = true;
 
		if($this->emailValide($login)== true)
		{
			$req = $bdd->query('SELECT * FROM comptes_utilisateurs WHERE Adresse_Email = '.$login.'';
			while($data = $req>fetch()){
			{
				if(md5($password) == $data->Mot_de_Passe)
				{
					$bool = true;
					$this->login = $data->Nom_Utilisateur;
					$this->cat = $data->Categorie;
				}
			}
			$req->closeCursor();
		}
 
		return $bool;
	}
 
 
}
Et mon fichier connexion :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
<?php
try
{
	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	$bdd = new PDO('mysql:host=localhost;dbname=maBDD', 'root', '', $pdo_options);
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
?>
Mais évidemment ça ne fonctionne pas, et je ne vois pas comment utiliser PDO dans les classes...

Merci pour votre aide.
distar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 22h15   #2
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
il te manque un tiret là :
Code :
while($data = $req->fetch()){
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 22h22   #3
Invité de passage
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 2
Points : 2
En effet, il manquait un tiret, mais j'ai toujours cette erreur :
Fatal error: Call to a member function query() on a non-object in C:\wamp\www\reseau-beaute-2\Includes\class_identification.php on line 43
distar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 00h46   #4
Membre émérite
 
Avatar de vorace
 
Homme
Développeur
Inscription : août 2010
Messages : 587
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur

Informations forums :
Inscription : août 2010
Messages : 587
Points : 861
Points : 861
Effectivement dans ta classe il n'y aucune référence à l'objet $bdd, donc soit tu ajoutes un attribut à ta classe qui pointera vers l'objet $bdd soit tu le passes en paramètre aux méthodes qui en ont besoin (requête)
__________________
Développeur informatique contrarié...
vorace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 08h59   #5
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Comme le dis vorace , la variable $bdd n'est pas connue dans ta classe , tout simplement car chaque classe à un contexte d’exécution qui lui est propre.

La solution qui à mon sens est la plus correcte est de passer de ton objet pdo à ta classe. Soit via un constructeur soit via un setter :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Identification
{
	private $pdo;
 
	public function __construct(PDO $objetpdo)
	{
		$this->pdo = $objetpdo
	}
 
	public function uneMethode()
	{
		$this->pdo->query('...');
	}
}
L'avantage de passer par le constructeur , c'est que tu es certains qu'une fois ta classe instanciée, tu auras un objet pdo à disposition. L’inconvénient c'est que ta classe va être fortement dépendante de PDO , ce qui sera moins le cas en passant par un setter mais demandera des contrôles plus important (sur l’existence de l'objet pdo).


Autre remarque sur ton code , puisque tu sembles débuter en POO. Ta classe identification contient une méthode de vérification d'email. Pour moi c'est une erreur. Le rôle de ta classe d'identification c'est ... d'identifier. Vérifier la validité d'un email c'est une autre tache.
Donc soit
- Tu ne crée pas une méthode spécifique à cette tache et tu utilise simple un filtre php
- Tu crées une classe statique spécifique aux controles sur les chaines de caractères que tu utiliseras dans ta classe Identification.

le but final étant de ne pas avoir à réécrire une méthode de validation d'email dans 4 classe différentes.
Arriver à correctement distinguer les fonctionnalités d'une classe est probablement une des notions les plus difficiles en objet.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 10h54   #6
Invité de passage
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 2
Points : 2
Ok je comprends mieux ce qui ne vas pas...

Merci à vous...
distar est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h47.


 
 
 
 
Partenaires

Hébergement Web