[RESOLU] PDO requête donnant un résultat = 0 !!!

Petit nouveau ! | 6 Messages

05 janv. 2015, 17:41

Bonjour à tous, je viens vers vous tous car là, je dois avouer que je ne comprends pas pourquoi ça ne marche pas. J'ai fait le tour du web, j'ai pas trouvé de réponse à mon problème.
Voilà mon code :
public function countPupilsBySport($idSchool,$sports){
		if (is_int($idSchool) && is_int($sports)) {
			$sql = "SELECT COUNT(:sportx) AS 'sport' FROM pupils WHERE :blind != 0 AND school_id = :schoolid;";
			$nbSports = 'sport'.$sports.'_id';
			$nbSportsTwice = 'sport1_id';
			$rocket = $this->dbh->prepare($sql);
			$rocket->bindParam(':sportx', $nbSports, PDO::PARAM_STR);
			$rocket->bindParam(':blind', $nbSportsTwice, PDO::PARAM_STR);
			$rocket->bindParam(':schoolid', $idSchool, PDO::PARAM_INT);
			$rocket->execute();
			$countPupilsBySport = $rocket->fetch(PDO::FETCH_ASSOC);
			return $countPupilsBySport['sport'];
		}
	}
Mon problème se situe au niveau de la requête où j'ai écrit ":blind" . Si je remplace dans ma requête SQL blind par sport1_id ça marche, si je la bind ça ne marche pas. Et j'ai essayé bon nombre de choses. Rien à faire il ne me prends pas le "!= 0" en compte. Le résultat est correct lorsque j'écris en dur, mais égale à zéro lorsque je le bind. Avant de faire autrement, j'aimerai bien savoir pourquoi parce que là je dois avouer que je sèche mais complètement… :-/

Mammouth du PHP | 1339 Messages

05 janv. 2015, 18:17

Et si tu essayes rowCount http://php.net/manual/fr/pdostatement.rowcount.php
public function countPupilsBySport($idSchool,$sports){
                if (is_int($idSchool) && is_int($sports)) {
                        $sql = "SELECT * FROM pupils WHERE :blind != 0 AND school_id = :schoolid;";
                        $nbSportsTwice = 'sport1_id';
                        $rocket = $this->dbh->prepare($sql);
                        $rocket->bindParam(':blind', $nbSportsTwice, PDO::PARAM_STR);
                        $rocket->bindParam(':schoolid', $idSchool, PDO::PARAM_INT);
                        $rocket->execute();          
                        return $rocket->rowCount();
                }
        }
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Petit nouveau ! | 6 Messages

05 janv. 2015, 18:37

Merci pour le coup de main.
Ca marche toujours pas… int(0) C'est vraiment bizarre. Pourtant quand je tape la requête dans la console le résultat est bon. Il y a un problème avec PDO…

Mammouth du PHP | 1339 Messages

05 janv. 2015, 18:43

Et si tu vires les bind ?
public function countPupilsBySport($idSchool,$sports){
                if (is_int($idSchool) && is_int($sports)) {
                        $sql = "SELECT COUNT(?) AS 'sport' FROM pupils WHERE ? != 0 AND school_id = ?";
                        $nbSports = 'sport'.$sports.'_id';
                        $nbSportsTwice = 'sport1_id';
                        $rocket = $this->dbh->prepare($sql);
                        $rocket->execute(array($nbSports, $nbSportsTwice, $idSchool));
                        $countPupilsBySport = $rocket->fetch(PDO::FETCH_ASSOC);
                        return $countPupilsBySport['sport'];
                }
        }
Et le ; a la fin de la requete ne fou pas la merde ?
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Petit nouveau ! | 6 Messages

05 janv. 2015, 19:50

Je l'avais levé le ';' . Effectivement il a rien à faire là mais le problème ne vient pas de là. Ta solution ne marche tout de même pas.
Je vais essayer de donner plus d'informations.
ma requête :
select count(sport1_id) from pupils where school_id=2 and sport1_id!=0;

J'ai plusieurs school_id (3 en tout) et j'ai une table pupils avec ID,school_id,sport1_id,sport2_id,sport3_id. Que de l'integer. Quand c'est 0 y'a pas de sportX_id. Si je remplace les zéros par NULL et mets IS NOT NULL à la place de !=0 ça ne marche toujours pas.
$sql = "SELECT COUNT(?) AS 'sport' FROM pupils WHERE sport1_id IS NOT NULL AND school_id = ?";
                        $nbSports = 'sport'.$sports.'_id';
                        $rocket = $this->dbh->prepare($sql);
                        $rocket->execute(array($nbSports, $idSchool));
                        $countPupilsBySport = $rocket->fetch(PDO::FETCH_ASSOC);
                        return $countPupilsBySport['sport'];
Ma requête effectuée dans la console marche très bien. Lorsque je fais dans PDO, ça marche. Mais il n'y a rien à faire il ne prends pas en compte le ' !=0 '.

Si je fais ça, ça marche ....
$sql = "SELECT COUNT(?) AS 'sport' FROM pupils WHERE sport1_id!=0 AND school_id = ?";
                        $nbSports = 'sport'.$sports.'_id';
                        $rocket = $this->dbh->prepare($sql);
                        $rocket->execute(array($nbSports, $idSchool));
                        $countPupilsBySport = $rocket->fetch(PDO::FETCH_ASSOC);
                        return $countPupilsBySport['sport'];
J'ai l'impression qi'on ne peut pas binder 2 fois la même valeur; au départ je m'étais vautré parce que j'avais mis la même référence, et avec bindParam on ne petu pas mettre deux fois la même :bindmeplease

Petit nouveau ! | 6 Messages

05 janv. 2015, 20:02

et j'ai essayé en remplacant par count(id) et ça marche pas quand même

Petit nouveau ! | 6 Messages

05 janv. 2015, 20:17

en faisant ça ça marche .....
$nbSports = 'sport'.$sports.'_id';
			$sql = "SELECT COUNT(id) AS 'sport' FROM pupils WHERE ".$nbSports ." !=0 AND school_id = ?";
                        $rocket = $this->dbh->prepare($sql);
                        $rocket->execute(array($idSchool));
                        $countPupilsBySport = $rocket->fetch(PDO::FETCH_ASSOC);
                        return $countPupilsBySport['sport'];

ViPHP
AB
ViPHP | 5818 Messages

06 janv. 2015, 02:38

Bah oui les bind (quelque soit leur type nommés ou non) se font sur le nom des variables, mais pas sur le nom des colonnes.
Si tu veux faire des requêtes dynamiques en changeant le nom des colonnes il faut faire comme tu l'a fait dans ton précédent post. Enfin bon il faut être très prudent, et que personne d'autre que toi puisse définir "$sports", ou alors vérifier s'il fait partie d'une liste de possibilités autorisées.

Petit nouveau ! | 6 Messages

06 janv. 2015, 17:04

Ok, je te remercie.