Formulaire de saisie + recherche : option "tous"

Eléphant du PHP | 95 Messages

08 juil. 2005, 11:12

Je soumets à votre sagacité ce qui me semble être un "casse-tête" :

J'ai un formulaire de saisie où l'utilisateur doit entre autre faire des choix dans des listes déroulantes.
Dans ces listes, je souhaite mettre l'option "tous" afin que mon interface de recherche permette lors d'un choix particulier pour une liste de remonter, outre les enregistrements qui contiennent l'option sélectionnée, aussi ceux contenant l'indication "tous".

Exemple concret : l'utilisateur doit indiquer une région dans sa fiche d'inscription. Il peut choisir une région ou laisser sur l'option "toutes régions" afin que lorqu'un autre utilisateur fait une recherche sur une région particulière, sa fiche remonte quand même.

Quelqu'un a-t-il déjà résolu ce problème et comment ?

Merci par avance !

Mammouth du PHP | 1353 Messages

08 juil. 2005, 12:08

A ce moment la je pense qu'il faut que tu définisse une valeur pour Tous dans ta base de donnée, de sorte que cela fasse partie vraiment des choix.

Ensuite lors d'une recherche tu cherches à chaque fois dans la base non seulement la région voule par exemple mais aussi le mot "tous".

En fait pour chaque requete de recherche si la valeur "TOUS" est trouvée cela est considéré comme une valeur correcte.

par exemple une requete qui te donne $ligne a la fin
if($ligne['region']=='$region_choisie' || $ligne['region']=="tous")
echo $ligne['nom_utilisateur']
J'espere etre clair et répondre a ta question

Eléphant du PHP | 95 Messages

08 juil. 2005, 13:12

Je me suis sans doute mal exprimé. Ce n'est pas la recherche sur l'option "tous" qui me pose problème : j'ai résolu ce problème (cf. un autre de mes topics) ... C'est même l'inverse !

Formulaire de saisie :

Code : Tout sélectionner

<select name="region" class="select"> <option value="re01">Alsace</option> <option value="re02">Aquitaine</option> <option value="re03">Auvergne</option> <option value="re04">Basse Normandie</option> <option value="re05">Bourgogne</option> <option value="re06">Bretagne</option> <option value="re07">Centre</option> <option value="re08">Champagne-Ardennes</option> <option value="re09">Corse</option> <option value="re10">Dom-Tom</option> <option value="re11">Franche-Comté</option> <option value="re12">Haute-Normandie</option> <option value="re13">Ile-de-France</option> <option value="re14">Languedoc-Roussillon</option> <option value="re15">Limousin</option> <option value="re16">Lorraine</option> <option value="re17">Midi-Pyrénées</option> <option value="re18">Nord-Pas-de-Calais</option> <option value="re19">Pays de Loire</option> <option value="re20">Picardie</option> <option value="re21">Poitou-Charentes</option> <option value="re22">Provence-Alpes-Cote d'Azur</option> <option value="re23">Rhone-Alpes</option> <option value="re24">International</option> <option value="rezz">Toutes régions</option></select>
C'est la valeur à attribuer à "tous" qui me pose problème. Quelle valeur lui attribuer pour que si on fait une recherche particulière sur Picardie, l'enregistrement contenant la valeur "rezz" soit pris en compte au même titre que la valeur "re20".

Je précise que dans l'interface de recherche l'option "Tous" a pour valeur "rezz", retraité en tant que "re%" et la recherche s'effectue bien sur donc sur toutes les régions...

Mammouth du PHP | 1353 Messages

08 juil. 2005, 13:40

Mais alors pourquoi ne pas utiliser le || (ou) au moment de la recherche ?
Tu pourrais poster le code de ta recherche pliz ?

Eléphant du PHP | 95 Messages

08 juil. 2005, 14:22

Le voilà :

// Pour rechercher sur l'option "tous"
$VARfonction = $_POST['VARfonction'];
$VARregion = $_POST['VARregion'];
$VARtype_offre = $_POST['VARtype_offre'];
$VARformation = $_POST['VARformation'];
if ($VARfonction == "fczz") $VARfonction="fc%";
if ($VARregion == "rezz") $VARregion="re%";
if ($VARtype_offre == "cazz")  $VARtype_offre="ca%";
if ($VARformation == "fozz") $VARformation="fo%";
// recherche avec troncature et opérateur inter-mot implicite "ET" pour le BOOLEAN MODE de la recherche full text
$recherche = $_POST['recherche'];
if ($recherche != "") // SI LE CHAMP RECHERCHE N'EST PAS VIDE
{
$liste_cles = explode(" ", $recherche);  // on mets les mots saisis dans un tableau
$liste = array(); // on instancie le tableau
foreach($liste_cles as $cle)  
{ 
    $cle = "+".$cle."*"; // ajout de l'opérateur intermot ET et de la troncature à droite pour chaque mot
	array_push($liste, $cle); // on met les mots dans le tableau instancié
} 
$liste_recherche = implode(" ", $liste);  // passage du tableau en chaine de caractères et ajout de l'espace entre chaque mot clé

$maxRows_Recordset1 = 50;
$pageNum_Recordset1 = 0;
if (isset($_GET['pageNum_Recordset1'])) {
  $pageNum_Recordset1 = $_GET['pageNum_Recordset1'];
}
$startRow_Recordset1 = $pageNum_Recordset1 * $maxRows_Recordset1;

mysql_select_db($database_emploi, $emploi);
$query_Recordset1 = "SELECT ID_CAND, DATE, INTITULE, NOM, PRENOM, FORMATION FROM candidatures, formation WHERE MATCH (CV, INTITULE, MOTIVATION) AGAINST ('$liste_recherche' IN BOOLEAN MODE) AND Affiche=1 AND (candidatures.CODE_FONC LIKE '$VARfonction') AND (candidatures.CODE_FOR LIKE '$VARformation') AND (candidatures.CODE_REG LIKE '$VARregion') AND (candidatures.CODE_TYP LIKE '$VARtype_offre') AND candidatures.CODE_FOR = formation.CODE_FOR ORDER BY DATE DESC";
$query_limit_Recordset1 = sprintf("%s LIMIT %d, %d", $query_Recordset1, $startRow_Recordset1, $maxRows_Recordset1);
$Recordset1 = mysql_query($query_limit_Recordset1, $emploi) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);

}
else // SI LE CHAMP RECHERCHE EST VIDE
{
$maxRows_Recordset1 = 50;
$pageNum_Recordset1 = 0;
if (isset($_GET['pageNum_Recordset1'])) {
  $pageNum_Recordset1 = $_GET['pageNum_Recordset1'];
}
$startRow_Recordset1 = $pageNum_Recordset1 * $maxRows_Recordset1;

mysql_select_db($database_emploi, $emploi);
$query_Recordset1 = "SELECT ID_CAND, DATE, INTITULE, NOM, PRENOM, FORMATION FROM candidatures, formation WHERE Affiche=1 AND (candidatures.CODE_FONC LIKE '$VARfonction') AND (candidatures.CODE_FOR LIKE '$VARformation') AND (candidatures.CODE_REG LIKE '$VARregion') AND (candidatures.CODE_TYP LIKE '$VARtype_offre') AND candidatures.CODE_FOR = formation.CODE_FOR ORDER BY DATE DESC";
$query_limit_Recordset1 = sprintf("%s LIMIT %d, %d", $query_Recordset1, $startRow_Recordset1, $maxRows_Recordset1);
$Recordset1 = mysql_query($query_limit_Recordset1, $emploi) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);

}

Mammouth du PHP | 19672 Messages

08 juil. 2005, 23:10

J'ai beau relire la question dans tous les sens, je ne comprends pas vraiment quel est le problème :-k

Il y a toutefois une option que tu peux utiliser en ajoutant dynamiquement la clause de tri par région si (et seulement si) l'option choisie n'est pas "Toutes régions" commen ceci:
    $query_Recordset1 = "SELECT ID_CAND, DATE, INTITULE, NOM, PRENOM, FORMATION ".
                        "FROM candidatures, formation ".
                        "WHERE MATCH (CV, INTITULE, MOTIVATION) AGAINST ('$liste_recherche' IN BOOLEAN MODE) ".
                        "AND Affiche=1 ".
                        "AND (candidatures.CODE_FONC LIKE '$VARfonction') ".
                        "AND (candidatures.CODE_FOR LIKE '$VARformation') ";
    if($VARregion != "rezz")
    {
        $query_Recordset1.= "AND (candidatures.CODE_REG LIKE '$VARregion') ";
    }
    $query_Recordset1.= "AND (candidatures.CODE_TYP LIKE '$VARtype_offre') ".
                        "AND candidatures.CODE_FOR = formation.CODE_FOR ".
                        "ORDER BY DATE DESC";
Au passage, j'ai organisé l'écriture de la requête pour la rendre lisible en utilisant le moins possible la barre de défilement horizontale, c'est quand même plus facile.

Est-ce que ça répondrait à ta question ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 95 Messages

11 juil. 2005, 09:36

Ma question ne porte pas sur le fait de rechercher par exemple sur "toutes les régions". Le code posté plus haut vise à résoudre ce problème. Ce que je dois résoudre maintenant, c'est quand un un candidat souhaite se tagger sur "Toutes régions" et qu'un recruteur fait une recherche sur "Picardie" : il faut qu'il puisse retrouver le candidat qui postule sur "toutes régions"...

En y réflechissant je pense modifier les lignes :
if ($VARfonction == "fczz") $VARfonction="fc%"; 
if ($VARregion == "rezz") $VARregion="re%"; 
if ($VARtype_offre == "cazz")  $VARtype_offre="ca%"; 
if ($VARformation == "fozz") $VARformation="fo%"; 
en
if ($VARfonction == "fczz") 
{
$VARfonction="fc%" ;
}
else
{ $VARfonction= $VARfonction + "OR LIKE fczz" ;

Qu'en pensez-vous ?

Eléphant du PHP | 95 Messages

11 juil. 2005, 15:24

J'ai testé ma solution du dernier post :
if ($VARfonction == "fczz") 
{
$VARfonction="fc%";
}
else
{
$VARfonction= $VARfonction + " OR offres.CODE_FONC LIKE 'fczz'" ;
}
mais cela ne fonctionne pas... Je choisis de sortir toutes les annonces Marketing (fc09). Lorsque j'affiche la requête SQL après traitement, j'obtiens :

SELECT ID_OFFRE, DATE, INTITULE, REGION FROM offres,region WHERE Affiche=1 AND (offres.CODE_FONC LIKE '0') AND (offres.CODE_REG LIKE 're%') AND (offres.CODE_TYP LIKE 'ty%') AND offres.CODE_REG = region.CODE_REG ORDER BY DATE DESC

au lieu de

SELECT ID_OFFRE, DATE, INTITULE, REGION FROM offres,region WHERE Affiche=1 AND (offres.CODE_FONC LIKE 'fc09' OR offres.CODE_FONC LIKE 'fczz' ) AND (offres.CODE_REG LIKE 're%') AND (offres.CODE_TYP LIKE 'ty%') AND offres.CODE_REG = region.CODE_REG ORDER BY DATE DESC

Quelqu'un a une idée ? problème dans la concaténation ?

Eléphant du PHP | 95 Messages

11 juil. 2005, 16:09

Il semble que l'opérateur de concaténation soit le point :
$VARfonction= "$VARfonction"." OR offres.CODE_FONC LIKE 'fczz'" ;
mais cela ne résoud rien ... La requête cette fois ci échoue :

Erreur de syntaxe près de 'fczz'') AND (offres.CODE_REG LIKE 're%') AND (offres.CODE_TYP LI' à la ligne 1

Help !!!

Eléphant du PHP | 95 Messages

12 juil. 2005, 17:46

Personne n'a une idée !!

Vous êtes pourtant nombreux à lire ce topic...

Mammouth du PHP | 983 Messages

12 juil. 2005, 21:29

Fais afficher ta requete avant de l'executer. Je suis sur que tu verras qu'il y a une erreur de syntaxe.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

13 juil. 2005, 09:23

Personne n'a une idée !!

Vous êtes pourtant nombreux à lire ce topic...
:lol:
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 95 Messages

13 juil. 2005, 09:49

Voici la solution ! Cela tenait à un problème de quote et double quote par rapport au SQL :
if ($VARfonction == "fczz") 
{
$VARfonction="fc%";
}
else
{
$VARfonction= "$VARfonction'"." OR offres.CODE_FONC LIKE 'fczz" ;
}

Mammouth du PHP | 19672 Messages

13 juil. 2005, 10:06

Joyeux mélange et guillemets et apostrophes inutiles: tiens, une petite simplification du tout sur une seule ligne:
$VARfonction = ($VARfonction == "fczz") ? "fc%" : $VARfonction." OR offres.CODE_FONC LIKE 'fczz'" ;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: