[RESOLU] Count avec variable

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Count avec variable

Re: Count avec variable

par Ryle » 18 mai 2016, 11:07

Bonjour,

Le count(*) te retourne le nombre d'enregistrements total sans se soucier du regroupement.
Tu dois pouvoir remplacer " COUNT(*) " par " COUNT(id_type_loisirs) " dans le Select et le Having, ou éventuellement mettre un distinct :)

Re: [RESOLU] Count avec variable

par yoann38 » 17 mai 2016, 22:53

Je reviens dessus car j'aimerais quand meme tout faire dans ma requete.
J'ai donc ceci maintenant.
$liste = "SELECT id_type_loisirs, COUNT(*) as nb FROM loisirs";
$liste.= " WHERE city = '".$_REQUEST['ville']."' AND date_fin_sortie > NOW() AND valide = 1 ";
$liste.= " GROUP BY id_type_loisirs HAVING COUNT(*) >= 1 ORDER BY nb DESC LIMIT 0,30";	
$liste = $bdd->query($sql);
						
$nb = $liste->rowCount();
while($row = $liste->fetch(PDO::FETCH_ASSOC)) {
						
						
// 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="ville-de-'.$_REQUEST['ville'].'/activite-'.simplification(strtolower($aLoisirs[$row['id_type_loisirs']])).'.html">'.$aLoisirs[$row['id_type_loisirs']].'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
					else 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";
					}
					
					
					else if (empty($_REQUEST['loisir']) && !empty($_GET['page'])  && !empty($_GET['ville']) && !empty($_REQUEST['region']) && empty($_REQUEST['departement'])) {
					echo '<li><a href="ville-de-'.$_REQUEST['ville'].'/activite-'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
					
					// Si il y a un département de renseignée et aucune page
					else if(!empty($_GET['page']) && !empty($_REQUEST['loisir']) && !empty($_REQUEST['ville']) && !empty($_REQUEST['region'])){
					echo '<li><a href="activite-'.simplification(strtolower($v)).'.html">'.$v.'</a><span class="subDropdown plus">'.$nb.'</span></li>'."\n";
					}
		
				  
				}
Cependant $nb à toujours la même valeur, qu'est ce qui bloque encore ?
Merci à vous

Re: Count avec variable

par yoann38 » 12 mai 2016, 20:39

Alors je comprends mieux le principe entre temps j'ai regardé mon code à tete reposé et j'ai juste rajouter une condition en testant $nb.

if ($nb>=1) {
....


est c'est tt bon.
Merci pour la leçon en tt cas

Re: Count avec variable

par Ryle » 12 mai 2016, 16:32

Il y a effectivement un petit soucis dans ton code :
$liste = $bdd->query("SELECT ... " );
$liste .= " GROUP BY ... ";
Tu fais une requête que tu exécutes et tu stocke le résultat dans ta variable $liste, puis tu essayes d'ajouter un bout de requête SQL dans le résultat..

Il faut d'abord constituer ta requête entièrement et ensuite l'exécuter :) ... et comme précisé par Spols, ne pas utiliser les alias de tes champs dans le select, mais le champ lui même
$sql = "SELECT id_type_loisirs, COUNT(*) as nb FROM loisirs";
$sqL.= " WHERE id_region = " . $region_id . " AND date_fin_sortie > NOW() AND valide = 1 ";
$sql.= " GROUP BY id_type_loisirs HAVING COUNT(*) >= 1 ORDER BY nb DESC LIMIT 0,30";

$liste = $bdd->query($sql);

Re: Count avec variable

par or 1 » 12 mai 2016, 14:26

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";
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 ?
le message est clair, query() retourne un objet PDOStatement, et il n'est pas possible de concatener un objet avec une chaine.

Re: Count avec variable

par Spols » 12 mai 2016, 08:24

Dans une clause HAVING, tu ne peux pas utiliser les alias créer dans le SELECT

c'est pourquoi Ryle te proposait
HAVING COUNT(*) >= 1

Re: Count avec variable

par yoann38 » 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

Re: Count avec variable

par Ryle » 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

Re: Count avec variable

par yoann38 » 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

Re: Count avec variable

par or 1 » 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.

Re: Count avec variable

par Ryle » 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

Re: Count avec variable

par yoann38 » 07 mai 2016, 13:28

c'est à dire ?

Re: Count avec variable

par Ryle » 05 mai 2016, 23:18

Bonsoir,

Effectivement, il te suffit d'un COUNT(*) >= 1 dans une clause HAVING de ta requête :)

Re: Count avec variable

par yoann38 » 05 mai 2016, 12:09

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

Re: Count avec variable

par yoann38 » 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";
					}		
				}
				?>