Page 1 sur 1

Résultats requète mysql erronnés

Posté : 28 août 2012, 13:34
par Boro64
Bonjour à toutes et tous,

Afin d'éditer chaque semaine une liste "recherche clients => biens dispo" j'interroge la base ainsi/
$sql_mail = mysql_query("SELECT * FROM fiche_client WHERE budget_max !=0 
						    AND type != '' 
							AND nbr_pc != 0 
								AND ville_cherche_1 != '' ");
$nbr_client = mysql_num_rows($sql_mail);//compte les lignes

	while($lignes = mysql_fetch_array($sql_mail)){ 

		$id_client = trim($lignes['id_client']);
		$civil = trim($lignes['civil']);
		$nom = trim(stripslashes($lignes['nom'])); 
		$tel_f = trim($lignes['tel_f']);
		$tel_p = trim($lignes['tel_p']);
		$email = trim($lignes['email']);
		$budget_max = trim($lignes['budget_max']); 
		$type = stripslashes(trim($lignes['type'])); 
		$nbr_pc = stripslashes(trim($lignes['nbr_pc']));
		$ville_cherche_1 = addslashes(trim($lignes['ville_cherche_1']));
	
		$ville_cherche_2 = addslashes(trim($lignes['ville_cherche_2']));
	
		$ville_cherche_3 = addslashes(trim($lignes['ville_cherche_3']));

				$sql_cpte_annonces = mysql_query("SELECT * FROM annonces");
		$nbr_annonces = mysql_num_rows($sql_cpte_annonces);//compte les lignes

		$sql_cherche =	mysql_query("SELECT * FROM annonces WHERE type LIKE '%".$type."%'
									AND nbr_pc >= ".$nbr_pc."
										AND prix <= ".$budget_max."
											AND ville = '".$ville_cherche_1."' 
												OR ville = '".$ville_cherche_2."' 
													OR ville = '".$ville_cherche_3."' 
									ORDER BY id_annonces"); 
		$nbr_resultat = mysql_num_rows($sql_cherche);//compte les lignes

	
							while($row = mysql_fetch_array($sql_cherche)){	
					$ref = trim($row['ref']);
					$prix= trim($row['prix']);
					$nbr_pc = trim($row['nbr_pc']);
					$ville = trim($row['ville']);

						echo '<pre>';
						echo "Nom: ".$nom. "Refs=" .$ref. "Type :" .$type. "Prix:" .$prix. "nbr-pc=" .$nbr_pc. "Ville: " .$ville;
						echo '</pre>';
			
					}//fin du while sur les annonces	
		
		}//fin du while client
Le problème est le suivant: la requête renvoie des offres qui ne sont pas en adéquation avec la recherche sur 2 points: le nombre de pièces ($nbr_pc) et le prix ($budget_max).
Un peu comme si la requête ne tenait compte que des 1er et dernier points: le type et la ou les villes cherchées.
Auriez vous une idée, un piste?
D'avance merci.

Re: Résultats requète mysql erronnés

Posté : 28 août 2012, 13:55
par Ryle
Est-ce que les valeurs de tes enregistrements en base sont bien des chaines vides ? (et non pas une valeur NULL qui est différente de "", le premier étant l'absence de valeur, le second étant une valeur vide)
Si tes données sont à NULL au lieu de vide, il te suffit de modifier ta requête en remplaçant le != '' par un IS NOT NULL.

A noter également que pour ta secondes requête, il manque des parenthèses pour éviter la priorité de l'opérateur AND sur l'opérateur OR. En gros, ici :
                                                               type LIKE '%".$type."%'
                                                                        AND nbr_pc >= ".$nbr_pc."
                                                                                AND prix <= ".$budget_max."
                                                                                        AND ville = '".$ville_cherche_1."' 
                                                                                                OR ville = '".$ville_cherche_2."' 
                                                                                                        OR ville = '".$ville_cherche_3."'
Tu cherches les enregistrements :
- dont le type correspondent ET dont le nbr_pc est supérieur à celui demandé ET le prix est inférieur au budget max ET dans le souhait de ville 1
- OU dans le souhait de ville 2 (quelque soit les autres critères)
- OU dans le souhait de ville 3 (quelque soit les autres critères)

Si tu souhaites conserver les critères et rechercher dans une des trois villes, il te faut ajouter des parenthèses :
... AND ( critere1 OR critere2 OR critere3 )

Re: Résultats requète mysql erronnés

Posté : 28 août 2012, 14:15
par Boro64
Bonjour Ryle...et Merci !
Effectivement:
1) La valeur de nbr_pc pouvait être NULL et non "chaine vide"
2) Ah bhen oui...effectivement je souhaitais garder les critères pour les 3 villes. :oops:

Me reste un problème: normalement, je recherche un bien dont le nombre de pièces est supérieur OU égal à X...Or là, il ne me renvoie que les enregistrement avec un nombre de pièces supérieur...et uniquement supérieur.
Ainsi, j'ai un enregistrement d'une demande pour un 7 pièces; dans la base, 2 offres correspondrait en valeur et en lieu, mais seule celle en 8 pièces fait l'objet d'une réponse, et non pas celle en 7.... :oops:
J'ai raté quelque chose, ou ">=" ne veut pas dire "supérieur OU égal à" ???
Merci encore pour ton aide

Re: Résultats requète mysql erronnés

Posté : 28 août 2012, 14:30
par Mazarini
Pour le problème and et or :
where cond1 and (cond2 or cond3 or cond4)

Autrement, teste la requete via phpmyadmin ou un autre client mysql pour la mettre au point
Affiche la requete avant l'affichage des résultats pour la mise au point de ta page.

Re: Résultats requète mysql erronnés

Posté : 28 août 2012, 14:56
par Boro64
@Mazarini: OK, c'est ce que je faisais mais sans voir un autre problème.
Donc effectivement, "AND (cond2 OR cond3 etc.) règle bien le problème, ainsi (et surtout! Merci Ryle) que le "IS NOT NULL".
Le soucis que j'évoquais plus haut (absence d'une réponse attendue) venait du fait que mon client enregistre un lieu e type "nom à rallonge" dans ses annonces...mais le réduisait dans la fiche des recherches clients....Ex: un bien à "Knock le zout", devenait "Knock" dans la fiche client...
La requête devient donc:
		$sql_cherche =	mysql_query("SELECT * FROM annonces WHERE type LIKE '%".$type."%'
									AND nbr_pc >= ".$nbr_pc."
										AND prix <= ".$budget_max."
											AND (ville LIKE '%".$ville_cherche_1."%' 
												OR ville LIKE '%".$ville_cherche_2."%' 
													OR ville LIKE '%".$ville_cherche_3."%' )
									ORDER BY id_annonces"); 
Merci encore à vous pour l'aide et les conseils.