Formulaire de saisie + recherche : option "tous"

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Formulaire de saisie + recherche : option "tous"

par Cyrano » 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'" ;

par dmx-moteur » 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" ;
}

Re: Problème de concaténation

par mere-teresa » 13 juil. 2005, 09:23

Personne n'a une idée !!

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

par rami » 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.

Problème de concaténation

par dmx-moteur » 12 juil. 2005, 17:46

Personne n'a une idée !!

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

Concaténation à revoir

par dmx-moteur » 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 !!!

par dmx-moteur » 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 ?

par dmx-moteur » 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 ?

par Cyrano » 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 ?

par dmx-moteur » 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);

}

par guilt92 » 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 ?

par dmx-moteur » 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...

par guilt92 » 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

Formulaire de saisie + recherche : option "tous"

par dmx-moteur » 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 !