Recherche multicritères

Eléphanteau du PHP | 19 Messages

12 déc. 2008, 15:04

Bonjour,
Je viens de me lancer dans un petit projet personnel, une page php pour afficher la liste des fournisseurs de mon entreprise "par dénomination", par "localité" et par "activité".

Bon, mon souci c'est de créer une page où je peux facilement chercher un fournisseur soit par son nom, sa localité et son activité.

J'ai créer un formulaire avec une zone de texte pour la denomination, une menu deroulant pour l'activité et un autre menu deroulant pour la localité.

Je veux que je puisse chercher par activité seulement (ça veut dire selectionner FOURNITURES DE BUREAUX dans le menu - localité = vide et denomination=vide) ou par localité seulement ou par denomination seulement aussi.
ou avec des combinaisons de 2 par 2 ...

c'est à ce niveau que je bloque, j'ai pu faire la recherche par un seul critère, mais pour plusieurs avec la possibilitéque 1 ou 2 champs soient vides Non :s

Ce que je cherche à faire me semble pareil aux sites de l'immobilier où on peut recherche un appart par exemple qui se trouve en sud de france, au nord ...

J'ai besoin des conseils pour me guider dans mon travail.

Je pense que j'étais assez clair. :)

Merci beaucoup.

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Mammouth du PHP | 1353 Messages

12 déc. 2008, 15:11

Bonjour,

Ou sont stockées les informations de tes fournisseurs ? Dans une base de données ?

Si tel est le cas il suffit de faire des "SELECT" avec une ou plusieurs conditions selon les valeurs postées par ton formulaire...

Montre nous déjà le code qui te permet de rechercher avec un critère et nous pourrons t aider à le faire évoluer, car là je pense que nous n'avons pas assez d'éléments.
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphanteau du PHP | 19 Messages

12 déc. 2008, 15:18

Oui :)

Jusqu'à maintenant je suis arrivé à ça :
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("frs_db"); // Sélection de la base
$i = 0;
$sql = "SELECT * FROM fournisseurs WHERE ";

if ( isset($_POST['denomination']) ) {
     $sql .= "denomination = '".$_POST['denomination']."'";
     $i++;
}

if ( isset($_POST['activite']) ) {
     if ( $i > 0 ) $sql .= ' AND ';
     $sql .= "activite = '".$_POST['activite']."'";
     $i++;
}

if ( isset($_POST['localite']) ) {
     if ( $i > 0 ) $sql .= ' AND ';
     $sql .= "localite = '".$_POST['localite']."' ";
     $i++;
}

mysql_query($sql) or die (mysql_error());
 
while ($donnees = mysql_fetch_array($sql) )
{
?>
    <p>
    <strong>Fournisseur</strong> : <?php echo $donnees['denomination']; ?><br />
    <strong>Son activité</strong> : <?php echo $donnees['activite']; ?><br />
    <strong>Sa localité</strong> : <?php echo $donnees['localite']; ?><br />

   </p>
<?php
}
 
mysql_close(); // Déconnexion de MySQL


?>
Je ne sais pas si ça marche ou pas, de toute façon ça me donne maintenant cette erreur :

arning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\wamp\www\xxx\result.php on line 65

la ligne 65 est celle là :

while ($donnees = mysql_fetch_array($sql) )

Merci.

Mammouth du PHP | 1353 Messages

12 déc. 2008, 15:38

Tu fais un mysql_fetch_array de ta requete et non pas du mysql_query, ce qui ne peut pas marcher...
$sql = "SELECT ...";

$q = mysql_query($sql);

while($r = mysql_fetch_array($q)) {
//
}

Conseils aussi :

Attention, une variable peut etre existante (isset = true) mais vide, auquel cas ta requete va forcement planter.

Je te conseil d'utiliser la fonction empty() à la place, qui te renvoie

false si la variable existe et n'est pas vide
true si la variable est vide ou n'existe pas

ainsi avec un if(!empty($var)) tu évites les problemes.

De plus tu devrais prévoir le cas ou aucune variable n'est définie, auquel cas ta requete donnera

"SELECT ... WHERE" ce qui ne marchera pas .

Je te conseil de prévoir aussi ce cas.

Enfin, par mesure de précaution tu devrais utiliser mysql_escape_string($_POST['variable']) pour éviter les injections SQL meme si il ne s'agit ici que d'un select :)

Pour débugger plus facilement essaye de faire un echo $sql; et commenter le mysql_query() temporairement pour voir ce qui ne va pas dans la requete...

En espérant que cela t'aide...
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Eléphanteau du PHP | 19 Messages

12 déc. 2008, 15:58

Merci beaucoup guilt92,

maintenant je reçois pas d'erreur, mais je suis obligé de remplir les 3 champs avec les valeurs exacts pour que je reçoive une réponse ! par exemple qu'après avoir rempli XATA ET Fournitures diverses ET localité que je recoive une réponse, sinon si l'un des champs est vide, ça donne rien :s ç'est pas vraiment ce que je cherche :s:s

sinn avec if(!empty($var)) je vois pas clairement comment m'en servir, je suis assez débutant ! je vais essayer de me documenter, je veux bien une aide par rapport à ce que j'ai présenté !

voila quelques enregistrements de ma table :

denomination activite localite
XATA Fournitures diverses Nantes
BATAX Fournitures diverses Paris
Chill tours Agence de voyage Bordeaux
BUROTA Fournitures de bureau Nantes
NABEX Matières premières Paris
CHILL OUT COM Publicité Bordeaux
CO COM Publicité Nantes


Merci :)

Eléphant du PHP | 254 Messages

12 déc. 2008, 16:19

Salut,

Comme guilt92 te l'a dit, met un
echo "<br>$sql<br>";
Juste avant ton mysql_query

Ca va t'aider a vérifier la requete générée, et tu t'appercevras surement qu'il y a une erreur dans ton traitement de variables POST

Et si ca marche toujours pas tu peux nous poster ce que tu affiche avec cet echo, qu'on puisse t'aider a résoudre

Eléphanteau du PHP | 19 Messages

12 déc. 2008, 16:32

ça donne ça :
SELECT * FROM fournisseurs WHERE denomination = '' AND activite = 'Fournitures diverses' AND localite = '' 
Je pense que c'est correct Non ?

je ne sais pas ou est le problème dans la requete !

Eléphant du PHP | 254 Messages

12 déc. 2008, 19:46

Le probleme dans la requete c'est qu'il essaye de sortir les enregistrements dont la dénomination et la localité sont vide, ce qui est incorrect, d'apres ce que tu nous a dit

La requete dans ce cas devrait etre

Code : Tout sélectionner

SELECT * FROM fournisseurs WHERE activite = 'Fournitures diverses';
Les champs qui ne sont pas renseignés par l'utilisateur ne doivent pas apparaitre dansla requete

Eléphanteau du PHP | 19 Messages

12 déc. 2008, 23:50

oui

Et donc comment remerdier à ce probème ?

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 254 Messages

13 déc. 2008, 09:58

Ok donc tu te doutes bien que c'est au niveau du traitement de tes variables et de la construction de ta requete qu'il faut intervenir, et la il y a plusieurs méthodes, par exemple:
// tableau associatif servant a regrouper les conditions valides ( isset ET différent de chaine vide )
$tabCondition = array();

if (isset($_POST['denomination']) && $_POST['denomination']!='')
	$tabCondition['denomination'] = $_POST['denomination'];
if (isset($_POST['activite']) && $_POST['activite']!='')
	$tabCondition['activite'] = $_POST['activite'];
if (isset($_POST['localite']) && $_POST['localite']!='')
	$tabCondition['localite'] = $_POST['localite'];

// parcours du tableau pour écrire la chaine et placer les AND
$i=0;
foreach ($tabCondition as $key=>$value)
{
	$i==0?"":"AND";
	$condition = " $key=$value ";
	$i++;
}

// création de la requete
$sql = "SELECT * FROM fournisseurs WHERE $condition"; 

Eléphanteau du PHP | 19 Messages

13 déc. 2008, 13:18

Merci beaucoup furiouslol pour ta réponse assez detaillée.

j'ai essayer le code ça me donnais au début des erreurs :

j'ai mis des ' ' à $value et y en a plus :
    $condition = " $key='$value' "; 
Mais il y a un problème dans le code je pense :s:s :

quand je choisi un seul critère ça marche tranquille.
quand je choisi 2 critères ça ne marche pas vraiment :

Exemple : la requete générée en choisissant denomination='fournitures diverses' et localite='nantes' :

SELECT * FROM fournisseurs WHERE localite='nantes' 
Merci pour votre aide encor une fois.

Eléphant du PHP | 254 Messages

13 déc. 2008, 14:20

Ha oui autant pour moi y a deux erreurs :p

Bien vu pour les apostrophes, sinon l'autre erreur c'est que j'écrase $condition au lieu de la concaténer avec elle meme
// tableau associatif servant a regrouper les conditions valides ( isset ET différent de chaine vide ) 
$tabCondition = array(); 

if (isset($_POST['denomination']) && $_POST['denomination']!='') 
    $tabCondition['denomination'] = $_POST['denomination']; 
if (isset($_POST['activite']) && $_POST['activite']!='') 
    $tabCondition['activite'] = $_POST['activite']; 
if (isset($_POST['localite']) && $_POST['localite']!='') 
    $tabCondition['localite'] = $_POST['localite']; 

// parcours du tableau pour écrire la chaine et placer les AND 
$i=0; 
$condition = "";
foreach ($tabCondition as $key=>$value) 
{ 
    $i==0?"":"AND"; 
    $condition .= " $key='$value' "; 
    $i++; 
} 

// création de la requete 
$sql = "SELECT * FROM fournisseurs WHERE $condition";
Ca devrait aller

Eléphanteau du PHP | 19 Messages

13 déc. 2008, 14:29

SELECT * FROM fournisseurs WHERE activite='Fournitures diverses' localite='nantes' 

ça n'ajoute pas le AND et ça donne ça :
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'localite='nantes'' at line 1

!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 déc. 2008, 15:39

Je propose une réécriture de la boucle foreach comme ça:
// parcours du tableau pour écrire la chaine et placer les AND 
$condition = "";
foreach ($tabCondition as $key=>$value)  { $condition .= " AND $key='$value' " ; }

// création de la requete 
$sql = "SELECT * FROM fournisseurs WHERE 1 $condition";
Ce qui va donner :
SELECT * FROM fournisseurs WHERE 1 si la condition est vide
et
SELECT * FROM fournisseurs WHERE 1 AND .... AND .... quand il y a 1 ou plusieurs conditions.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 19 Messages

13 déc. 2008, 15:46

Merciiiiiiiiii infiniment sadeq ! ça marche ! :)

Il reste un problème :

Je veux integrer les %...% pour la denomination, l'utilisateur peut ne pas taper le nom exact du fournisseurs, je l'es integrer dans %$_POST['denomination'] ça marche pas !

Merci encore une fois.
Modifié en dernier par ChiLL OuT le 15 déc. 2008, 21:30, modifié 2 fois.