Problème de boucle imbriquée

Petit nouveau ! | 3 Messages

10 juin 2011, 09:02

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

ViPHP
ViPHP | 2577 Messages

10 juin 2011, 09:31

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.

Mammouth du PHP | 672 Messages

10 juin 2011, 09:59

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);

Petit nouveau ! | 3 Messages

13 juin 2011, 14:08

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

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

13 juin 2011, 15:22

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

Petit nouveau ! | 3 Messages

13 juin 2011, 17:41

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