[RESOLU] Count avec variable

Mammouth du PHP | 643 Messages

02 mai 2016, 17:27

Salut à tous.
Je cherche à afficher le nombré d'événement par catégorie selon une région.

J'ai fait donc ceci:
SELECT id_type_loisirs,COUNT(*) FROM loisirs GROUP BY id_type_loisirs
Ca me renvoi le total, j'aimerais maintenant uniquement les résultat de la région sur laquelle se trouve l'internaute.
Je récupère ca avec :
$_REQUEST['region']
Comment combiné le tt svp ?
Merci encore

Eléphant du PHP | 243 Messages

02 mai 2016, 18:15

Bonjour,
Il suffit d'effectuer une concaténation et d'ajouter une CLAUSE WHERE. Ça donnera quelque chose du genre :
$requere = "SELECT id_type_loisirs,COUNT(*) FROM loisirs WHERE region=".$_REQUEST['region']." GROUP BY id_type_loisirs";
"Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent"
~~Lorenzo Strigini

Mammouth du PHP | 643 Messages

02 mai 2016, 19:41

Ca ne marche pas je ne vois pas pourquoi ?
$region_id = !empty($_REQUEST['region']) ? regionByUrl($_REQUEST['region']) : NULL; 
					$count = array(); 
					
					$liste = ("SELECT id_type_loisirs,COUNT(*) FROM loisirs WHERE id_region = ".$region_id." GROUP BY id_type_loisirs");while($row = $liste->fetch(PDO::FETCH_ASSOC)) 
					$req = $bdd->query($liste);
					$nb = $req->rowCount();
					while($row = $liste->fetch(PDO::FETCH_ASSOC)) {
					$count[$row['id_type_loisirs']] =  $row['nb'];
					}
Fatal error: Call to a member function fetch()

ViPHP
ViPHP | 928 Messages

02 mai 2016, 20:00

Code : Tout sélectionner

$liste = ("SELECT id_type_loisirs,COUNT(*) FROM loisirs WHERE id_region = ".$region_id." GROUP BY id_type_loisirs");
?

Mammouth du PHP | 643 Messages

02 mai 2016, 20:31

J'ai corrigé un peu:

Mais ça m'affiche le meme resultat de partout et non par catégorie ....
$region_id = !empty($_REQUEST['region']) ? regionByUrl($_REQUEST['region']) : NULL; 
					$req = $bdd->query("SELECT id_type_loisirs,COUNT(*) as total FROM loisirs WHERE id_region = ".$region_id." GROUP BY id_type_loisirs " );
					
					while($row = $req->fetch(PDO::FETCH_ASSOC)) {
					$donnees = $req->fetch();
					$req->closeCursor();
					}

					asort($aLoisirs);
					foreach($aLoisirs as $k => $v) {;
					// Si il y a un loisir de renseignée et aucune page demandée
					if (!empty($_REQUEST['loisir']) && empty($_GET['page']) ) {
					echo '<li><a href="'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$donnees['total'].'</span></li>'."\n";
					}
					
					// Si il y a une page de renseignée
					else if(!empty($_GET['page']) && !empty($_REQUEST['loisir'])){
					echo '<li><a href="'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$donnees['total'].'</span></li>'."\n";
					}
					
					else{
					// Si il n y a pas de region de renseignée
					echo '<li><a href="'.$_REQUEST['region'].'/'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$donnees['total'].'</span></li>'."\n";
					}		
				}
				?>

Mammouth du PHP | 643 Messages

02 mai 2016, 20:54

C'est bon, une pause et un café et hop ;)
Merci
<?php	 
					echo $region_id = !empty($_REQUEST['region']) ? regionByUrl($_REQUEST['region']) : NULL; 
					$liste = $bdd->query("SELECT id_type_loisirs,COUNT(*) as nb FROM loisirs WHERE id_region = ".$region_id." GROUP BY id_type_loisirs " );
					while($row = $liste->fetch(PDO::FETCH_ASSOC)) {
					$count[$row['id_type_loisirs']] =  $row['nb'];
				 	}

					asort($aLoisirs);
					foreach($aLoisirs as $k => $v) {;
					$nb = array_key_exists($k, $count) ? $count[$k] : 0;
					// Si il y a un loisir de renseignée et aucune page demandée
					if (!empty($_REQUEST['loisir']) && empty($_GET['page']) ) {
					echo '<li><a href="'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
					
					// Si il y a une page de renseignée
					else if(!empty($_GET['page']) && !empty($_REQUEST['loisir'])){
					echo '<li><a href="'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
					
					else{
					// Si il n y a pas de region de renseignée
					echo '<li><a href="'.$_REQUEST['region'].'/'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}		
				}
				?>

Mammouth du PHP | 643 Messages

02 mai 2016, 23:06

Donc mon code marche bien mais j'aimerais juste affiché les catégories quand le total de celle ci est supérieur ou égal à 1

Si il y a plus d'une entrée de cette catégorie tu l'affiche sinon tu passe ton chemin en gros...
Merci à vous pour votre aide
<?php	  
					$liste = $bdd->query("SELECT id_type_loisirs,COUNT(*) as nb FROM loisirs WHERE id_region = ".$region_id." AND `loisirs`.`date_fin_sortie` > NOW() AND `loisirs`.`valide` = 1 GROUP BY id_type_loisirs " );
					while($row = $liste->fetch(PDO::FETCH_ASSOC)) {
					$count[$row['id_type_loisirs']] =  $row['nb'];
				 	}

					asort($aLoisirs);
					foreach($aLoisirs as $k => $v) {;
					$nb = array_key_exists($k, $count) ? $count[$k] : 0;
					// Si il y a un loisir de renseignée et aucune page demandée
					if (!empty($_REQUEST['loisir']) && empty($_GET['page']) ) {
					echo '<li><a href="'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
					
					// Si il y a une page de renseignée
					else if(!empty($_GET['page']) && !empty($_REQUEST['loisir'])){
					echo '<li><a href="'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
					
					else{
					// Si il n y a pas de region de renseignée
					echo '<li><a href="'.$_REQUEST['region'].'/'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}		
				}
				?>

Mammouth du PHP | 643 Messages

05 mai 2016, 12:09

Il y a une condition a rajouté if >= 1 je suppose quelque part mais ou et comment svp ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 mai 2016, 23:18

Bonsoir,

Effectivement, il te suffit d'un COUNT(*) >= 1 dans une clause HAVING de ta requête :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 643 Messages

07 mai 2016, 13:28

c'est à dire ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 mai 2016, 18:29

Ben..... qu'il te faut une clause HAVING à ta requête ... dans laquelle tu feras ton COUNT(*) >= 1 8-|

https://dev.mysql.com/doc/refman/5.0/en ... dling.html
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 2703 Messages

07 mai 2016, 18:43

en faisant le if en php, on gère l'affichage des 2 cas. avec le having, on aura plus qu'un cas pour le résultat de la requête.

Mammouth du PHP | 643 Messages

10 mai 2016, 16:40

Heu dans mon cas comment dois je faire du coup ?
Le but étant d'afficher uniquement si c'est supérieur ou egal à 1 en gros
// Si il n y a pas de ville de renseignée
					if (empty($_REQUEST['ville'])) {	
					$liste = $bdd->query("SELECT id_type_loisirs,COUNT(*) as nb FROM loisirs WHERE id_region = ".$region_id." AND `loisirs`.`date_fin_sortie` > NOW() AND `loisirs`.`valide` = 1 GROUP BY id_type_loisirs " );
					while($row = $liste->fetch(PDO::FETCH_ASSOC)) {
					$count[$row['id_type_loisirs']] =  $row['nb'];
				 	}
					
					asort($aLoisirs);
					foreach($aLoisirs as $k => $v) {;
					$nb = array_key_exists($k, $count) ? $count[$k] : 0;
					// Si il y a un loisir de renseignée et aucune page demandée
					if (!empty($_REQUEST['loisir']) && empty($_GET['page']) && empty($_REQUEST['region']) && empty($_REQUEST['departement'])) {
					echo '<li><a href="activite-'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}

// .....
Merci encore

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 mai 2016, 11:18

Au risque de me répéter, dans ton cas, tu dois ajouter une clause HAVING à ta requête, dans laquelle tout ce que tu as à spécifier c'est COUNT(*) >= 1 :roll:

http://www.lmgtfy.com/?q=clause+having+en+sql
SELECT ... 
  FROM ... 
  WHERE ... 
  GROUP BY ...
  HAVING COUNT(*) >= 1
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 643 Messages

12 mai 2016, 07:10

Alors j'ai suivi tes conseils et j'en suis donc à:
if (empty($_REQUEST['ville'])) {	
					$liste = $bdd->query("SELECT id_type_loisirs,COUNT(*) as nb FROM loisirs WHERE id_region = ".$region_id." AND `loisirs`.`date_fin_sortie` > NOW() AND `loisirs`.`valide` = 1 GROUP BY id_type_loisirs " );
					$liste .= " GROUP BY id_type_loisirs HAVING nb >= 1 ORDER BY nb DESC LIMIT 0,30";
					
					
					while($row = $liste->fetch(PDO::FETCH_ASSOC)) {
					$count[$row['id_type_loisirs']] =  $row['nb'];
				 	}
					
					asort($aLoisirs);
					foreach($aLoisirs as $k => $v) {;
					$nb = array_key_exists($k, $count) ? $count[$k] : 0;
					// Si il y a un loisir de renseignée et aucune page demandée
					if (!empty($_REQUEST['loisir']) && empty($_GET['page']) && empty($_REQUEST['region']) && empty($_REQUEST['departement'])) {
					echo '<li><a href="activite-'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
Mais une erreur se produit:

Catchable fatal error: Object of class PDOStatement could not be converted to string in C:\wamp\www\digital\list.php on line 978


cette ligne correspond à :
$liste .= " GROUP BY id_type_loisirs HAVING nb >= 1 ORDER BY nb DESC LIMIT 0,30";

Quel est le problème ?
Merci encore