IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

CodeIgniter PHP Discussion :

Problème de requête


Sujet :

CodeIgniter PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 15
    Points
    15
    Par défaut Problème de requête
    Bonjour à tous,
    j'essaie de compter le nombre de commentaires pour chaque article, j'utilise codeIgniter 2, mais ma requête ne donne pas le bon résultat.

    c'est la 1ere fois que j'utilise CI, et cela fait plusieurs jours que je cherche une solution, si quelqu'un peut m'aider, se serait sympas.

    Voici mon code:
    mon modèle:
    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
     
    class Comments_model extends CI_Model {
     
    	public function __construct() {
    		$this->load->database();	
    	}
    	/*Fonction récuperrant le nombre de commentaire pour un article*/
    	public function get_nb_comment()
    	{
    		//$sql = "SELECT COUNT(commentaires.id) FROM commentaires, news WHERE commentaires.news_id = news.id GROUP BY news.id";
     
    		$query = $this->db->select('id')->from('commentaires')->join('news','news.id = commentaires.news_id')->group_by('news.id');
    		return $query->count_all_results();
    	}
    }
    Voici mon controller:
    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
     
    class News extends CI_Controller {
     
    	public function __construct()
    	{
    		parent::__construct();
    		$this->load->model('news_model');
    		$this->load->model('comments_model');
     
    	}
     
    	public function index()
    	{
    		$data['news'] = $this->news_model->get_news();
    		$data['count'] =  $this->comments_model->get_nb_comment();
    		$data['title'] = 'News archive';
     
    		$this->load->view('templates/header', $data);
    		$this->load->view('news/index', $data);
    		$this->load->view('templates/footer');
     
    	}
    }
    et pour finir ma vue:
    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
     
    <?php foreach ($news as $news_item): ?>
    			<h2><?php echo $news_item['title'] ?></h2>
    			<p class="news_meta"><?php echo date('d/m/Y H:i', strtotime($news_item['date'])) ; ?></p>
     
    			<p align="justify"><?php echo substr($news_item['text'],0,250) ?></p>
     
    			<p class="news_meta">
    				<?php
    				//On récupère le nombre de commentaires pour un article et on l'affiche 
    				//$count = $this->db->select('id')->from('commentaires')->where('news_id',$news_item['id']);
    				//$count = $this->db->count_all_results();
    				if ($count > 1)
    				{
    					echo  '('.$count.' commentaires)';
    				} else
    				{
    					echo '('.$count.' commentaire)'; 
    				}?>  
    			</p>
    Merci d'avance pour votre aide

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Points : 41
    Points
    41
    Par défaut
    Premières questions : C'est normal que dans ta requête le commentaire au dessus de la requête est différente de de la requête créer avec l'active record de Codeigniter ?

    Deuxièmes questions : Que fais la requête $data['news'] = $this->news_model->get_news(); elle récupéré toutes les news du site ?

    Troisème questions : Je ne suis pas un pro des bases de données SQL, mais si j'ai bien compris la requête elle sélectionne tous les id de la table commentaires et joint la table news quand news.id = commentaires.news_id et elle groupe le tout par commentaires.news_id. Je ne comprends pas pourquoi tu fais un joint alors que tu ne récupères rien de cette table. Je pense que cette requette produira le même effet :
    SELECT COUNT(commentaires.id) FROM commentaires GROUP BY commentaires.id

    Pense à donner la structure des tables concerner dans ta réponse.

    N’hésite pas à me laisser un MP si tu veux que je t'aide à corriger quelques choses.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Bonjour Nasuu,

    désolé de te revenir si tard, mais j' étais pas mal occupé.

    pour la question no 1, je ne comprend pas ce que tu veux dire.

    pour la question no 2: En effet $data['news'] = $this->news_model->get_news(); Récupère toute les news du site.

    pour la question no3: J'ai fais une jointure de table car je veux récupérer le nombre de commentaire pour chaque article, si je prend ta requête je vais récupérer tous les commentaires quelque soit l'article, à moins que le trie puisse se faire d'une autre façon comme faire une condition dans le controller?

    Je me suis remis sur mon projet que dernièrement et me suis encore cassez les dents.

    Aujourd'hui, j'ai hâte de comprendre et d'avancer ce projet.

    je rencontre le même problème pour afficher les news correspondant aux articles.

    Pour le moment, j'ai mis la requête dans la vue, mais j'aimerais que chaque code soit à sa place.

    Voici mon code:
    controller news.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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    class News extends CI_Controller {
     
    	public function __construct()
    	{
    		parent::__construct();
    		$this->load->model('news_model');
    		$this->load->model('comments_model');
     
    	}
     
    	public function index()
    	{
    		$data['news'] = $this->news_model->get_news();
    		$data['title'] = 'News archive';
     
    		$this->load->view('templates/header', $data);
    		$this->load->view('news/index', $data);
    		$this->load->view('templates/footer');
     
    	}
     
    	public function view($slug)
    	{
    	$data['news_item'] = $this->news_model->get_news($slug);
    	$data['rows'] = $this->comments_model->get_comments();
     
    	if (empty($data['news_item']))
    	{
    		show_404();
    	}
     
    	$data['title'] = $data['news_item']['title'];
     
    	$this->load->view('templates/header', $data);
    	$this->load->view('news/view', $data);
    	$this->load->view('templates/footer');
     
    	}
    }
    model comment_model
    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
    <?php
    /**
     * class concernant les commentaires
    */
    class Comments_model extends CI_Model {
     
    	public function __construct() 
    	{
    		$this->load->database();	
    	}
    	/*Fonction récuperrant le nombre de commentaire pour un article
    	public function get_nb_comment()
    	{
    		//$sql = "SELECT COUNT(commentaires.id) FROM commentaires, news WHERE commentaires.news_id = news.id GROUP BY news.id";
    		$where = 
    		$count = $this->db->select('id')->from('commentaires')->join('news','news.id = commentaires.news_id')->group_by('news.id');
    		$count = $count->count_all_results();*/
     
     
    	//Fonction récuperrant les commentaires
    	public function get_comments()
    	{
    		$this->db->select('*')->from('commentaires')->join('news','news.id = commentaires.news_id');
    		$q = $this->db->get();
     
    		if ($q->num_rows() > 0) 
    		{
     
    			foreach ($q->result() as $row ) 
    			{
    				$data[] = $row;
    			}
    			return $data;
    		}
    	}
    }
    news_model
    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
    <?php 
    class News_model extends CI_Model
     
    {
    	// Chopper l'id de la news pour la comparer dans le controleur à la news_id $id = $this->db->get_where('news', array('id' => $slug));
    	public function __construct()
    	{
    		$this->load->database();
    	}
     
    	//Fonction récupérant les articles
    	public function get_news($slug = FALSE)
    	{
    	if ($slug === FALSE)
    	{
    		$query = $this->db->get('news');
    		return $query->result_array();
    	}
     
    	$query = $this->db->get_where('news', array('slug' => $slug));
    	return $query->row_array();
    	}
    }
    vue inex.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
    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
    <!-------------- menu  ------------------>
    <div id="menu">
    	<ul>
    		<li><a href="http://www.crea-corp.com/index.php" >Accueil</a></li>
    		<li><a href="http://www.crea-corp.com/index.php/portfolio">Portfolio</a></li>
    		<li><a href="http://www.crea-corp.com/index.php/news" class="active">Blog</a></li>
    		<li><a href="http://www.crea-corp.com/index.php/ressources">Ressources</a></li>
    		<li><a href="http://www.crea-corp.com/index.php/contact">Contact</a></li>
    	</ul>
    </div>
    <!-------------- fin menu  ------------------>
     
    <!-------------- Contenu  ------------------>
     
    <div id="content_second">
    	<div class="content" class="cb_last">
    		<?php foreach ($news as $news_item): ?>
     
    			<h2><?php echo $news_item['title'] ?></h2>
    			<p class="news_meta"><?php echo date('d/m/Y H:i', strtotime($news_item['date'])) ; ?></p>
     
    			<p align="justify"><?php echo substr($news_item['text'],0,250) ?></p>
     
    			<p class="news_meta">
    				<?php
    				//On récupère le nombre de commentaires pour un article et on l'affiche 
    				$count = $this->db->select('id')->from('commentaires')->where('news_id',$news_item['id']);
    				$count = $this->db->count_all_results();
    				if ($count > 1)
    				{
    					echo  '('.$count.' commentaires)';
    				} else
    				{
    					echo '('.$count.' commentaire)'; 
    				}?>  
    			</p>
     
    			<div class="btn_more image_fr"><a href="news/<?php echo $news_item['slug'] ?>">Lire l'article <span>&raquo;</span></a></div>
            	<div class="cleaner"></div>
     
            <?php endforeach ?>
    	</div>
     
    </div>
     
    <!-------------- fin contenu  ------------------>
     
    <!-------------- side bar  ------------------>
     
    <div id="sideBar">
    	<h2>Catégories</h2>
    	<ul>
    		<!--On affiche les catégories-->
    		<?php foreach ($news as $news_item): ?>
     
    		<li><a href=""><?php echo $news_item['categories'] ?></a></li>
     
    		<?php endforeach ?>
     
    	</ul>
     
    </div>
    <!-------------- side bar  ------------------>
    et wiew.php utilisé lorsque l'on rentre dans un article
    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
    <!-- news -->
    <div id="content_second">
    	<div class="content" class="cb_last">
    		<?php echo '<h2>'.$news_item['title'].'</h2>';?>
    		<!--<div class="news_meta"><?php echo date('d/m/Y H:i', strtotime($news_item['date'])) ?></div> -->
     
    		<p align="justify"><?php echo $news_item['text'] ?></p>
     
    		<div class="cleaner"></div>
    	</div>
    <!-- Fin news -->
     
    <!-- Commentaires -->
     
    <h2>Commentaires</h2>
    <?php if ($rows) :
    	foreach ($rows as $r): ?>
     
    		<h2><?php echo $r->auteur; ?></h2>
    			<?php	echo $r->contenu; ?>
     
     
     
    <?php endforeach; endif; ?>
     
     
    </div>
     
     
     
    <!-- Fin Commentaires -->
     
     
    <!-- Fin Commentaires -->
     
    <!-------------- side bar  ------------------>
     
    <div id="sideBar">
    	<h2>Catégories</h2>
    	<ul>
     
    		<li><a href=""><?php echo $news_item['categories'] ?></a></li>
     
    	</ul>
     
    </div>
    <!-------------- Fin side bar  ------------------>
    Je t'envoie le shéma de la bdd par MP

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2011
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    j'oubliais voici un lien vers le site http://www.crea-corp.com/index.php/news

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/08/2003, 15h32
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème de requètes concurentes
    Par Emmanuel.G dans le forum XMLRAD
    Réponses: 3
    Dernier message: 08/08/2003, 16h51
  4. Réponses: 2
    Dernier message: 16/07/2003, 14h40
  5. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo