Bonjour,

je suis en train de developper un moteur de recherche multi critère dans son fonctionnement est le suivant :

Ma Bdd comporte des critères :

id
total_area
nb_rooms
nb_parking
budget
budget_1
budget_2
budget_3
budget_4
budget_5
budget_6
budget_7
budget_8
budget_9
budget_10
budget_11
neighborhood
neighborhood_1
neighborhood_2
neighborhood_3
neighborhood_4
neighborhood_5
neighborhood_6
good_quality

Mon bute est de faire une recherche automatique, je m’explique j'ai dans mon l’url des critère :
prix,
nombre de chambre,
lieux,
Qualité du bien etc…
ce sont le information client (ce qu'il recherche).

Mais j’ai besoin que de cela pour la recherche.

On a le lien comme cela
http://site.fr/seach_result_acquereur_admin.php?id=35&budget=0&budget_1=199999&budget_2=0&budget_3=0&budget_4=0&budget_5=0&budget_6=0&budget_7=0&budget_8=0&budget_9=4999999&budget_10=0&budget_11=0&neighborhood=Paris&neighborhood_1=&neighborhood_2=&neighborhood_3=&neighborhood_4=&neighborhood_5=&neighborhood_6=&nb_rooms=3&good_quality=Moyen

je réalise cela pour faire ma recherche

SELECT * FROM db_client, db_acquerer WHERE budget = '. $_GET[‘price'] . '

Cela fonctionne très bien comme ceci.

Mais comme faire pour rentrée les autres column (budget_1, budget_3 etc… jusqu’à budget_11 puis neighborhood jusqu'à neighborhood_6).
et je dois faire a la suite une recherche sur les critères suivant aussi

SELECT * FROM db_client, db_acquereur WHERE budget = '. $_GET[‘price'] . ‘ AND budget_1 = '. $_GET[‘price'] . ‘ AND budget_2 = '. $_GET[‘price'] . ‘ ETC … JUSQU’A AND budget_11 = '. $_GET[‘price'] . ‘ AND good_quality LIKE '. $_GET[‘good_quality'] . ‘ AND neighborhood LIKE'. $_GET[‘neighborhood '] . ‘ ETC … JUSQU’A AND neighborhood_6 LIKE'. $_GET[‘neighborhood_6'] . ‘ AND nb_rooms='. $_GET[‘good_quality'] . ‘

Mais cela ne fonctionne pas.
Comment je dois faire, j'espère être claire.
Pouvez-vous m’aider merci a vous.

8 réponses


qwerus
Réponse acceptée

Bonjour,

Si tu bloques toujours sur la requête de récupération des données, tu devrais afficher la requête complète 'compilée'.
J'ai l'impression qu'elle n'est pas correct.
Tu écris : AND neighborhood LIKE'. $_GET[‘neighborhood ']
Une fois "compilée", pour $_GET[‘neighborhood '] = 'Paris', tu va obtenir : AND neighborhood LIKEParis, ce qui n'est pas valide.
Il faut donc que tu écrivent AND neighborhood LIKE '" . $_GET[''neighborhood] . "'.

Il en dégage un autre problème, dans la contruction d'une requête en PHP, c'est l'injection SQL.

Si par ex, $_GET[''neighborhood] = '"; TRUNCATE TABLE users; --', ta requête va supprimer tout le contenu de la table users.
Principe de base : NEVER TRUST USER INPUT.
Je te conseille de regarder du côté des requêtre préparées.

J'espère avoir répondu correctement à ta question.

Bonjour azizs,
Tu dois composer ta requete SQL en y ajjoutant tes critères un par un

$req = "SELECT * FROM db_client, db_acquereur WHERE ";
$premier_critere = true;
if (isset($_GET['price'])) {
    if (!$premier_citere) {
        $req .= " AND ";
        $premier_critere = false;
       }
   $req .= "budget11=" . $_GET['price'];
}
...
// repeter pour chaque variable

Maintenant si tu veux automatiser toutes tes variables, tu peux te créer un tableau avec les noms de variable et les noms des champs à comparer
Si tu as besoin de gérer plusieurs jointures, tu utilises le même principe pour gérer tes jointures

azizs
Auteur

OK merci Huggy je vais essayer

azizs
Auteur

Désoler je n'arrive pas à le faire fonctionner cela. Pouvez-vous m'aider.
voilà cela ce que j'ai fait

$req = "SELECT * FROM db_purchaser WHERE ";
$premier_critere = true;

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget= '. $GET_PRICE['price'] . '";
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_1= '. $GET_PRICE['price'] . '";
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_2= '. $GET_PRICE['price'].' ";
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_3= '. $GET_PRICE['price'].' ";
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_4= '. $GET_PRICE['price'].' ";
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_5= '. $GET_PRICE['price'].' ";
}

while ($donnees = $req->fetch())

et j'affiche le resultat comme cela :

<tbody>
<tr>
<td><?php echo $donnees['neighborhood']; ?></td>
<td><?php echo $donnees['neighborhood']; ?></td>
<td><?php echo $donnees['building']; ?></td>
<td><?php echo $donnees['nb_rooms']; ?></td>
<td><?php echo $donnees['nb_parking']; ?></td>
<td><?php echo $donnees['total_area']; ?></td>
<td><?php echo $donnees['view']; ?></td>
<td><?php echo $donnees['good_quality']; ?></td>
</tr>
<?php
}

$reponse->closeCursor(); // Termine le traitement de la requête

?>

En fait $_GET['price' ] n'existe pas , il faut prendre $_GET['budget_1'] $_GET['budget_2'] ...

et le $GET_PRICE c'est une faute de frappe, il fallait lire

$_GET['price']

(j'ai éditer le code donné précédemment)

azizs
Auteur

Bonsoir,
J'ai réaliser vos modification mes cela ne veux pas foctionner j'ai l'erreur suivante :
Fatal error: Call to a member function fetch() on a non-object in /home/www/site.fr/administration/seach_result_admin.php on line 437

ligne 437 c'est ça :
....
while ($donnees = $req->fetch())
.....
je sais pas ou j'ai fait une erreur, voilà mon code :
.........
<table cellpadding="0" cellspacing="0" width="100%" class="tDefault checkAll tMedia" id="checkAll">
<thead>
<tr>
<td width="5">Ref.</td>
<td width="5">Budget MIO€</td>
<td width="5">Lieux</td>
<td width="5">Immeuble</td>
<td width="5">Nombre de chambre</td>
<td width="5">Nombre de parking</td>
<td width="5">Total habitable M2</td>
<td width="5">Vue</td>
<td width="5">Qualité</td>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="14">
<div class="itemActions">
</div>
</td>
</tr>
</tfoot>
<?php
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=serveur;dbname=site','root','');
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}

// Si tout va bien, on peut continuer

$req = "SELECT * FROM db_purchaser, db_product WHERE ";
$premier_critere = true;

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget=" . $_GET['price'];
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_1=" . $_GET['price'];
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_2=" . $_GET['price'];
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_3=" . $_GET['price'];
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_4=".$_GET['price'];
}

if (isset($_GET['price'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "budget_5=" .$_GET['price'];
}

if (isset($_GET['neighborhood'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "neighborhood=" .$_GET['neighborhood'];
}

if (isset($_GET['neighborhood_1'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "neighborhood_1=" .$_GET['neighborhood_1'];
}
if (isset($_GET['neighborhood_2'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "neighborhood_2=" .$_GET['neighborhood_2'];
}

if (isset($_GET['neighborhood_3'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "neighborhood_3=" .$_GET['neighborhood_3'];
}

if (isset($_GET['neighborhood_4'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "neighborhood_4=" .$_GET['neighborhood_4'];
}

if (isset($_GET['neighborhood_5'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "neighborhood_5=" .$_GET['neighborhood_5'];
}

if (isset($_GET['neighborhood_6'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere =false;
}
$req .= "neighborhood_6=" .$_GET['neighborhood_6'];
}

if (isset($_GET['good_quality'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "good_quality=" .$_GET['good_quality'];
}

if (isset($_GET['nb_rooms'])) {
if (!$premier_citere) {
$req .= " AND ";
$premier_critere = false;
}
$req .= "nb_rooms=" .$_GET['nb_rooms'];
}
while ($donnees = $req->fetch())

{
?>
<tbody>
<tr>
<td>
<a href="purcha_en.php?id=<?php echo $donnees['id_customer']; ?>&budget=<?php echo $donnees1['budget']; ?>
&budget_1=<?php echo $donnees1['budget_1']; ?>&budget_2=<?php echo $donnees1['budget_2']; ?>
&budget_3=<?php echo $donnees1['budget_3']; ?>&budget_4=<?php echo $donnees1['budget_4']; ?>
&budget_5=<?php echo $donnees1['budget_5']; ?>&budget_6=<?php echo $donnees1['budget_6']; ?>
&budget_7=<?php echo $donnees1['budget_7']; ?>&budget_8=<?php echo $donnees1['budget_8']; ?>
&budget_9=<?php echo $donnees1['budget_9']; ?>&budget_10=<?php echo $donnees1['budget_10']; ?>
&budget_11=<?php echo $donnees1['budget_11']; ?>&nb_rooms=<?php echo $donnees['nb_rooms']; ?>
&neighborhood=<?php echo $donnees['neighborhood']; ?>&view=<?php echo $donnees['view']; ?>
&view_1=<?php echo $donnees['view_1']; ?>&view_2=<?php echo $donnees['view_2']; ?>
&view_3=<?php echo $donnees['view_3']; ?>&good_quality=<?php echo $donnees['good_quality']; ?>
&neighborhood=<?php echo $donnees['neighborhood']; ?>
&neighborhood_1=<?php echo $donnees['neighborhood_1']; ?>
&neighborhood_2=<?php echo $donnees['neighborhood_2']; ?>
&neighborhood_3=<?php echo $donnees['neighborhood_3']; ?>
&neighborhood_4=<?php echo $donnees['neighborhood_4']; ?>
&neighborhood_5=<?php echo $donnees['neighborhood_5']; ?>
&neighborhood_6=<?php echo $donnees['neighborhood_6']; ?>" title="" >
<?php echo $donnees['name']; ?> <?php echo $donnees['firstname']; ?></a>
</td>
<td>
<div><?php
if ($donnees['budget'] == 2999999) {
echo "1 - 3";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_1'] == 59999) {
echo "3 - 6";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_2'] == 99999) {
echo "6 - 10";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_3'] == 149999) {
echo "10 - 15";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_4'] == 199999) {
echo "15 - 20";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_5'] == 249999) {
echo "20 - 25";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_6'] == 299999) {
echo "25 - 30";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_7'] == 349999) {
echo "30 - 35";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_8'] == 399999) {
echo "35 - 40";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_9'] == 449999) {
echo "40 - 45";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_10'] == 499999) {
echo "45 - 50";
} else {
echo "";
}
?></div>
<div><?php
if ($donnees['budget_11'] == 500001 ) {
echo "> 50";
} else {
echo "";
}
?></div>
</td>
<td><?php echo $donnees['neighborhood']; ?></div>
<div><?php echo $donnees['neighborhood_1']; ?></div>
<div><?php echo $donnees['neighborhood_2']; ?></div>
<div><?php echo $donnees['neighborhood_3']; ?></div>
<div><?php echo $donnees['neighborhood_4']; ?></div>
<div><?php echo $donnees['neighborhood_5']; ?></div>
<div><?php echo $donnees['neighborhood_6']; ?></div>
</td>
<td><?php echo $donnees['building']; ?></td>
<td><?php echo $donnees['nb_rooms']; ?></td>
<td><?php echo $donnees['nb_parking']; ?></td>
<td><?php echo $donnees['total_area']; ?></td>
<td><?php echo $donnees['view']; ?>
<div><?php echo $donnees['view_1']; ?></div>
<div><?php echo $donnees['view_2']; ?></div>
<div><?php echo $donnees['view_3']; ?></div>
</td>
<td><?php echo $donnees['good_quality']; ?></div>

                </tr>      

<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</body>
</html>

Peux-tu m'aider je comprend pas d'ou vient l'erreur, help.

Merci a toi.

azizs
Auteur

Bonjour,
Quelqu'un peux m'aider merci a vous.

Ta variable $req, ce n'est qu'une chaine SQL
Pour exécuter la requête tu dois appeller la méthode query de ta bd

$rows = $bdd->query($req);
foreach($rows as $row) {
    print $row['neighborhood'];
   }