case a cocher et multi critere...

Eléphant du PHP | 101 Messages

25 mars 2006, 22:02

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 mars 2006, 04:47

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

26 mars 2006, 18:34

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...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 mars 2006, 19:03

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é

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 101 Messages

26 mars 2006, 23:26

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"; 


Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 mars 2006, 23:48

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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

27 mars 2006, 13:01

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 mars 2006, 13:05

il manque un ";" à la ligne juste au dessus :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

27 mars 2006, 13:13

j'y suis presque!!

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 mars 2006, 14:07

attention aux erreurs d'inattention :wink:
mysql_query($SQL);
et
$sql .= " AND nom LIKE '%".$nom."%' ";

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

27 mars 2006, 14:32

Je ne comprends plus. je suis perdu...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 mars 2006, 14:36

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)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

27 mars 2006, 14:48

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 mars 2006, 14:59

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 .= "')"; 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 101 Messages

27 mars 2006, 15:07

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.