Page 1 sur 1

Problème de boucle imbriquée

Posté : 10 juin 2011, 09:02
par fredcom61
Bonjour ,

Je suis bloqué sur la construction d'un menu, en faite lorsque je veux appliquer une variable apres ...WHERE typeso='.$typeso.''); au lieu de WHERE typeso=\'BIJOUTERIE\'');
j'obtiens un message d'erreur "Fatal error: Call to a member function fetch() on a non-object in C:\ .... " a la ligne 24 ,
Si je teste la variable $typeso et elle s'affiche correctement .

Pouvez vous m'aider concernant ce script ?

voici le code :

Code : Tout sélectionner

<?php // On charge la liste des typeso $reponse = $bdd->query('SELECT DISTINCT typeso FROM commerce'); // Construction du menu -- Boucle 1 while ($donnees = $reponse->fetch()){ $typeso=$donnees['typeso']; // charger la liste des entrée majraso $base = $bdd->query('SELECT * FROM commerce WHERE typeso='.$typeso.''); // ICI MESSAGE : Fatal error: Call to a member function fetch() on a non-object in C:\ .... //$base = $bdd->query('SELECT * FROM commerce WHERE typeso=\'BIJOUTERIE\''); // ICI avec une valeur exisante sa fonctionne mais juste pour les Bijouterie !! ?> <ul> <?php echo $typeso; // Titre du menu et TEST DE LA VARIABLE // Construction des liens -- Boucle 2 while ($liens = $base->fetch()){ ?> <li><a href="affichage.php?numero=<?php echo $liens['id']; ?>"><?php echo $liens['majraso']; ?></a></li> <?php }//-- fin Boucle 2 $base->closeCursor(); // Termine le traitement de la requête Boucle 2 ?> </ul> <?php } //-- fin Boucle 1 $reponse->closeCursor(); // Termine le traitement de la requête ?>

Merci

Re: Problème de boucle imbriquée

Posté : 10 juin 2011, 09:31
par Mazarini
Bonjour,

A mon avis la requête faite sur la ligne
$base = $bdd->query('SELECT * FROM commerce WHERE typeso='.$typeso.'');
ne fonctionne pas.

Teste la bonne exécution du query et affiche la requête pour voir ce que çà donne.

Re: Problème de boucle imbriquée

Posté : 10 juin 2011, 09:59
par macgawel
Bonjour.

Ce message est typique d'une requête mal formulée.
Requête mal formulée => résultat = FALSE => quand tu fais ton fetch (qui attend un tableau ou un objet suivant le fetch), ça râle...

Pour débugger :
- Affiche la requête
- Teste le résultat de tes fonctions "sql".
// charger la liste des entrée majraso
$requete = 'SELECT * FROM commerce WHERE typeso='.$typeso.'';
// En cas de plantage, on arrête tout et on affiche la requete et le message d'erreur
$base = $bdd->query($requete) or die ("Erreur sur la requete $requete<br />".$bdd->error);

Re: Problème de boucle imbriquée

Posté : 13 juin 2011, 14:08
par fredcom61
Bonjour et merci pour vos réponses ...

j'ai appliqué le petit bout de code pour tester le résultat de la requête :

voici ce que j'obtiens :

Notice: Undefined property: PDO::$error in C:\wamp\www\etude_mySQL\liste3.php on line 19
Erreur sur la requete SELECT * FROM commerce WHERE typeso=Boulangeries Patisseries


Je vois que le champ "typeso" de la base de donnée est bien lu.

Je me suis rapproché de la base pour modifier le type de la colonne de text à varchar
meme erreur sauf que la j'ai "Alimentation" plutot que "Boulangeries Patisseries"

Je me demande si les champs contenant des cara&ctère spéciaux ne font pas défaut ?
je regarde ça un peu plus pret ce soir ...

encore merci de vos réponses

Fred

Re: Problème de boucle imbriquée

Posté : 13 juin 2011, 15:22
par Ryle
Si ton champ en base n'est pas numérique (int, float, double, ..), alors les valeurs auxquels tu le compares doivent être spécifiées entre apostrophes dans ta requête SQL : WHERE mon_champ = 'maChaine'

Re: Problème de boucle imbriquée

Posté : 13 juin 2011, 17:41
par fredcom61
Re ..

C'est cool j'ai le résultat que je cherche enfin, le CSS fera le reste ...

Ryle tu m'as mis sur la voie ...
et faite voila ce que j'ai ajouté à la requête : $cat= "'".$typeso."'"; ce qui fait toute la différence

Code : Tout sélectionner

$cat= "'".$typeso."'"; // charger la liste des entrée majraso $requete = 'SELECT * FROM commerce WHERE typeso = '.$cat.' '; // En cas de plantage, on arrête tout et on affiche la requete et le message d'erreur $base = $bdd->query($requete) or die ("Erreur sur la requete $requete<br />".$bdd->error);
j'ai aussi compris un truc tout bête "on peut générer le code a partir de phpmyadmin " c'est surement une découverte pour vous mais sa va me simplifier considérablement la tache .

Me reste à créer la console de modifs ou suppréssion des entrée ... la aussi ya du boulot

Un grand MERCI a vous !!

Fred