Recherche multicritères

ViPHP
AB
ViPHP | 5818 Messages

13 déc. 2008, 16:01


Eléphanteau du PHP | 19 Messages

13 déc. 2008, 16:22

Merci AB pour le lien!

Je viens de lire, chui super debutant j'ai pas très bien saisi où mettre LIKE % surtout avec la concaténation qu'on m'as proposé !

S'il y aurai plus d'éclaircissement je suis preneur.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 déc. 2008, 20:08

T'avais commencé la bonne réponse toi même pour le like. Mais voici la bonne formulation des changements dans ton code:

Au niveau des conditions:
if (isset($_POST['denomination']) && $_POST['denomination']!='') 
    $tabCondition['denomination'] = "'%" . $_POST['denomination'] . "%'";
Au niveau de la requête SQL, il faut remplacer = par LIKE (ce qui marchera aussi pour les autres)
// parcours du tableau pour écrire la chaine et placer les AND 
$condition = "";
foreach ($tabCondition as $key=>$value)  { $condition .= " AND $key LIKE  '$value' " ; }

// création de la requete 
$sql = "SELECT * FROM fournisseurs WHERE 1 $condition";
ou bien, pour ne pas généraliser sur toutes les conditions possibles, tu dois élaborer la bonne condition au niveau des if et éliminer le foreach :
// Création des conditions du WHERE
$condition = ""; 

if (isset($_POST['denomination']) && $_POST['denomination']!='') 
    $condition .= " AND denomination LIKE '%" . $_POST['denomination'] . "%' ";

if (isset($_POST['activite']) && $_POST['activite']!='') 
    $condition .= " AND  activite = '" . $_POST['activite'] . "' ";

if (isset($_POST['localite']) && $_POST['localite']!='') 
    $condition .= " AND localite = '" . $_POST['localite'] . "' "; 

// création de la requete 
$sql = "SELECT * FROM fournisseurs WHERE 1 $condition";
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 170 Messages

13 déc. 2008, 20:27

salut,

une autre en reprenant les tests de furiouslol :
<?php
$_POST['denomination']='aaa';
$_POST['activite']='bbb';
$_POST['localite']='ccc';

if (isset($_POST['denomination']) && $_POST['denomination']!='')
	$where['denomination'] = 'denomination LIKE \'%'.$_POST['denomination'].'%\'';
if (isset($_POST['activite']) && $_POST['activite']!='')
	$where['activite'] = 'activite=\''.$_POST['activite'].'\'';
if (isset($_POST['localite']) && $_POST['localite']!='')
	$where['localite'] = 'localite=\''.$_POST['localite'].'\'';

$sql = 'SELECT * FROM fournisseurs WHERE '.join(' AND ', $where);

echo $sql;
?>

Eléphanteau du PHP | 19 Messages

13 déc. 2008, 22:55

Merciiiiiiiiiii ça marche ennnfin tn dernier code 'blof' :)

Bon je sais que j'ai énormément dérangé mais je poserai 2 autres questions tout de même :D :

1 - pour la liste déroulante de activite et localité ! le choix 'selected' est vide :

Code : Tout sélectionner

<option selected="selected" value=""/></option>
si je met

Code : Tout sélectionner

<option selected="selected" value="*"/>Toutes</option>
je vais integrer ça dans :
if (isset($_POST['denomination']) && $_POST['denomination']!='') 
??

2 - je veux afficher mes résultats de la sorte :

Image

Le souci, je ne sais vraiment pas comment mettre le lien des logos stockés dans le FTP dans ma base de donnée et que chaque logo soit relié avec le fournisseur correspondant. Ainsi que le code php que je vais devoir utilisé avec.

Je vous remercie infiniment!

((( Je viens de découvrir le forum il y a quelque jours et voilà que je reçois des réponses pertinentes au problème. Je suis amplement satisfait.

Merci encore une fois. )))

Eléphant du PHP | 170 Messages

14 déc. 2008, 06:12

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.
dans mon code précédent, je n'avais pas intégré le cas où toutes les variables sont vides.

en reprenant l'idée du "WHERE 1" :
<?php
$_POST['denomination']='';
$_POST['activite']='';
$_POST['localite']='';

$where['tout'] = '1';

if (isset($_POST['denomination']) && $_POST['denomination']!='')
	$where['denomination'] = 'denomination LIKE \'%'.$_POST['denomination'].'%\'';
if (isset($_POST['activite']) && $_POST['activite']!='')
	$where['activite'] = 'activite=\''.$_POST['activite'].'\'';
if (isset($_POST['localite']) && $_POST['localite']!='')
	$where['localite'] = 'localite=\''.$_POST['localite'].'\'';

$sql = 'SELECT * FROM fournisseurs WHERE '.join(' AND ', $where);

echo $sql;
?>
pour ta question 1 :

Code : Tout sélectionner

<option selected="selected" value=""/>Toutes</option>
non ?

pour ta question 2 :
Dans ta table "fournisseurs" il faut que tu rajoutes un champ où tu stockeras le nom de l'image correspondant au logo.
Comme je ne comprends pas où tu bloques, je ne vois pas quoi expliquer ...

Eléphanteau du PHP | 19 Messages

14 déc. 2008, 16:12

Bon je parlerais de ma 2eme question après.

Pour la 1ere question: Le code que tu m'as donné m'affiche toujours :
SELECT * FROM fournisseurs WHERE 1 
Le code que tu as modifié ne marché deja pas chez moi :

<?php
$_POST['denomination']='aaa';
$_POST['activite']='bbb';
$_POST['localite']='ccc';

if (isset($_POST['denomination']) && $_POST['denomination']!='')
    $where['denomination'] = 'denomination LIKE \'%'.$_POST['denomination'].'%\'';
if (isset($_POST['activite']) && $_POST['activite']!='')
    $where['activite'] = 'activite=\''.$_POST['activite'].'\'';
if (isset($_POST['localite']) && $_POST['localite']!='')
    $where['localite'] = 'localite=\''.$_POST['localite'].'\'';

$sql = 'SELECT * FROM fournisseurs WHERE '.join(' AND ', $where);

echo $sql;
?>
il me renvoie cette erreur :

Code : Tout sélectionner

Notice: Undefined variable: where in C:\wamp\www\xxx\result.php on line 55 Warning: join() [function.join]: Invalid arguments passed in C:\wamp\www\xxx\result.php on line 55 SELECT * FROM fournisseurs WHERE 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 '' at line 1
et voila la ligne 55 :
$sql = 'SELECT * FROM fournisseurs WHERE '.join(' AND ', $where);
Ce qui marchais pour moi tranquille c'est ça :
// Création des conditions du WHERE
$condition = ""; 

if (isset($_POST['denomination']) && $_POST['denomination']!='') 
    $condition .= " AND denomination LIKE '%" . $_POST['denomination'] . "%' ";

if (isset($_POST['activite']) && $_POST['activite']!='') 
    $condition .= " AND  activite = '" . $_POST['activite'] . "' ";

if (isset($_POST['localite']) && $_POST['localite']!='') 
    $condition .= " AND localite = '" . $_POST['localite'] . "' "; 

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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

15 déc. 2008, 00:00

Voici un correctif:
<?php
// Déclaration du tableau $where
$where = array();

// Condition initiale d'un Where vrai
$where['tout'] = 1;

// Conditions pour Where
if (isset($_POST['denomination']) && $_POST['denomination']!='')
    $where['denomination'] = 'denomination LIKE \'%'.$_POST['denomination'].'%\'';

if (isset($_POST['activite']) && $_POST['activite']!='')
    $where['activite'] = 'activite=\''.$_POST['activite'].'\'';

if (isset($_POST['localite']) && $_POST['localite']!='')
    $where['localite'] = 'localite=\''.$_POST['localite'].'\'';

// Requête SQL
$sql = 'SELECT * FROM fournisseurs WHERE '. join(' AND ', $where);

echo $sql;
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 19 Messages

15 déc. 2008, 00:28

bonsoir,

Merci sadeq pour ta réponse mais je pense je ne me suis pas bien expliqué, quand je met le correctif ça me donne :
SELECT * FROM fournisseurs WHERE 1 AND activite='toutes' AND localite='toutes'
toutes n'existe pas dans la table, je veux qu'il affiche tous les enregistrements en fait, de activité si Toutes est selectionnée et toutes les localités si toues est selectionnée.

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

15 déc. 2008, 09:58

Hé ben, tu n'as qu'à pas inclure dans la condition Where les champs qui ont comme valeur : "toutes" comme ça tu diminuera le taux de filtrage et tu obtiendra plus d'enregistrements.

Tu dois ajouter ça dans la condition if de chaque champ de Where :

Exemple:
<?php
// Déclaration du tableau $where
$where = array();

// Condition initiale d'un Where vrai
$where['tout'] = 1;

// Conditions pour Where
if (isset($_POST['denomination']) && trim($_POST['denomination']) !='' && strtolower(trim($_POST['denomination'])) != 'toutes')
    $where['denomination'] = 'denomination LIKE \'%'.$_POST['denomination'].'%\'';

if (isset($_POST['activite']) && trim($_POST['activite']) !='' && strtolower(trim($_POST['activite'])) != 'toutes')
    $where['activite'] = 'activite=\''.$_POST['activite'].'\'';

if (isset($_POST['localite']) && trim($_POST['localite']) !='' && strtolower(trim($_POST['localite'])) != 'toutes')
    $where['localite'] = 'localite=\''.$_POST['localite'].'\'';

// Requête SQL
$sql = 'SELECT * FROM fournisseurs WHERE '. join(' AND ', $where);

echo $sql;
?> 
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 19 Messages

15 déc. 2008, 21:25

sadeq milles merciiii ! ça marche comme il faut ! :)

Pour ma questions précédente 2 :

Bon dans la table fournisseurs j'ajouterais bien un champs, je mettrais dedans le lien de l'image ?

http://...../xx.jpg ?

si oui, comment intégrer ça dans ton dernier code pour qu'il affiche le logo du fournisseurs correspondant!

Merci beaucoup encore une fois! j'ai déjà résolu un grand problème qui me préoccupais :)


..

ah un autre petit truc avec l'encodage des caractère, j'ai bien verifié dans ma base de donnée c'est du UTF8, mais ça m'affiche ceci dans la page du résultat :

Son activité : Mati�res premi�res

quand je vais dans Affichage > encodage des caractère > Occidental(ISO-8859-1) ça regle le probème des caratctère des données de la BDD mais ça modifie les accents ... des caractère du reste du site!

Merci ^^

Eléphant du PHP | 170 Messages

15 déc. 2008, 23:31

ChiLL OuT,

avant de parler de programmation PHP, est-ce-que tu sais quel doit être le code HTML au final ?

C'est la première chose à savoir.

Personnellement, je créerais un sous-répertoire "images" dans lequel se trouveraient tous les logos, et dans la table MySQL je stockerais uniquement le nom de de l'image ( par exemple xx.jpg )
Dans le code HTML on trouverait :

Code : Tout sélectionner

<img src="images/xx.jpg" alt="" />
Mais encore une fois, avant de te lancer dans la programmation, tu dois définir quel sera le code HTML de ta page.
( à mon humble avis )


--------------------------------------------------------------------------------------------

Pour tes problèmes d'encodage, c'est le sujet d'actualité :)

Divers -> PHPFrance -> Suggestion Tutoriel encodage utf-8 pour la faq
http://www.phpfrance.com/forums/voir_sujet-244765.php

Bonne lecture ...

Eléphanteau du PHP | 19 Messages

16 déc. 2008, 01:30

biensur que oui !

bon ce que je ne sait pas c'est comment dire avec PHP d'affecter chaque image au résultat correspondant!

merci

Eléphant du PHP | 170 Messages

16 déc. 2008, 07:26

D'après tes précédents posts :

- Tu as su extraire de ta table MySQL le nom du fournisseur, son activité, sa localité.
=> tu sais donc extraire le nom de l'image qui correspond à son logo. ( qui est dans le nouveau champ que tu viens de rajouter )

- Tu connais le code HTML qui doit être généré ( cf "biensur que oui !" )

- Tu connais la commande echo().

Tu n'as donc plus de problème.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

16 déc. 2008, 10:38

Tu avais dit que ta page HTML doit afficher ceci:
Image
En HTML, chaque image réservée au logo est écrite comme ça :

Code : Tout sélectionner

<img src="chemin et nom du fichier image" />
Supposons que le chemin des images/logos est un dossiers nommé "images" qui se trouve dans le même répertoire que la page HTML qui va présenter les logos.

Supposons aussi que les noms propres des images se trouvent dans la base de données, dans une table, dans une colonne nommée "url_logo"

Pour afficher un logo dans la page HTML, on doit placer donc chaque "url_logo" dans sa balise <img> dans l'attribut "src" sans oublier que le champ "url_logo" ne contient en principe que le nom propre de l'image du logo à laquelle il faut bien ajouter le chemin d'accès dans le disque qui est le dossier "images".

Voila le principe, voici la réalisation sous PHP:
// Après exécution de la requête SELECT qui (entre autres) retourne les "url_logo"
$resultat = mysql_query($sql);
while ($resultat && $row = mysql_fetch_array($resultat)
     // placer l'url_logo dans l'image HTML
    echo '<img src="images/' . $row['url_logo'] . '" />';

   // suite ... 
}
Dans cet exemple, les fichiers images correspondant aux url_logo sont stockés dans le dossier "images/", donc, dans la base de données, l'url_logo représente le nom propre du fichier image (sans le chemin d'accès) ce qui permet une certaine liberté de stockage des fichiers images sans devoir mettre à jour la base à cause du changement d'emplacement.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène