Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1938 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [php] Erreur boolean : MySQL en cause ?

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[php] Erreur boolean : MySQL en cause ?

n°1426828
Funkpeck
Je suis une citation.
Posté le 17-08-2006 à 20:00:43  profilanswer
 

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
mood
Publicité
Posté le 17-08-2006 à 20:00:43  profilanswer
 

n°1426829
parae
Id PSN : Upohme
Posté le 17-08-2006 à 20:06:03  profilanswer
 

C'est laquelle la ligne 103 ?

n°1426831
naceroth
Posté le 17-08-2006 à 20:11:09  profilanswer
 

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

n°1426833
parae
Id PSN : Upohme
Posté le 17-08-2006 à 20:20:45  profilanswer
 

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

n°1426834
naceroth
Posté le 17-08-2006 à 20:26:07  profilanswer
 

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

n°1426840
Funkpeck
Je suis une citation.
Posté le 17-08-2006 à 20:35:14  profilanswer
 

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
n°1426844
Funkpeck
Je suis une citation.
Posté le 17-08-2006 à 20:42:47  profilanswer
 

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 :??:

n°1426860
naceroth
Posté le 17-08-2006 à 20:55:36  profilanswer
 

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

n°1426864
Funkpeck
Je suis une citation.
Posté le 17-08-2006 à 21:00:19  profilanswer
 

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

n°1426871
naceroth
Posté le 17-08-2006 à 21:09:08  profilanswer
 

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

mood
Publicité
Posté le 17-08-2006 à 21:09:08  profilanswer
 

n°1427435
Funkpeck
Je suis une citation.
Posté le 18-08-2006 à 18:39:23  profilanswer
 

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
n°1427496
Funkpeck
Je suis une citation.
Posté le 18-08-2006 à 20:34:21  profilanswer
 

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
n°1427585
naceroth
Posté le 19-08-2006 à 00:18:56  profilanswer
 

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)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [php] Erreur boolean : MySQL en cause ?

 

Sujets relatifs
[Résolu] Erreur de syntaxe, qui peut m'aider ?[MySql] : requete de premier elettres d'un clonne
erreur 1064 mysql 4.0erreur bizarre MySql
erreur asp pour écrire dans un fichier[SQL] Structure tables MySQL pour menu de Site Web, conseils
erreur MSDEV.EXEProblème de Triggers sous Mysql 5.022
Plus de sujets relatifs à : [php] Erreur boolean : MySQL en cause ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR