Page 1 sur 2

Probleme : Formulaire de recherche

Posté : 26 août 2006, 21:17
par Alfala Bucro
Voila mon probleme, dés que je vais faire un formulaire de recherche avec un champ ca va parfaitement mais dés que je veux en mettre un autre voir un troisieme, le formulaire ne marche plus correctement. Je vous mets mon code si dessous, si quelqu'un pourrait m'aider merci.
<form action="index.php?p=listdb&cat=1" method="post" name="form">
Rechercher : <input name="search_nom" size="30" value="<? echo $_POST['search_nom'] ; ?>" type="text" /><br>
Affectaction : 
<? $sql_postes = mysql_query ("SELECT * FROM cer_postes ORDER BY nom_poste"); ?>

<select name="search_poste">
														<? while($contenu_postes = mysql_fetch_array ($sql_postes)) {
echo("<option value=\"".$contenu_postes['id_poste']."\"");
echo (">".$contenu_postes['nom_poste']."</option>" ) ; } ?>
</select>

<br>
Grade : 
<? $sql_grades = mysql_query ("SELECT * FROM cer_grades ORDER BY id_grade"); ?>

<select name="search_grades">

<? while($contenu_grades = mysql_fetch_array ($sql_grades)) {
echo("<option value=\"".$contenu_grades['id_grade']."\"");
echo (">".$contenu_grades['nom_grade']."</option>" ) ; } ?>

</select>
</form>

<?
if (isset($search_nom))
{
$clause_nom = " AND (nom_membre LIKE '%$search_nom%') ";
}
	
if (isset($search_poste))
{
$clause_poste = " AND (affectation_1 LIKE '$search_poste') ";
}

if (isset($search_grades))
{
$clause_grades = " AND (grade LIKE '$search_grades') ";
}
	
$resultat = mysql_query ("SELECT * FROM cer_membres WHERE 
(absence LIKE '0' OR absence LIKE '1' OR  absence LIKE '2')" . $clause_nom . $clause_poste . $clause_grades ." "); 
$total_resultats = mysql_num_rows($resultat);
	

if(empty($nb)) { $nb=0; } $par_page = 12; $after_page = $nb+$par_page; 
$previous_page = $nb-$par_page; $debut = $nb; $nombre_resultats = $nb+$par_page;

	
$resultat2 = mysql_query ("SELECT * FROM cer_membres WHERE 
(absence LIKE '0' OR absence LIKE '1' OR  absence LIKE '2')" . $clause_nom . $clause_poste . $clause_grades . " 
ORDER BY nom_membre LIMIT $debut, $par_page");?>
	
<table>
<tr>
<th>Nom</th>
<th>Grade</th>
<th>&nbsp;</th>
<th>&nbsp;</th>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>				
<? while ($membres = mysql_fetch_array ($resultat2)) 
{	
$id = $membres['id_membre']; 
?>
<tr>
<td><a href="index.php?p=players1&cat=1&id=<? echo $id ; ?>"><? echo $membres['nom_membre']; ?></a></td>
<td>
</td>
<td></td>
<td></td>
</tr>
<? } ?>
</table>

Posté : 26 août 2006, 21:23
par thehawk
dans un premier temps change ceci :
<?
if (isset($_POST[search_nom]))
{
$clause_nom = " AND (nom_membre LIKE '%$_POST[search_nom]%') ";
}
    
if (isset($_POST[search_poste]))
{
$clause_poste = " AND (affectation_1 LIKE '$_POST[search_poste]') ";
}

if (isset($_POST[search_grades]))
{
$clause_grades = " AND (grade LIKE '$_POST[search_grades]') ";
} 

Posté : 26 août 2006, 21:29
par Alfala Bucro
J'ai modifier mais il ne trouve aucun résultat meme pour la recherche du nom qui fonctionne seule quand il n'y a pas les autres champs de recherche.

Posté : 26 août 2006, 21:31
par thehawk
autre chose je pense que ta oublier les % pour les likes .
$clause_nom = " AND (nom_membre LIKE '%$_POST[search_nom]%') ";
}
    
if (isset($_POST[search_poste]))
{
$clause_poste = " AND (affectation_1 LIKE '%$_POST[search_poste]%') "; 
ta plus qu a modifier le reste des like
enfin je comprend pas ca :
$resultat = mysql_query ("SELECT * FROM cer_membres WHERE 
(absence LIKE '0' OR absence LIKE '1' OR  absence LIKE '2')" . $clause_nom . $clause_poste . $clause_grades ." "); 
$total_resultats = mysql_num_rows($resultat);
    

if(empty($nb)) { $nb=0; } $par_page = 12; $after_page = $nb+$par_page; 
$previous_page = $nb-$par_page; $debut = $nb; $nombre_resultats = $nb+$par_page;

    
$resultat2 = mysql_query ("SELECT * FROM cer_membres WHERE 
(absence LIKE '0' OR absence LIKE '1' OR  absence LIKE '2')" . $clause_nom . $clause_poste . $clause_grades . " 
ORDER BY nom_membre LIMIT $debut, $par_page");?> 
en esperant que cela t'aide

Posté : 26 août 2006, 21:33
par Alfala Bucro
JE l'avais déjà fait ce genre de modifications mais ca n'allait pas pour les grades et postes car si tu fais une recherche avec le chiffre 1 et ben il prend en compte les 11, 12 et autres... donc je pense pas que ca vient de là. Mais je bloque....

Posté : 26 août 2006, 21:34
par Alfala Bucro
en fait mes autres requetes du resultat et en,suite le resultat 2. Consiste pour faire page suivante et page précéndete.

Posté : 26 août 2006, 21:39
par thehawk
Ben je vois pas pourquoi ca marche pas desolé je ne connais pas trop le Mysql je suis plus dans le php ...
Mais puisque que tu cherche quelque chose de precis pourquoi tu utilise un like ...

Posté : 26 août 2006, 21:44
par Alfala Bucro
ce que je comprend pas, c'est que tout seul le champ nom va fonctionner et dés que j'ai rajouter les suivants plus rien ne fonctionne.

Posté : 27 août 2006, 10:14
par Alfala Bucro
sujet toujours d'actualités, j'ai beau me pencher dessus je comprend pas. besoin d'aide merci

Posté : 27 août 2006, 10:56
par Alfala Bucro
Bien mon champ de recherche par nom refonctionne mais par les select ca ne fonctionne pas. Je cherche toujours d'ou ca peut venir. SI quelqu'un peut me venir en aide.

Posté : 27 août 2006, 10:57
par Cyrano
On va simplifier un peu tout ça : tu dois construire ta requête dynamiquement, mais certains paramètres ne sont pas toujours présents selon le choix de l'internaute. Donc on va commencer par construire un tableau pour construire les clauses de tri. On fera ensuite une concaténation avec le reste. Proposition (à tester), j'ai ajouté des commentaires dans le code, lis les bien, ils sont là pour expliquer:
<form action="index.php?p=listdb&cat=1" method="post" name="form">
  Rechercher : <input name="search_nom" size="30" value="<?php echo $_POST['search_nom'] ; ?>" type="text" /><br>
  Affectaction : <select name="search_poste">
<?php
$sql_postes = mysql_query ("SELECT * FROM cer_postes ORDER BY nom_poste");
while($contenu_postes = mysql_fetch_array ($sql_postes))
{
    echo("    <option value=\"".$contenu_postes['id_poste']."\"");
    echo (">".$contenu_postes['nom_poste']."</option>" ) ;
}
?>
  </select><br>
  Grade : <select name="search_grades">
<?php
$sql_grades = mysql_query ("SELECT * FROM cer_grades ORDER BY id_grade");
while($contenu_grades = mysql_fetch_array ($sql_grades))
{
    echo("    <option value=\"".$contenu_grades['id_grade']."\"");
    echo (">".$contenu_grades['nom_grade']."</option>" ) ;
}
?>
  </select>
</form>
<?php
/* On commence par récupérer les valeurs du formulaire !!! */
$search_nom    = isset($_POST['search_nom'])    ? $_POST['search_nom']    : null;
$search_poste  = isset($_POST['search_poste'])  ? $_POST['search_poste']  : null;
$search_grades = isset($_POST['search_grades']) ? $_POST['search_grades'] : null;

/* On crée un tableau pour stocker les clauses si elles sont requises */
$t_clauses = array();
/* La clause de tri sur le nom */
if (isset($search_nom))
{
    $t_clauses[] = "nom_membre LIKE '%". $search_nom ."%'";
}
/* La clause de tri sur le poste */
if (isset($search_poste))
{
    $t_clauses[] = "affectation_1 = '". $search_poste ."'";
}
/* La clause de tri sur le grade */
if (isset($search_grades))
{
    $t_clauses[] = "grade = '". $search_grades ."'";
}
/* construction de la clause WHERE */
$clauses = (count($t_clauses) > 0) ? " AND ". implode(" AND ", $t_clauses) : null;
/* Construction de la requête */
$resultat = mysql_query ("SELECT * FROM cer_membres ".
                         "WHERE absence BETWEEN(0, 2) ". $clauses ." "); 
$total_resultats = mysql_num_rows($resultat);

if(empty($nb))
{
    $nb=0;
}
$par_page = 12;
$after_page = $nb+$par_page; 
$previous_page = $nb-$par_page;
$debut = $nb;
$nombre_resultats = $nb+$par_page;
    
$resultat2 = mysql_query ("SELECT * ".
                          "FROM cer_membres ".
                          "WHERE absence BETWEEN(0, 2) ". $clauses ." ".
                          "ORDER BY nom_membre ".
                          "LIMIT ". $debut .", ". $par_page ."");
?>
<table>
  <tr>
    <th>Nom</th>
    <th>Grade</th>
    <th>&nbsp;</th>
    <th>&nbsp;</th>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>                
<?php while ($membres = mysql_fetch_array ($resultat2)) 
{    
$id = $membres['id_membre']; 
?>
  <tr>
    <td><a href="index.php?p=players1&cat=1&id=<?php echo $id ; ?>"><?php echo $membres['nom_membre']; ?></a></td>
    <td></td>
    <td></td>
    <td></td>
  </tr>
<?php } ?>
</table>

Posté : 27 août 2006, 11:02
par Alfala Bucro
Merci je vais tester ça et je te dis quoi.

Posté : 27 août 2006, 11:11
par Alfala Bucro
Ca fonctionne pas. Il ne trouve rien.

Posté : 27 août 2006, 11:13
par Alfala Bucro
A savoir dés que je retire les lignes :
if (isset($search_poste))
{
    $t_clauses[] = "affectation_1 = '". $search_poste ."'";
}
/* La clause de tri sur le grade */
if (isset($search_grades))
{
    $t_clauses[] = "grade = '". $search_grades ."'";
}
La recherche pour le nom fonctionne.[/code]

Posté : 27 août 2006, 11:15
par Cyrano
Attention à un détail : on est parti avec l'opérateur "AND" : s'il ne trouve rien avec les trois clauses, c'est peut-être parce qu'il n'existe aucune ligne répondant aux trois critères en même temps. Donc il faut peut-être remplacer le "AND" par un "OR".