[débutant] - problème pour traiter les résultats de mes requêtes SQL

Eléphanteau du PHP | 17 Messages

18 nov. 2008, 11:35

Bonjour,
Je débute en PHP5 et je galère pour traiter les résultats de mes requêtes SQL.
Par exemple, j'ai une classe qui me permet de récupérer un user à partir d'une requête select:
<?php
//cette classe implemente le contrat d'interface IUserDAO

require_once("connexion/ConnexionPDO.php");
require_once("connexion/CloseConnBD.php");

class UserDAO implements IUserDAO
{
	public function readUser(/*String*/ $login, /*String*/ $password)
	{
		$pdo = ConnexionPDO::getInstance();
		$sql = "SELECT * FROM user WHERE pseudo= ? AND password= ?";
		$st = $pdo->getDBH()->prepare($sql);
		$st->execute(array($login,$password));	//return FALSE ou return un objet PDOStatement =>$st [en fait execute le prepare()]
		$resultat = $st->fetchAll();//à changer...
		//$resultat = $pdo->getDBH()->query($sql);
		CloseConnBD::closeConnection($pdo->getDBH());
		return $resultat;
	}
}

?>
Mon problème c'est que je ne sais pas utiliser les méthodes comme fetch() ou fetchAll() (voir fetchObject()).
Ce que je voudrais faire, vu qu'on est en POO, c'est de stocker mon résultat de requête dans une instance de ma classe UserDTO :
<?php

class UserDTO
{
	private /*int*/ $idUser;
	private /*String*/ $pseudo;
	private /*String*/ $password;
	private /*int*/ $statut;
	
	//Constucteur	NOTE : peut y avoir qu'un seul constructeur en PHP5 => si plusieurs faire fonction init
	public function __construct(/*int*/ $idUser, /*String*/ $pseudo, /*String*/ $password, /*int*/ $statut)
	{
		$this->idUser = $idUser;
		$this->pseudo = $pseudo;
		$this->password = $password;
		$this->statut = $statut;
	}
	
											/********************************
	 										* 		Getter and Setter		*
	 										********************************/
	
	public /*int*/ function getIdUser()
	{
		return $this->idUser ;
	}
	
	public /*String*/ function getPseudo()
	{
		return $this->pseudo ; 
	}
	
	public function setPseudo($pseudo)
	{
		$this->pseudo = $pseudo;
	}
	
	public /*String*/ function getPassword()
	{
		return $this->password ;
	}
	
	public function setPassword($password)
	{
		$this->password = $password;
	}
	
	public /*int*/ function getStatut()
	{
		return $this->statut ;
	}
	
	public function setStatut($statut)
	{
		$this->statut = $statut;
	}
	
										/************************************
										 *		Méthodes alternatives		*
										 ************************************/
	
	public /*String*/ function toString()
	{
		return "id = ".$this->idUser." , pseudo = ".$this->pseudo." , statut = ".$this->statut;
	}
}

?>
Mais je ne sais pas comment faire.
C'est un gros point bloquant dans l'avancement du codage de mon application (vos vous en doutez je pense).

J'aimerais donc savoir si vous connaissez des méthodes pour le faire (construire un objet UserDTO à partir du résultat de ma requête).
Je précise que je suis à la base dévelloppeur JAVA et que j'ai peut etre une vision non applicable à PHP5.

Merci d'avance.

ViPHP
ViPHP | 4674 Messages

18 nov. 2008, 20:26

Hey :),

J'ai lu en diagonale mais je vais t'expliquer le fonctionnement de PDO (car tu te bases dessus) et tu pourras sûrement résoudre ton problème.

PDO est constitué de deux couches : la principale, et la secondaire. La couche principale permet d'avoir des informations sur les pilotes ou ce genre de chose, mais permet avant tout de préparer une requête. La préparation d'une requête donne lieux à une instance de la couche secondaire, que l'on appelle statement. Cette couche symbolise donc une requête préparée (a contrario de simple). Tu peux paramétrer, exécuter, associer les résultats etc., (d')une requête préparée.

Donc si tu exécutes une requête préparée, tu auras toujours un objet PDOStatement. Sur cet objet, tu pourras ensuite associer les valeurs (fetch).

Ton problème peut se résoudre de cette façon : tu prépares les requêtes, tu les exécutes et tu retournes l'objet PDOStatement. Cet objet sera manipulé pour une seule et unique chose : associer les données (peut-être qu'on peut dire concrétiser les données aussi, ça reste cohérent).

Je pense que tu vois le schéma se dessiner dans ta tête ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 17 Messages

19 nov. 2008, 11:28

Oui je te remercie.
J'avais plus ou moins compris cela mais le soucis c'est que je ne trouve pas dans les exemples ou les manuel sur le net la syntaxe pour traiter mon objet PDOStatement pour pouvoir construire un objet à partir de lui.
J'ai essayé quantité de chose mais je dois mal comprendre le fonctionnement des methode fetch() et fecthAll().

édité après résolution du problème :

Bon alors pour information c'était vraiment juste parce que je comprenais rien à fetch().
J'ai donc utilisé la méthode fetch() pour traiter mon objet PDOStatement (le retour de ma requête via PDO).
Mais j'ai utilisé une boucle while pour ce faire (bien que je n'ai qu'un seul enregistrement de retourné).

C'est à dire :
$pdo = ConnexionPDO::getInstance();
		$sql = "SELECT * FROM user WHERE pseudo= ? AND password= ?";
		$st = $pdo->getDBH()->prepare($sql);
		$st->execute(array($login,$password));	//return FALSE ou return un objet PDOStatement =>$st [en fait execute le prepare()]

while($resultat = $st->fetch())
		{
			$userDTO = new UserDTO();	//j'instancie un objet de classe UserDTO
			
			$userDTO->init($resultat['idUser'],$resultat['pseudo'],$resultat['password'],$resultat['statut']);
}
CloseConnBD::closeConnection($pdo->getDBH());
Ainsi donc j'ai bien initialisé mon objet $userDTO.

J'utilise une fonction d'initialisation au lieu du constructeur __construct() car j'ai cru comprendre qu'on ne pouvait pas avoir plusieurs constructeur en PHP du coup je préfère instancier mes classe sans prorpiétés et les rajouter par des méthodes init() suivant que j'utilise ou pas toutes les propriétés de ma classe.
Pensez vous que cela est inutile et qu'il y a plus efficace que cela?

ViPHP
ViPHP | 4674 Messages

20 nov. 2008, 13:43

J'utilise une fonction d'initialisation au lieu du constructeur __construct() car j'ai cru comprendre qu'on ne pouvait pas avoir plusieurs constructeur en PHP du coup je préfère instancier mes classe sans prorpiétés et les rajouter par des méthodes init() suivant que j'utilise ou pas toutes les propriétés de ma classe.
Pensez vous que cela est inutile et qu'il y a plus efficace que cela?
PHP permet, contrairement à Java < 6, des valeurs par défaut pour les arguments d'une méthode. Tu peux écrire ceci :
public function __construct ( $arg1, $arg2, $arg3 = null, $arg4 = array() );
arg1 et arg2 sont obligatoires, et les autres optionnels. S'ils ne sont pas précisés, ils prendront les valeurs indiquées. Est-ce que j'ai répondu à ta question ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 17 Messages

20 nov. 2008, 14:00

J'utilise une fonction d'initialisation au lieu du constructeur __construct() car j'ai cru comprendre qu'on ne pouvait pas avoir plusieurs constructeur en PHP du coup je préfère instancier mes classe sans prorpiétés et les rajouter par des méthodes init() suivant que j'utilise ou pas toutes les propriétés de ma classe.
Pensez vous que cela est inutile et qu'il y a plus efficace que cela?
PHP permet, contrairement à Java < 6, des valeurs par défaut pour les arguments d'une méthode. Tu peux écrire ceci :
public function __construct ( $arg1, $arg2, $arg3 = null, $arg4 = array() );
arg1 et arg2 sont obligatoires, et les autres optionnels. S'ils ne sont pas précisés, ils prendront les valeurs indiquées. Est-ce que j'ai répondu à ta question ?
Ok merci beaucoup.
C'est très précisemment le genre de réponse que j'attendais. :D

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 nov. 2008, 14:28

PHP permet, contrairement à Java < 6, des valeurs par défaut pour les arguments d'une méthode.
Un p'tit plus sur ce qui est souligné par HyWaN : Java n'a pas besoin d'implémenter cette possibilité d'affecter des valeurs par défaut aux paramètres pour qu'ils soient facultatifs car il (java) permet la technique de surcharge de méthodes. Ainsi, on peut sous Java, définir plusieurs méthodes ayant le même nom mais pas les mêmes paramètres (le constructeur d'une classe est aussi concerné)

Exemple de classe Java:

Code : Tout sélectionner

class Membre { // Constructeurs public Membre () { // pour créer un objet sans l'initialiser } public Membre(String login, String pwd){ // pour créer un nouvel objet Membre tout en initialisant ses propriétés } // ... }
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 4674 Messages

20 nov. 2008, 14:30

Oui, c'est pour ça que je précise inférieur à Java 6 car (il me semble) que dans cette version, quand on précise des valeurs par défaut aux arguments, le compilateur va réécrire plusieurs méthodes, il va les surcharger. C'est que fait PHP à mon humble avis :).
Il faudrait regarder le bytecode généré par Java 6 mais … la flemme :D.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).