[RESOLU] Count avec variable

Mammouth du PHP | 1967 Messages

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
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 2703 Messages

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.

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

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);
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 643 Messages

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

Mammouth du PHP | 643 Messages

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

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

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...