par
supercanard » 22 avr. 2009, 12:16
Bonjour,
Je viens de tomber sur un cas pratique pas terrible, qui concerne l'utilisation des méthodes de mes classe, qui est peut être mauvaise, car je constate que ma façon de faire est assez brutale question optimisation.
Pour la faire courte, j'ai une classe article avec ces méthodes :
- creer() ( qui permet de creer un objet article depuis la base de données )
- creerListe() ( qui permet de créer une liste d'article depuis la base de données )
Il faut savoir que creerListe boucle une liste d'id préalablement récupéré et apelle la méthode créer(). C'est lourd en nombre de requête mais évite d'avoir une redondance de code entre ces deux méthodes.
Enssuite, j'ai une classe rss avec une méthode
- creerRssArticle() qui permet de générer un flix rss des articles
Le problème est le suivant :
creerRssArticle fait en fait appel à la méthode creerListe() de la classe article, toujours pour éviter une redondance de code, et parce que elle rempli bien ce rôle, pourquoi donc réécrire du code inutile.
Mais niveau optimisation c'est pas terrible :
On lance en effet une requete, on boucle les résultats, on lance une autre requete au sein de la boucle, le tout pour creer un objet au complet, c'est à dire avec un tas de propriétés que l'on à pas besoin dans la classe rss...
Donc voilà, je suis assez perdu. D'un coté je pense qu'il est logique de faire comme celà, mais d'un autre je me dit que c'est lourd et que je fait les choses mal ?
Je laisse le code de ces 3 méthodes :
Article
public static function creer($value){
$val = array(':id'=>$value);
$req = "SELECT * FROM blog_article WHERE idArticle = :id";
$res = pdo2::getInstance()->prepare($req);
$res->execute($val);
$row = $res->fetch(pdo2::FETCH_OBJ);
$article = new article($row->idArticle);
$article->idCategorie = $row->idCategorie;
$article->etat = $row->etat;
$article->titre = $row->titre;
$article->titreForUrl = $row->titreForUrl;
$article->date = $row->date;
$article->chapo = $row->chapo;
$article->contenu = $row->contenu;
$article->optionMarque = $row->marque;
return $article;
}
public static function creerListe($idCategorie, $limitX, $limitY, $etat){
$val = array(':etat'=>$etat);
if($idCategorie == 'all' || $idCategorie == null){ // toute catégories confondues
$req = "SELECT blog_article.*idArticle FROM blog_article
JOIN blog_categorie ON blog_article.idCategorie = blog_categorie.idCategorie
WHERE etat = :etat ORDER BY date DESC LIMIT ".$limitX.",".$limitY."";
}
else{ // selon catégorie
$val[':idCategorie'] = $idCategorie;
$req = "SELECT idArticle FROM blog_article
JOIN blog_categorie ON blog_article.idCategorie = blog_categorie.idCategorie
WHERE blog_article.idCategorie = :idCategorie AND etat = :etat ORDER BY date DESC LIMIT ".$limitX.",".$limitY."";
}
$res = pdo2::getInstance()->prepare($req);
$res->execute($val);
//var_dump($res->execute($val));
$liste = array();
while($row = $res->fetch(pdo2::FETCH_OBJ)){
$liste[] = article::creer($row->idArticle);
}
return $liste;
}
rss
private function genererXmlArticle(){
$this->setHeader();
$article= article::creerListe('all', 0, 10, 1);
// suite boucle
Bonjour,
Je viens de tomber sur un cas pratique pas terrible, qui concerne l'utilisation des méthodes de mes classe, qui est peut être mauvaise, car je constate que ma façon de faire est assez brutale question optimisation.
Pour la faire courte, j'ai une classe article avec ces méthodes :
- creer() ( qui permet de creer un objet article depuis la base de données )
- creerListe() ( qui permet de créer une liste d'article depuis la base de données )
Il faut savoir que creerListe boucle une liste d'id préalablement récupéré et apelle la méthode créer(). C'est lourd en nombre de requête mais évite d'avoir une redondance de code entre ces deux méthodes.
Enssuite, j'ai une classe rss avec une méthode
- creerRssArticle() qui permet de générer un flix rss des articles
[b]Le problème est le suivant :
creerRssArticle fait en fait appel à la méthode creerListe() de la classe article, toujours pour éviter une redondance de code, et parce que elle rempli bien ce rôle, pourquoi donc réécrire du code inutile.
Mais niveau optimisation c'est pas terrible :
On lance en effet une requete, on boucle les résultats, on lance une autre requete au sein de la boucle, le tout pour creer un objet au complet, c'est à dire avec un tas de propriétés que l'on à pas besoin dans la classe rss...[/b]
Donc voilà, je suis assez perdu. D'un coté je pense qu'il est logique de faire comme celà, mais d'un autre je me dit que c'est lourd et que je fait les choses mal ?
Je laisse le code de ces 3 méthodes :
Article
[php]public static function creer($value){
$val = array(':id'=>$value);
$req = "SELECT * FROM blog_article WHERE idArticle = :id";
$res = pdo2::getInstance()->prepare($req);
$res->execute($val);
$row = $res->fetch(pdo2::FETCH_OBJ);
$article = new article($row->idArticle);
$article->idCategorie = $row->idCategorie;
$article->etat = $row->etat;
$article->titre = $row->titre;
$article->titreForUrl = $row->titreForUrl;
$article->date = $row->date;
$article->chapo = $row->chapo;
$article->contenu = $row->contenu;
$article->optionMarque = $row->marque;
return $article;
}
public static function creerListe($idCategorie, $limitX, $limitY, $etat){
$val = array(':etat'=>$etat);
if($idCategorie == 'all' || $idCategorie == null){ // toute catégories confondues
$req = "SELECT blog_article.*idArticle FROM blog_article
JOIN blog_categorie ON blog_article.idCategorie = blog_categorie.idCategorie
WHERE etat = :etat ORDER BY date DESC LIMIT ".$limitX.",".$limitY."";
}
else{ // selon catégorie
$val[':idCategorie'] = $idCategorie;
$req = "SELECT idArticle FROM blog_article
JOIN blog_categorie ON blog_article.idCategorie = blog_categorie.idCategorie
WHERE blog_article.idCategorie = :idCategorie AND etat = :etat ORDER BY date DESC LIMIT ".$limitX.",".$limitY."";
}
$res = pdo2::getInstance()->prepare($req);
$res->execute($val);
//var_dump($res->execute($val));
$liste = array();
while($row = $res->fetch(pdo2::FETCH_OBJ)){
$liste[] = article::creer($row->idArticle);
}
return $liste;
}[/php]
rss
[php]
private function genererXmlArticle(){
$this->setHeader();
$article= article::creerListe('all', 0, 10, 1);
// suite boucle
[/php]