[php] Erreur boolean : MySQL en cause ?

Erreur boolean : MySQL en cause ? [php] - PHP - Programmation

Marsh Posté le 17-08-2006 à 20:00:43    

Bonsoir, voilà je vous explique le contexte :
 
ma page php génère des informations sur des voitures en fonctions des critères rentrés dans des listes de sélection (on choisit le type et/ou la marque et/ou le fabricant et/ou le modele).
 
La page apparaissant fonctionne bien (d'ailleurs elle liste tous les premiers modèles qu'elle trouve), mais lorsque je sélectionne un ou plusieurs critères, j'ai droit à un joli :
 
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in E:\Program Files\wamp\www\Formation PHP - Anaska\projet\site\inc_php\catalogue.inc.php on line 85
 
Je ne sais pas trop si le pb vient de php ou mysql, je pencherais plus sur mysql car c'est depuis que j'ai changé des paramètres dans les AND que ça n'affiche carrément plus rien.
 
Voici mon code :  
 

Code :
  1. <form method="post" action="index.php?page=catalogue" name="catalogue">   
  2.    
  3.     Type :
  4.     <select name="type">
  5.     <option value="">-Type-</option>
  6.     <?php $sql = '
  7.     SELECT nom, id
  8.     FROM type_voiture
  9.     ORDER BY nom';//mettre dans l'ordre alphabétique
  10.     $resultat_type = mysqli_query($link, $sql);
  11.     while ($row_type = mysqli_fetch_assoc($resultat_type))//tant qu'on trouve une réponse dans $resultat_type...
  12.     {
  13.         echo '<option value="'.$row_type['id'].'">'.$row_type['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
  14.     }?>
  15.     </select>
  16.     Marque :
  17.     <select name="marque">
  18.     <option value="">-Marque-</option>
  19.     <?php $sql = '
  20.     SELECT nom, id
  21.     FROM marque_voiture
  22.     ORDER BY nom';//mettre dans l'ordre alphabétique
  23.     $resultat_marque = mysqli_query($link, $sql);
  24.     while ($row_marque = mysqli_fetch_assoc($resultat_marque))//tant qu'on trouve une réponse dans $resultat_marque...
  25.     {
  26.         echo '<option value="'.$row_marque['id'].'">'.$row_marque['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
  27.     }?>
  28.     </select>
  29.    
  30.     Fabricant :
  31.     <select name="fabricant">
  32.     <option value="">-Fabricant-</option>
  33.     <?php $sql = '
  34.     SELECT nom, id
  35.     FROM fabricant
  36.     ORDER BY nom';//mettre dans l'ordre alphabétique
  37.     $resultat_fabricant = mysqli_query($link, $sql);
  38.     while ($row_fabricant = mysqli_fetch_assoc($resultat_fabricant))//tant qu'on trouve une réponse dans $resultat_marque...
  39.     {
  40.         echo '<option value="'.$row_fabricant['id'].'">'.$row_fabricant['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
  41.     }?>
  42.     </select>
  43.    
  44.     <br />Modèle :
  45.     <select name="modele">
  46.     <option value="">-Modèle-</option>
  47.     <?php $sql = '
  48.     SELECT nom_modele, id
  49.     FROM voiture
  50.     ORDER BY nom_modele';//mettre dans l'ordre alphabétique
  51.     $resultat_modele = mysqli_query($link, $sql);
  52.     while ($row_modele = mysqli_fetch_assoc($resultat_modele))//tant qu'on trouve une réponse dans $resultat_marque...
  53.     {
  54.         echo '<option value="'.$row_modele['id'].'">'.$row_modele['nom_modele'].'</option>';//...afficher cette réponse et recommencer la boucle
  55.     }?>
  56.     </select>
  57.    
  58.     <br />
  59.     <input type="submit" name="rechercher" value="rechercher"> <br /><br />
  60.    
  61.     <?php
  62.    
  63.     $type = $_POST['type'];
  64.     echo $type;
  65.    
  66.     $sql = '
  67.     SELECT couleur, annee, echelle, url_photo_thumb, prix_ttc,
  68.     marque_voiture.nom AS nom_marque,
  69.     type_voiture.nom AS nom_type_voiture,
  70.     fabricant.nom AS fab,
  71.     voiture.nom_modele AS nom_modele
  72.     FROM voiture, marque_voiture, type_voiture, fabricant
  73.     WHERE voiture.id_type = type_voiture.'.$_POST['type'].'
  74.     AND voiture.id_marque = marque_voiture.'.$_POST['marque'].'
  75.     AND voiture.id_fabricant = fabricant.'.$_POST['fabricant'].'
  76.     ORDER BY nom_modele';
  77.     $resultat = mysqli_query($link, $sql);
  78.    while ($row = mysqli_fetch_assoc($resultat))
  79.     {
  80.             if ($row['annee'] == 0)//si l'année n'est pas présente, alors ne rien afficher plutot que d'afficher 0000
  81.         {
  82.             $row['annee'] = '';
  83.         }
  84.         echo '<div class="voiture"><div class="voiture_infos"><img src="'.$row['url_photo_thumb'].'" /><br />
  85. <i>'.$row['nom_marque'].'</i> '.$row['nom_modele'].'<br />'.$row['annee'].', '.$row['prix_ttc'].'€</div>
  86. <div class="voiture_options">
  87.         <a href=""><img src="./images/panier.jpg" /></a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  88. <a href=""><img src="./images/zoom.jpg" /></a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  89. <a href=""><img src="./images/commande.jpg" /></a> </div></div>';
  90.     }
  91. ?>


 
Je n'ai pas trouvé d'infos pertinente, et ai testé la requete mysql dans phpmyadmin avec succès (en remplacant les $_POST par "ID".
 
Merci


Message édité par Funkpeck le 17-08-2006 à 20:16:04
Reply

Marsh Posté le 17-08-2006 à 20:00:43   

Reply

Marsh Posté le 17-08-2006 à 20:06:03    

C'est laquelle la ligne 103 ?

Reply

Marsh Posté le 17-08-2006 à 20:11:09    

Ni l'un ni l'autre, to mysqli_query renvoit faux, probablement à cause d'une erreur dans la requête.
 
Tu sais, quand sur ce forum, on milite pour l'intégration de contrôle d'erreur dans le code, c'est pas par hasard :D

Reply

Marsh Posté le 17-08-2006 à 20:20:45    

Globalement, la page fonctionne correctement quand tu spécifies aucun critère mais plante quand tu en mets certains ?

Reply

Marsh Posté le 17-08-2006 à 20:26:07    

Faut dire que la dernière requête est zarb quand même, tu compares un id avec non pas la valeur venant d'un des selects mais avec un champ venant d'une autre table dont le nom contiendrait la valeur du select choisi, ça semble étrange comme raisonnement :)

Reply

Marsh Posté le 17-08-2006 à 20:35:14    

parae -> J'avais notifié ou était l'erreur 103, mais finalement j'ai corrigé : il s'agit de la ligne 85 ici.
 
naceroth -> euh... argnhh, ne remue pas le couteau dans la plaie :o Je m'arrach les cheveux depuis cet apres-midi :D
 
 
EDIT :  oups pb déconnexion depusi 10 minutes donc décalage de réponse :D
 
 
******************************************
 
parae -> oui voila, quand j'arrive sur ma page, comme le post n'a pas été envoyé (on le sait par un isset), on lit un second formulaire qui se trouve en-dessous de celui-ci.
Et ça fonctionne correctement.
Par contre quand je sélectionne des paramètres...


Message édité par Funkpeck le 17-08-2006 à 20:37:28
Reply

Marsh Posté le 17-08-2006 à 20:42:47    

naceroth a écrit :

Faut dire que la dernière requête est zarb quand même, tu compares un id avec non pas la valeur venant d'un des selects mais avec un champ venant d'une autre table dont le nom contiendrait la valeur du select choisi, ça semble étrange comme raisonnement :)


 :??: je compare les ID contenus dans la table "voiture" avec les ID contenus dans les selects ?
Je ne vois pas comment faire autrement :??:

Reply

Marsh Posté le 17-08-2006 à 20:55:36    

Ouais, ça c'est la théorie, mais en pratique c'est pas ce que tu fais :D
 
Si tu fais un echo de ta dernière requête, en considérant que les ID sont numérique, ça donne :

Code :
  1. SELECT couleur, annee, echelle, url_photo_thumb, prix_ttc,
  2.    marque_voiture.nom AS nom_marque,
  3.    type_voiture.nom AS nom_type_voiture,
  4.    fabricant.nom AS fab,
  5.    voiture.nom_modele AS nom_modele
  6.    FROM voiture, marque_voiture, type_voiture, fabricant
  7.    WHERE voiture.id_type = type_voiture.1
  8.    AND voiture.id_marque = marque_voiture.1
  9.    AND voiture.id_fabricant = fabricant.1
  10.    ORDER BY nom_modele


 
je doute que ce soit ce que tu veux faire :)

Reply

Marsh Posté le 17-08-2006 à 21:00:19    

OK, je crois comprendre : c'est une syntaxe nimportnawak que j'ai mise quoi ? :D
 
Si je fais ça logiquement ça devrait marcher non ? :
 

Code :
  1. $type = $_POST['type'];
  2. $marque = $_POST['marque'];
  3. $fabricant = $_POST['fabricant'];
  4. $sql = '
  5. SELECT couleur, annee, echelle, url_photo_thumb, prix_ttc,
  6. marque_voiture.nom AS nom_marque,
  7. type_voiture.nom AS nom_type_voiture,
  8. fabricant.nom AS fab,
  9. voiture.nom_modele AS nom_modele
  10. FROM voiture, marque_voiture, type_voiture, fabricant
  11. WHERE voiture.id_type = '.$type.'
  12. AND voiture.id_marque = '.$marque.'
  13. AND voiture.id_fabricant = '.$fabricant.'
  14. ORDER BY nom_modele';


 
Parce-que ça ne marche pas non plus :/
Cé pa possib vivement que je ne sois plus débutant :o

Reply

Marsh Posté le 17-08-2006 à 21:09:08    

Traite tes erreurs nom d'une pipe

Code :
  1. $resultat = mysqli_query($link, $sql) or die('Erreur mysql : '.mysqli_error($link));


 
et fait des echos de tes requêtes quand elles foirent, et surtout avec quels paramètres :)

Reply

Marsh Posté le 17-08-2006 à 21:09:08   

Reply

Marsh Posté le 18-08-2006 à 18:39:23    

Bon, j'ai traité toutes mes erreurs (j'ai affiché dans chaque cas les variables transmises, et il s'agit bien des ID).
 
j'ai remarqué aussi que lorsque je traite tous les champs, ça fonctionne.
 
J'en suis donc arrivé à la conclusion que le problème vient du fait que lorsque l'on ne sélectionne pas dans une liste, alors ça renvoie une valeur vide : on demande à mysql de chercher la marque/type/fabricant dont l'ID correspond à "rien".
 
Il faut donc que je remplace ce vide par quelque chose qui voudrait dire "tout", mais là je ne sais pas quoi employer ?
 
j'ai tenté de mettre les différentes combinaisons possibles dans des variables qui "personnalisent" la requete mysql, mais il y a des infos qui ne correspondent pas à ce qui semble demandé.
 
Ya pas plus simple que ma solution tordue ?


Message édité par Funkpeck le 18-08-2006 à 18:42:25
Reply

Marsh Posté le 18-08-2006 à 20:34:21    

Voilà, j'ai refait ce qui n'allait pas et déjà, je n'ai plus aucun message d'erreur, et j'ai bien vérifié que les POST ne sont pas vides.
Cependant, si je ne remplis pas les 3 listes déroulantes, aucun résultat ne s'affiche.
 
Voici l'exemple d'UNE liste (puisque les autres sont exactement sur le meme modele, à part qu'elles s'appellent 'type', 'marque', fabricant') ainsi que la requete SQL :
 

Code :
  1. //On détermine l'ensemble des id, pour le transmettre dans le premier champs <option> des listes déroulantes ci-dessous
  2. <?php
  3.     $sql_id_fabricant = '
  4.     SELECT id
  5.     FROM fabricant';
  6.     $resultat_id_fabricant = mysqli_query($link, $sql_id_fabricant);
  7.     while ($id_fabricant = mysqli_fetch_assoc($resultat_id_fabricant))
  8.     {
  9.     echo $id_fabricant['id'].', ';
  10.     $id_fabricant_all = $id_fabricant['id'];
  11.     }
  12.     ?>
  13.     Fabricant :
  14.     <select name="fabricant">
  15.     <option value="<?php echo $id_fabricant_all; ?>">-Fabricant-</option>
  16.     <?php $sql = '
  17.     SELECT nom, id
  18.     FROM fabricant
  19.     ORDER BY nom';//mettre dans l'ordre alphabétique
  20.     $resultat_fabricant = mysqli_query($link, $sql);
  21.     while ($row_fabricant = mysqli_fetch_assoc($resultat_fabricant))//tant qu'on trouve une réponse dans $resultat_marque...
  22.     {
  23.         echo '<option value="'.$row_fabricant['id'].'">'.$row_fabricant['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
  24.     }?>
  25.     </select>
  26.    
  27.     <br />
  28.     <input type="submit" name="rechercher" value="rechercher"> <br /><br />
  29.    
  30.     <?php
  31.    
  32.     $sql = '
  33.     SELECT couleur, annee, echelle, url_photo_thumb, prix_ttc,
  34.     marque_voiture.nom AS nom_marque,
  35.     type_voiture.nom AS nom_type,
  36.     fabricant.nom AS fab,
  37.     voiture.nom_modele AS nom_modele
  38.     FROM voiture, marque_voiture, type_voiture, fabricant
  39.    
  40.     WHERE
  41.    
  42.     type_voiture.id = "'.$_POST['type'].'"
  43.     AND marque_voiture.id = "'.$_POST['marque'].'"
  44.     AND fabricant.id = "'.$_POST['fabricant'].'"
  45.    
  46.     AND voiture.id_type = type_voiture.id
  47.     AND voiture.id_marque = marque_voiture.id
  48.     AND voiture.id_fabricant = fabricant.id';
  49.    
  50.    
  51.     $resultat = mysqli_query($link, $sql) or die('Erreur mysql : '.mysqli_error($link));
  52.     while ($row = mysqli_fetch_assoc($resultat))//essai avec mysqli_fetch_row sans resultat
  53.     {
  54.             if ($row['annee'] == 0)//si l'année n'est pas présente, alors ne rien afficher plutot que d'afficher 0000
  55.         {
  56.             $row['annee'] = '';
  57.         }
  58.         echo '<div class="voiture"><div class="voiture_infos"><img src="'.$row['url_photo_thumb'].'" /><br /><i>'.$row['nom_marque_voiture'].'</i> '.$row['nom_modele'].'<br />'.$row['annee'].', '.$row['prix_ttc'].'€</div><div class="voiture_options">
  59.         <a href=""><img src="./images/panier.jpg" /></a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href=""><img src="./images/zoom.jpg" /></a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href=""><img src="./images/commande.jpg" /></a> </div></div>';
  60.     }


Je pencherais pour un pb au niveau des jointures, mais quoi précisément :??:


Message édité par Funkpeck le 18-08-2006 à 20:34:47
Reply

Marsh Posté le 19-08-2006 à 00:18:56    

Bah non, à priori il y a pas de soucis avec les jointures, mais il sort d'où ce $id_fabriquant_all ?
 
A mon avis, tu te casses la tête à vouloir compliquer inutilement un truc simple pour caser tout en une requête, pourquoi tu fais pas simplement (en considérant que tu ajoutes une option 'tout' sélectionnée par défaut dans chaque select : <option value="tout" selected="selected">Tout</option> )

Code :
  1. $where = '';
  2. if ($_POST['type'] != 'tout'){
  3. $where .= "and type_voiture.id = '".$_POST['type']."'";
  4. }
  5. if ($_POST['marque'] != 'tout'){
  6. $where .= "and marque_voiture.id = '".$_POST['marque']."'";
  7. }
  8. //et pareil pour le troisième
  9. $sql = "SELECT couleur, annee, echelle, url_photo_thumb, prix_ttc,
  10.    marque_voiture.nom AS nom_marque,
  11.    type_voiture.nom AS nom_type,
  12.    fabricant.nom AS fab,
  13.    voiture.nom_modele AS nom_modele
  14.    FROM voiture, marque_voiture, type_voiture, fabricant
  15. WHERE voiture.id_type = type_voiture.id
  16.    AND voiture.id_marque = marque_voiture.id
  17.    AND voiture.id_fabricant = fabricant.id ".$where;


 
(sous réserve d'erreurs probable vu l'heure et l'absence d'éditeur php :D)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed