Page 1 sur 2

case a cocher et multi critere...

Posté : 25 mars 2006, 22:02
par fersayn
Bonjour,

j'essaie de construire un recherche multi critere.

j'ai deux pages : 1 qui contient les formulaires et 1 autre avec le script de recherche.

j'ai des cases a cocher qui permettent d'effectuer une pré-sélection et ensuite des 2 champs a remplir.

les cases recherche une info dans 1 champ de la base, les 2 autres champ à remplir dans 2 autres Champ de la base.

Je bloque sur les requetes!!!

voici les codes:

PAGE RECHERCHE

Code : Tout sélectionner

<BODY> <CENTER> rechercher un &eacute;tablissement: <form name="form1" method="post" action="search.php"> <table width="75%" border="0"> <tr> <td width="47%" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox" value="checkbox"> AA </font></td> <td width="53%" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox1" value="checkbox"> AB</font></td> </tr> <tr> <td width="47%" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox3" value="checkbox"> AC</font></td> <td width="53%" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox4" value="checkbox"> AD</font></td> </tr> <tr> <td width="47%" height="23" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox5" value="checkbox"> AE</font></td> <td width="53%" height="23" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox6" value="checkbox"> AF</font></td> </tr> <tr> <td width="47%" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox7" value="checkbox"> AI</font></td> <td width="53%" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox8" value="checkbox"> AJ</font></td> </tr> <tr> <td width="47%" valign="top" height="2"><font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox9" value="checkbox"> AK </font></td> <td width="53%" valign="middle" height="2"><font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox10" value="checkbox"> AL</font></td> </tr> </table> </form> <FORM ACTION="search.php" METHOD="POST"> Entrer un nom: <input type="text" name="name"> <input type="submit" value="Rechercher" name="submit"> </FORM> <FORM ACTION="search.php" METHOD="POST"> Entrer un d&eacute;partement: <input type="text" name="dept"> <input type="submit" value="Rechercher" name="submit2"> </FORM> </CENTER> </BODY>
SCRIPT RECHERCHE:
<?php 
  include('connexion.php'); 
if ([checkbox==checked]){
$SQL="SELECT * FROM recherche WHERE type ='HOPITAL' and nom LIKE '%". $_POST[name] ."%' or dept LIKE '%". $_POST[dept] ."%'";

if ($_POST[name]) { 
     $SQL = "SELECT * FROM recherche WHERE nom LIKE '%". $_POST[name] ."%'"; 
    $h = $_POST[name]; 
} 
else { 
		$SQL = "SELECT * FROM recherche WHERE dept LIKE '%". $_POST[dept] ."%'"; 
    $k = $_POST[dept]; 
} 

echo $date; 

echo "<BR><BR><BR>\n"; 

echo "Vous recherchez :  <EM>$h</EM>.\n"; 
echo "Vous recherchez :  <EM>$k</EM>.\n"; 

echo "<BR><BR>\n"; 

$result = mysql_query($SQL) or die("La requête <BR><PRE>$SQL</PRE>a échoué : ".mysql_error()); 

//j'ai defini une variable $i pour afficher 5 enregistremnt par ligne 
echo "<TABLE border =\"0\" width=\"100%\" CELLPADDING=\"0\" cellspacing=\"0\">"; 

//initialiser la variable $i a 0 
$i=0; 
while($row = mysql_fetch_row($result)) 
{ 
    if ($i==0) 
     { 
       echo "<TR>"; 
     } 

   //on incremente la variable 
  $i=$i+1; 

   //$row[numero du champ a afficher] 
   echo " <br>$row[1] <br><br>$row[2]<br><br> $row[3]<br><br> $row[4]<br><br> $row[5]<br><br> $row[6]<br><br> <i><b><u>Produits :</i></b></u>$row[7]</td><br><br>"; 
  if ($i==5) 
  { 
  echo "</TR>"; 
  $i=0; 
  } 
} 
echo"</table>";    
merci pour aide

Posté : 26 mars 2006, 04:47
par Truc
Salut,

Commence par changer les attributs des cases à cocher, name avec des [] et "value" différent pour chaque case:
<input type="checkbox" name="checkbox[]" value="AA"> 
<input type="checkbox" name="checkbox[]" value="AB">
...
ensuite jette un oeil à ce petit tuto pour la récupération des cases à cocher

Ensuite un seul formulaire serait pas plus mal je pense :wink:

Posté : 26 mars 2006, 18:34
par Invité
ok, voila pour le formulaire:

Code : Tout sélectionner

<BODY> <CENTER> rechercher un &eacute;tablissement: <form name="form1" method="post" action="search.php"> <table width="75%" border="0"> <tr> <td width="47%" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AA"> AA </font></td> <td width="53%" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AB"> AB</font></td> </tr> <tr> <td width="47%" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AC"> AC</font></td> <td width="53%" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AD"> AD</font></td> </tr> <tr> <td width="47%" height="23" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AE"> AE</font></td> <td width="53%" height="23" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AF"> AF</font></td> </tr> <tr> <td width="47%" valign="top"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AG"> AI</font></td> <td width="53%" valign="middle"> <font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AH"> AJ</font></td> </tr> <tr> <td width="47%" valign="top" height="2"><font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AI"> AK </font></td> <td width="53%" valign="middle" height="2"><font face="Arial, Helvetica, sans-serif" size="1"> <input type="checkbox" name="checkbox[]" value="AJ"> AL</font></td> </tr> </table> <p>Entrer un nom: <input type="text" name="name"> </p> <p> Entrer un d&eacute;partement: <input type="text" name="dept"> <input type="submit" value="Rechercher" name="submit2"> </p> </FORM> </CENTER> </BODY>
et voici pour le script, comment lui dire:

losque qu'une case est coché et un dept remplie:

la requete doit dire:

par ex : recherche dans la table tous les établissements de type'A' dans le 01
'la valeur de la case coché'

je ne sais pas comment concaténé ma requete.

j'avais pensé:
if ([checkbox==checked]){ 
$SQL="SELECT * FROM recherche WHERE type ='HOPITAL' and nom LIKE '%". $_POST[name] ."%' or dept LIKE '%". $_POST[dept] ."%'"; 
merci pour votre aide...

Posté : 26 mars 2006, 19:03
par Truc
avec le tuto sur la récupération des cases a cocher et CELUI-CI pour les requetes dynamiques tu devrais arriver à tes fins :wink:

Fait quelques essais, si tu n'y arrives pas reviens nous voir avec ce que tu auras testé

Posté : 26 mars 2006, 23:26
par fersayn
suis-je sur la bonne voix??

voici mon php:

<?php 
// vérifions que la variable a été transmise 
$tabcheckbox = (isset($_POST['checkbox']))?$_POST['checkbox']:null; 

echo "Voici les langages que vous avez choisi :<br>"; 
// bouclons sur le tableau qui a été transmis et affichons les valeurs sélectionnées 
if (!empty($tabcheckbox)) { 
    foreach($tabcheckbox as $cle => $valeur) { 
//ici je crée un variable appellé $max qui récupere la valeur de la case a coché
       $max=$cle.' : '.$valeur.'<br>'; 
    } 
//maintenant que j'ai ma valeur de case a coché je construit une requete sql avec ma valeur et mes 2 autres champs du formulaires

if ($_POST[name]) { 
     $SQL = "SELECT * FROM recherche WHERE nom LIKE '%". $_POST[name] ."%' and type ='$max'"; 
    $h = $_POST[name]; 
} 
else { 
        $SQL = "SELECT * FROM recherche WHERE dept LIKE '%". $_POST[dept] ."%' and type ='$max'"; 
    $k = $_POST[dept]; 
} 

echo $date; 

echo "<BR><BR><BR>\n"; 

echo "Vous recherchez :  <EM>$h</EM>.\n"; 
echo "Vous recherchez :  <EM>$k</EM>.\n"; 

echo "<BR><BR>\n"; 


Posté : 26 mars 2006, 23:48
par Truc
sur la bonne voie oui...
proposition:
<?php
// vérifions que la variable a été transmise
$tabcheckbox = (isset($_POST['checkbox'])) ? $_POST['checkbox'] : null; 
$nom         = (isset($_POST['name']))    ? $_POST['name']     : null; 
$dept        = (isset($_POST['dept']))    ? $_POST['dept']     : null; 


$SQL = "SELECT * FROM recherche WHERE 1=1 "

if (!empty($nom)) 
{
	$sql .= " AND nom LIKE '%".$nom."%' ";
}

if (!empty($dept)) 
{
	$sql .= " AND dept LIKE '%".$dept."%' ";
}

if (!empty($tabcheckbox)) 
{
	$sql .= " AND type IN (";
	$sql .= implode(",",$tabcheckbox);
	$sql .= ")";
}

echo $sql;
la dernière ligne sert de test d'affichage pour tester la requete générée dans phpmyadmin par exemple.

Posté : 27 mars 2006, 13:01
par Invité
voici ce que j'ai fait par contre il y une erreur:
<?php 
  include('connexion.php'); 
// vérifions que la variable a été transmise 
$tabcheckbox = (isset($_POST['checkbox'])) ? $_POST['checkbox'] : null; 
$nom         = (isset($_POST['name']))    ? $_POST['name']     : null; 
$dept        = (isset($_POST['dept']))    ? $_POST['dept']     : null; 
$SQL = "SELECT * FROM recherche WHERE 1=1 " 
if (!empty($nom)) 
{ 
    $sql .= " AND nom LIKE '%".$nom."%' "; 
} 

if (!empty($dept)) 
{ 
    $sql .= " AND dept LIKE '%".$dept."%' "; 
} 

if (!empty($tabcheckbox)) 
{ 
    $sql .= " AND type IN ("; 
    $sql .= implode(",",$tabcheckbox); 
    $sql .= ")"; 
} 

echo $sql; 

echo $date; 
echo "<BR><BR><BR>\n"; 

echo "<BR><BR>\n"; 

$result = mysql_query($SQL) or die("La requête <BR><PRE>$SQL</PRE>a échoué : ".mysql_error()); 

//j'ai defini une variable $i pour afficher 5 enregistremnt par ligne 
echo "<TABLE border =\"0\" width=\"100%\" CELLPADDING=\"0\" cellspacing=\"0\">"; 

//initialiser la variable $i a 0 
$i=0; 
while($row = mysql_fetch_row($result)) 
{ 
    if ($i==0) 
     { 
       echo "<TR>"; 
     } 

   //on incremente la variable 
  $i=$i+1; 

   //$row[numero du champ a afficher] 
   echo " <br>$row[1] <br><br>$row[2]<br><br> $row[3]<br><br> $row[4]<br><br> $row[5]<br><br> $row[6]<br><br> <i><b><u>Produits :</i></b></u>$row[7]</td><br><br>"; 
  if ($i==5) 
  { 
  echo "</TR>"; 
  $i=0; 
  } 
} 
echo"</table>";    
?> 
et il me dit:

parse error, unexpected T_IF in /var/www/data/lri/G/M/L/A/GMLA58RP/docs/search.php on line 8

pour cette ligne:
if (!empty($nom)) 

merci

Posté : 27 mars 2006, 13:05
par Truc
il manque un ";" à la ligne juste au dessus :wink:

Posté : 27 mars 2006, 13:13
par Invité
j'y suis presque!!

la requete est bonne par contre, il me sort tout les résultas de la base??

Posté : 27 mars 2006, 14:07
par Truc
attention aux erreurs d'inattention :wink:
mysql_query($SQL);
et
$sql .= " AND nom LIKE '%".$nom."%' ";

Posté : 27 mars 2006, 14:32
par Invité
Je ne comprends plus. je suis perdu...

Posté : 27 mars 2006, 14:36
par Truc
tu exécutes le contenu de la varaible $SQL:
$SQL = "SELECT * FROM recherche WHERE 1=1 "
donc séléction sur toute la base, au lieu de $sql (en minuscule)

Posté : 27 mars 2006, 14:48
par Invité
tout d'abord merci pour ton aide...

voici la requete généré:
SELECT * FROM recherchehopitaux WHERE 1=1 AND dept LIKE '01' AND type IN (HOPITAL)
ce que je veux obtenir c: AND (HOPITAL) IN type

Posté : 27 mars 2006, 14:59
par Truc
as tu testé cette requete dans phpmyadmin, par exemple ?

Dans la requete il y a ceci " type IN (HOPITAL)" ce qui signifi que le champ nomé "type" doit contenir "HOPITAL" pour que la requête retourne un résultat.

tu peux aussi avoir ceci (en fonction du nombre de cases cochées):
AND type IN ('HOPITAL','truc','machin')
dans ce cas la requête retourne toutes les données dont le champ "type" contient soit HOPITAL,truc ou machin la construction est donc bonne.

Par contre il manque des apostrophes pour préciser une chaine de caractères.
$sql .= " AND type IN ('";
    $sql .= implode("','",$tabcheckbox);
    $sql .= "')"; 

Posté : 27 mars 2006, 15:07
par fersayn
j'ai testé dans phpadmin:

et voici, ce qu'il me retourne à la rquete:
SELECT * FROM recherchehopitaux WHERE 1=1  AND dept LIKE '01'  AND type IN (HOPITAL)
a échoué : Unknown column 'HOPITAL' in 'where clause'

on dirait qu'il le comprend a l'envers.