Moteur de recherche multicritère

Par azizs, il y a 10 ans


Base de données MySQL

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

Huggy, il y a 10 ans

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, il y a 10 ans

OK merci Huggy je vais essayer

azizs, il y a 10 ans

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

?>

Huggy, il y a 10 ans

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, il y a 10 ans

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, il y a 10 ans

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

Huggy, il y a 10 ans

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']; }
qwerus, il y a 10 ans

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.