Page 1 sur 4

recherche multicritéres

Posté : 29 oct. 2005, 13:52
par StarT
Bonjour tout le monde, Je suis à la recherche d'un moteur de recherche multicritères à partir d'une base de données sur une table "location" cette application concerne un site d'immoblier, donc on doit formir un certain nombre d'infos sur l'annoce à rechercher ou sans les formir comme ça on affiche toutes les annoces qu'on a dans la base de données avec un systelem de pagination !

j'ai fait un code mais ça me donne pas le resultat que j'attends !
j'ai 2 boutons radio (location - vente ) et 5 combo box ( pays, ville , type logement , ...)

Pouvez vous m'aider ?! Merci d'avance

Posté : 29 oct. 2005, 14:06
par Truc
Salut, montre deja le code que tu as fait, meme s'il n'est pas parfait au moins c'est un début :wink:

Posté : 29 oct. 2005, 14:14
par StarT
Ok le voilà ! :?

moteur.php

<HTML><head>
<title>Recherche Achat</title>
<body bgcolor=white text=black link=blue vlink=blue alink=blue>

<?php
include("gestion/config.php");
 $pays_combo=$_POST['pays_combo'];
 $sub_ville=$_POST['sub_ville'];
 $sub_type_achat =$_POST['sub_type_achat'];
 $sub_type_logement =$_POST['sub_type_logement'];
 $meublier=$_POST['meublier'];
 $radionchk=$_POST['radionchk'];
 
  $sql="select * from achat where location='$radionchk'";
  
	 $result = mysql_query($sql);
	 $total = mysql_num_rows($result);
// $nbr=mysql_num_rows($sql);		
 
       if ($pays_combo != "0")
           {
            $sql=$sql + "and pays like '%$pays_combo%'";
           }
		   
        if ($sub_ville != "0")
           {
            $sql=$sql + "and ville like '%$sub_ville%'";
            }
			
        if ($sub_type_achat != "0")
            {
            $sql=$sql + "and type_achat like '%$sub_type_achat%'";
             }
			 
            if ($sub_type_logement != "0")
             {
            $sql=$sql + "and type_logement like '%$sub_type_logement%'";
             }
			 
            if ($sub_type_logement != "0")
             {
            $sql=$sql + "and meuble like '%$meublier%'";
             }
 
			/* $limit = 5;
			 
			 if(empty($page)) {
							$page = 1; 
							$limitvalue = $page * $limit - ($limit);
			                $result1 = mysql_query($sql);
							$total = mysql_num_rows($result1);
							
							$result = mysql_query($sql_select);
							$count_result = mysql_num_rows($result); */
							
//include ("affich.php") ;  
// }
/* $numofpages = ceil($total / $limit);

$from=$limit*$page-$limit+1;
$to=$from + $count_result-1; */

echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#802A47'>
					  <tr>";
						echo"<td width='50%' align='left' class='txt1'>&nbsp; <font color='#ECC600' size='2'><b>$total Annonce(s)</b></font></td>";
					  echo"<td align=\"right\" class='txt1'>";
			
				echo"<font color='#ECC600' size='2'>Visualisation de: </font>";
				echo"</td>";
			
		echo"</td>";
					  echo"</tr>
					</table>";
				
	
				 $k=0; 
				while ($row = mysql_fetch_array($result))
					{
							$k++ ;
							$prix = $row["prix"];
							$sub_type_achat = $row["type_achat"];
							$sub_type_logement = $row["type_logement"];
							$meuble = $row["meuble"];
							$ville = $row["ville"];
							$location = $row["location"];
							$pays = $row["pays"];
							$surface = $row["surface"];
							$description = $row["description"];
							$reference = $row["reference"];
							$surle = $row["surle"];
							$aproximite = $row["aproximite"];
							
							$description= stripslashes($description);
							$description= nl2br($description);
					
					if( $k%2 == 0 )
						$color = "#AD6187";
					else
						$color = "#9c4d6d";	
						
					
					echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#802A47' ><tr>
					  	<td bgcolor='$color' align='left' width='367' class='txt1'> <font color='#FFFFFF'>&nbsp;<strong><u>Annonce N° $reference</u></strong><br>
						&nbsp;<b>$type_achat à $ville  ";
						if ($surface !=0)
						{
							echo"de surface $surface m2<br>";
						}
						else
						{
							echo"<br>";
						}
						echo"&nbsp;$description </b><br>";
					$sql_select2 = "select * from client where reference = '$reference' ";
					 $result2 = mysql_query($sql_select2);
					 $row = mysql_fetch_array($result2);
		
					 	$reference = $row["reference"];
						$tel = $row["tel"];
						$gsm1 = $row["gsm1"];
						$gsm2 = $row["gsm2"];
						
						if (($tel!="Pas de téléphone"))
						{
							if (!empty($tel))
								{
									echo"<font color='#FFFFFF'><b><u>Tél.</u>$tel</b></font>";
								}	
						}
					echo"<br>";
						if (($gsm1!="Pas de GSM"))
						{
							if (!empty($gsm1))
								{
									echo"<font color='#FFFFFF'><b><u>GSM 1.</u>$gsm1</b></font>";
								}	
						}
					echo"<br>"; 
						if (($gsm2!="Pas de GSM"))
						{
							if (!empty($gsm2))
								{
									echo"<font color='#FFFFFF'><b><u>GSM 2.</u>$gsm2</b></font>";
								}	
						}
					echo"</font>
						</td>
						<td bgcolor='$color' width='106' align='center' class='txt1'><font color='#FFFFFF'>&nbsp;<b>Prix :<br>";
										
						if ($prix != 0)
							
							echo"$prix</b></font></td>";
						else
							
							echo"N.D</b></font></td>";
					  echo"</tr>
					</table>";
								
					}
echo "<table align=\"center\" width=\"479\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
	echo"<tr>";
		//echo"<td align=\"left\" class='menuc'>";
			
			
		echo"</td>";
	echo"</tr>";
echo"</table>";
?>
</body>
</head>
</html>

Posté : 29 oct. 2005, 14:33
par Truc
ok, c'est surtout au niveau de la construction de la requete que c'est pas correct.

1. Pour concatèner en php on utilise le point ( . ) et non le "+" comme en javascript.

2. laisse des espaces avant et apres les bouts de requete concatèné sinon tout se colle et générer une erreur.

3.niveau lisibilité vaut mieux séparer les variables du reste d'une chaine de caractères.

4. Remarque: la valeur par défaut des listes est bien "0" ?

Voila le 1er test corrigé, adapte les autres de la meme manière:
if ($pays_combo != "0")
{
	$sql.=" and pays like '%".$pays_combo."%' ";
}
ici j'ai fait la concaténation avant le "=" grace au point, ça revien a la meme chose que de faire:
$sql = $sql . " and pays like '%".$pays_combo."%' ";
essaie deeja de tout afficher sans la pagination et si ça fonctionne alors tu passe au niveau supérieur :wink:

Posté : 29 oct. 2005, 14:48
par StarT
ok je vais esayer ça merci beaucoup truc ! :wink:

Posté : 29 oct. 2005, 14:57
par Truc
de plus le mieux serai d'exécuté la requete au complet et pas seulement avec l'initialisation :wink:

Il faut donc déplacer l'exécution apres les tests (if)
if($pays_combo != "0")
if()
...
...
$result = mysql_query($sql);

Posté : 29 oct. 2005, 15:15
par StarT
j'ai mis ce code, et j'ai 3 erreurs !
<HTML>
<head>
<title>Recherche Achat</title>
<body bgcolor=white text=black link=blue vlink=blue alink=blue>

<?php
include("gestion/config.php");
include ("fonctions.php");
 $pays_combo=$_POST['pays_combo'];
 $sub_ville=$_POST['sub_ville'];
 $sub_type_achat =$_POST['sub_type_achat'];
 $sub_type_logement =$_POST['sub_type_logement'];
 $meublier=$_POST['meublier'];
 $radionchk=$_POST['radionchk'];
 $allcriteres=$_POST['allcriteres'];
  $sql="select * from achat where location='$radionchk'";
      $resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
  $nb_total = mysql_fetch_array($resultat); 
  
    if (($nb_total = $nb_total[0]) == 0) { 
         echo 'Aucune réponse trouvée'; 
      } 
      else { 
 if (!isset($_GET['debut'])) $_GET['debut'] = 0; 
          
         $nb_affichage_par_page = 10; 
          
         if ( $allcriteres == "oui") 
                 $operateur="AND"; 
               else 
               $operateur="OR"; 
               if ($pays_combo != "") 
               $finrequete .= " pays LIKE '%$pays_combo%'"; 
               if ($sub_ville != "") 
               if ($finrequete != "") 
               $finrequete .= " $operateur (ville LIKE '%$sub_ville%')"; 
               else 
               $finrequete .= " (ville LIKE '%$sub_ville%')"; 
               if ($sub_type_achat != "") 
               if ($finrequete != "") 
               $finrequete .= " $operateur type_achat LIKE '%$sub_type_achat%'"; 
               else 
               $finrequete .= " type_achat LIKE '%$sub_type_achat%'"; 
               if ($sub_type_logement != "") 
               if ($finrequete != "") 
               $finrequete .= " $operateur type_logement LIKE '%$sub_type_logement%'"; 
               else 
               $finrequete .= " $type_logement LIKE '%$sub_type_logement%'"; 
               if ($meublier != "") 
               if ($finrequete != "") 
               $finrequete .= " $operateur meuble LIKE '$meublier'"; 
               else 
               $finrequete .= " meuble LIKE '$meublier'"; 
               if ($finrequete != "") 
               $sql="SELECT * FROM location WHERE $finrequete ORDER BY prix LIMIT ".$_GET['debut'].','.$nb_affichage_par_page; 
               else 
               $sql='SELECT * FROM location ORDER BY prix LIMIT '.$_GET['debut'].','.$nb_affichage_par_page; 
                               
               $res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());   
			    
			    while ($result = mysql_fetch_array($res)) { 
             
							$k++ ;
							$prix = $row["prix"];
							$sub_type_achat = $row["type_achat"];
							$sub_type_logement = $row["type_logement"];
							$meuble = $row["meuble"];
							$ville = $row["ville"];
							$location = $row["location"];
							$pays = $row["pays"];
							$surface = $row["surface"];
							$description = $row["description"];
							$reference = $row["reference"];
							$surle = $row["surle"];
							$aproximite = $row["aproximite"];
							
							$description= stripslashes($description);
							$description= nl2br($description);
					
					if( $k%2 == 0 )
						$color = "#AD6187";
					else
						$color = "#9c4d6d";	
						
					
					echo"<table width='600' border='0' cellpadding='0' cellspacing='2' bgcolor='#802A47' ><tr>
					  	<td bgcolor='$color' align='left' width='367' class='txt1'> <font color='#FFFFFF'>&nbsp;<strong><u>Annonce N° $reference</u></strong><br>
						&nbsp;<b>$type_achat à $ville  ";
						if ($surface !=0)
						{
							echo"de surface $surface m2<br>";
						}
						else
						{
							echo"<br>";
						}
						echo"&nbsp;$description </b><br>";
					$sql_select2 = "select * from client where reference = '$reference' ";
					 $result2 = mysql_query($sql_select2);
					 $row = mysql_fetch_array($result2);
		
					 	$reference = $row["reference"];
						$tel = $row["tel"];
						$gsm1 = $row["gsm1"];
						$gsm2 = $row["gsm2"];
						
						if (($tel!="Pas de téléphone"))
						{
							if (!empty($tel))
								{
									echo"<font color='#FFFFFF'><b><u>Tél.</u>$tel</b></font>";
								}	
						}
					echo"<br>";
						if (($gsm1!="Pas de GSM"))
						{
							if (!empty($gsm1))
								{
									echo"<font color='#FFFFFF'><b><u>GSM 1.</u>$gsm1</b></font>";
								}	
						}
					echo"<br>"; 
						if (($gsm2!="Pas de GSM"))
						{
							if (!empty($gsm2))
								{
									echo"<font color='#FFFFFF'><b><u>GSM 2.</u>$gsm2</b></font>";
								}	
						}
					echo"</font>
						</td>
						<td bgcolor='$color' width='106' align='center' class='txt1'><font color='#FFFFFF'>&nbsp;<b>Prix :<br>";
										
						if ($prix != 0)
							
							echo"$prix</b></font></td>";
						else
							
							echo"N.D</b></font></td>";
					  echo"</tr>
					</table>";
								
					}
echo "<table align=\"center\" width=\"479\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
	echo"<tr>";
		//echo"<td align=\"left\" class='menuc'>";
			
			
		echo"</td>";
	echo"</tr>";
echo"</table>";
        
        
       
         // on libère l'espace mémoire alloué pour cette requête 
         mysql_free_result ($res); 
         echo '<table><br />'; 
       
         // on affiche enfin notre barre<br> 
         echo 'pages : '; 
         echo '<span>'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span>'; 
      } 
      // on libère l'espace mémoire alloué pour cette requête 
      mysql_free_result ($resultat); 
      // on ferme la connexion à la base de données. 
      mysql_close (); 
      ?> 
</body>
</head>
</html>
Notice: Undefined index: allcriteres in e:\easyphp1-8\www\centraleimmo\moteurRech.php on line 15

Notice: Undefined variable: finrequete in e:\easyphp1-8\www\centraleimmo\moteurRech.php on line 33

Posté : 29 oct. 2005, 15:19
par jeff
salut
allcritere n'existe pas et finrequete n'est pas initialiser

Posté : 29 oct. 2005, 15:25
par Truc
allcritere n'existe pas et finrequete n'est pas initialiser
Voila en gros c'est ça :wink:

"allcriteres" est certainement une case a cochée et donc si elle n'est pas cochée elle n'esistera pas sous forme de POST.
ajoute ce test:
$allcriteres=isset($_POST['allcriteres']) ? $_POST['allcriteres'] : "";
Si la case est cochée donc variable POST existe, on l'affecte a $allcriteres sinon on affecte une valeur par défaut (ici "")

et initialise
$finrequete="";
mais son utilité m'échape un peu :-k

Posté : 29 oct. 2005, 15:29
par StarT
Merci beaucoup pour votre aide, voilà ces 2 problèmes sont resolus mnt j'ai ce msg d'erreur :
Erreur SQL !
SELECT * FROM achat WHERE 8 Pièces LIKE '%none%' ORDER BY prix LIMIT 0,10
Erreur de syntaxe près de 'Pièces LIKE '%none%' ORDER BY prix LIMIT 0,10' à la ligne 1

Posté : 29 oct. 2005, 15:32
par jeff
regadarde ce bout la ca correspond a pas grand chose
WHERE 8 Pièces
j'ai pas regarder tes condition mais a mon avis c'est pas le resultat que tu espere

Posté : 29 oct. 2005, 15:37
par StarT
regadarde ce bout la ca correspond a pas grand chose
WHERE 8 Pièces
j'ai pas regarder tes condition mais a mon avis c'est pas le resultat que tu espere
Oui c'est pas ce resultat que j'espere ! j'ai rien choisis comme valeur dans les listes déroulantes, ce code devait m'afficher toutes les annonces puisque aucun critére n'a été selectionné :?

Posté : 29 oct. 2005, 15:40
par Truc
voila une proposition de code, un peu arrangé:
$sql="select * from achat where location='".$radionchk."'";
 
$operateur= ($allcriteres == "oui") ? " AND " : " OR ";

if ($pays_combo != "0")
    {
        $sql.= $operateur." pays like '%".$pays_combo."%' ";
    }
if ($sub_ville != "0")
    {
        $sql.= $operateur." ville like '%".$sub_ville."%' ";
    }
if ($sub_type_achat != "0")
{
    $sql.= $operateur." type_achat like '%".$sub_type_achat."%' ";
}
if ($sub_type_logement != "0")
    {
        $sql.= $operateur." type_logement like '%".$sub_type_logement."%' ";
    }
if ($sub_type_logement != "0")
    {
        $sql.= $operateur." meuble like '%".$meublier."%' ";
    } 

$debut= (isset($_GET['debut'])) ? addslashes($_GET['debut']) : 0;	
	
$sql.= ' ORDER BY prix LIMIT '.$debut.','.$nb_affichage_par_page;

echo '.<p>.'$sql.'</p>'; //ligne pour afficher la requete génèrée, juste pour verification

$res = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
je suis parti sur la base qu'une recherche comporte obligatoirement le champ location (location - vente ) qui a la base est un type radio, donc devra avoir une séléction de faite.

Posté : 29 oct. 2005, 15:49
par StarT
je vais le tester toute de suite ! merci infiniment !

Posté : 29 oct. 2005, 15:55
par StarT
cette ligne ne marche pas truc
echo '.<p>.'$sql.'</p>';