Page 1 sur 1

Pb de boolean dans mySQL ?

Posté : 17 août 2006, 19:30
par Funkpeck
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 103

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 :
	<form method="post" action="index.php?page=catalogue" name="catalogue">	
	
	Type : 
	<select name="type">
	<option value="">-Type-</option>
	<?php $sql = '
	SELECT nom, id
	FROM type_voiture
	ORDER BY nom';//mettre dans l'ordre alphabétique
	$resultat_type = mysqli_query($link, $sql);

	while ($row_type = mysqli_fetch_assoc($resultat_type))//tant qu'on trouve une réponse dans $resultat_type...
	{
		echo '<option value="'.$row_type['id'].'">'.$row_type['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
	}?>
	</select>

	Marque : 
	<select name="marque">
	<option value="">-Marque-</option>
	<?php $sql = '
	SELECT nom, id
	FROM marque_voiture
	ORDER BY nom';//mettre dans l'ordre alphabétique
	$resultat_marque = mysqli_query($link, $sql);

	while ($row_marque = mysqli_fetch_assoc($resultat_marque))//tant qu'on trouve une réponse dans $resultat_marque...
	{
		echo '<option value="'.$row_marque['id'].'">'.$row_marque['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
	}?>
	</select>
	
	Fabricant : 
	<select name="fabricant">
	<option value="">-Fabricant-</option>
	<?php $sql = '
	SELECT nom, id
	FROM fabricant
	ORDER BY nom';//mettre dans l'ordre alphabétique
	$resultat_fabricant = mysqli_query($link, $sql);

	while ($row_fabricant = mysqli_fetch_assoc($resultat_fabricant))//tant qu'on trouve une réponse dans $resultat_marque...
	{
		echo '<option value="'.$row_fabricant['id'].'">'.$row_fabricant['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
	}?>
	</select>
	
	<br />Modèle : 
	<select name="modele">
	<option value="">-Modèle-</option>
	<?php $sql = '
	SELECT nom_modele, id
	FROM voiture
	ORDER BY nom_modele';//mettre dans l'ordre alphabétique
	$resultat_modele = mysqli_query($link, $sql);

	while ($row_modele = mysqli_fetch_assoc($resultat_modele))//tant qu'on trouve une réponse dans $resultat_marque...
	{
		echo '<option value="'.$row_modele['id'].'">'.$row_modele['nom_modele'].'</option>';//...afficher cette réponse et recommencer la boucle
	}?>
	</select>
	
	<br />
	<input type="submit" name="rechercher" value="rechercher"> <br /><br />
	
	<?php
	
	$type = $_POST['type'];
	echo $type;
	
	$sql = '
	SELECT couleur, annee, echelle, url_photo_thumb, prix_ttc, 
	marque_voiture.nom AS nom_marque, 
	type_voiture.nom AS nom_type_voiture, 
	fabricant.nom AS fab,
	voiture.nom_modele AS nom_modele
	FROM voiture, marque_voiture, type_voiture, fabricant
	WHERE voiture.id_type = type_voiture.'.$_POST['type'].'
	AND voiture.id_marque = marque_voiture.'.$_POST['marque'].'
	AND voiture.id_fabricant = fabricant.'.$_POST['fabricant'].'
	ORDER BY nom_modele';

	$resultat = mysqli_query($link, $sql);

||||||||Ligne n°103	while ($row = mysqli_fetch_assoc($resultat))
	{
		    if ($row['annee'] == 0)//si l'année n'est pas présente, alors ne rien afficher plutot que d'afficher 0000
		{
			$row['annee'] = '';
		}
	    echo '<div class="voiture"><div class="voiture_infos"><img src="'.$row['url_photo_thumb'].'" /><br />
<i>'.$row['nom_marque'].'</i> '.$row['nom_modele'].'<br />'.$row['annee'].', '.$row['prix_ttc'].'€</div>
<div class="voiture_options">
	    <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>';
	}
?>
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

Posté : 18 août 2006, 07:49
par Cyrano
Vérifie que tes variables $_POST contiennent bien des valeurs. S'il en manque une, la requête va échouer et la suite du code va suivre le même chemin.

Posté : 18 août 2006, 20:30
par Funkpeck
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 :
	//On détermine l'ensemble des id, pour le transmettre dans le premier champs <option> des listes déroulantes ci-dessous
	$sql_id_fabricant = '
	SELECT id
	FROM fabricant';
	$resultat_id_fabricant = mysqli_query($link, $sql_id_fabricant);
	while ($id_fabricant = mysqli_fetch_assoc($resultat_id_fabricant))
	{
	echo $id_fabricant['id'].', ';
	$id_fabricant_all = $id_fabricant['id'];
	}
	?>


	Fabricant : 
	<select name="fabricant">
	<option value="<?php echo $id_fabricant_all; ?>">-Fabricant-</option>
	<?php $sql = '
	SELECT nom, id
	FROM fabricant
	ORDER BY nom';//mettre dans l'ordre alphabétique
	$resultat_fabricant = mysqli_query($link, $sql);

	while ($row_fabricant = mysqli_fetch_assoc($resultat_fabricant))//tant qu'on trouve une réponse dans $resultat_marque...
	{
		echo '<option value="'.$row_fabricant['id'].'">'.$row_fabricant['nom'].'</option>';//...afficher cette réponse et recommencer la boucle
	}?>
	</select>
	
	<br />
	<input type="submit" name="rechercher" value="rechercher"> <br /><br />
	
	<?php
	
	$sql = '
	SELECT couleur, annee, echelle, url_photo_thumb, prix_ttc, 
	marque_voiture.nom AS nom_marque, 
	type_voiture.nom AS nom_type, 
	fabricant.nom AS fab,
	voiture.nom_modele AS nom_modele
	FROM voiture, marque_voiture, type_voiture, fabricant
	
	WHERE 
	
	type_voiture.id = "'.$_POST['type'].'"
	AND marque_voiture.id = "'.$_POST['marque'].'"
	AND fabricant.id = "'.$_POST['fabricant'].'"
	
	AND voiture.id_type = type_voiture.id
	AND voiture.id_marque = marque_voiture.id 
	AND voiture.id_fabricant = fabricant.id';
	
	
	$resultat = mysqli_query($link, $sql) or die('Erreur mysql : '.mysqli_error($link)); 

	while ($row = mysqli_fetch_assoc($resultat))//essai avec mysqli_fetch_row sans resultat
	{
		    if ($row['annee'] == 0)//si l'année n'est pas présente, alors ne rien afficher plutot que d'afficher 0000
		{
			$row['annee'] = '';
		}
	    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">
	    <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>';
	}
Je pencherais pour un pb au niveau des jointures, mais quoi précisément :?:

Posté : 18 août 2006, 20:37
par Cyrano
Suggestion : récupère tes valeurs de formulaires dans des variables distinctes avant et crée dynamiquement tes requêtes selon l'existence ou non de contenu dans ces variables. Jette un coup d'oeil dans la FAQ sur la validation de formulaires complexes pour voir éventuellement comment procéder.

En gros, il faut dissocier la récupération des variables du traitement que tu en fais par la suite, ça peut t'éviter bien des désagréments.

Posté : 31 août 2006, 23:06
par Funkpeck
Ok merci, je vais faire effectivement regarder le FAQ :D