Moteur de recherche multicritère

Par azizs, il y a 11 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 11 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 11 ans

OK merci Huggy je vais essayer

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

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

Huggy, il y a 11 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.