Aller au contenu

pb avec une checkbox et ma base de donnée


vadrigar

Messages recommandés

Bonjour

Je me permet de poster car j'ai un ptit soucis au niveau de récupération de donnée d'un checkbox.

En fait ma boite propose un formulaire sur son auquel des étudiants répondent. Après avoir été stocké sur une base de donnée, les personnes de ma boite souhaite pouvoir retrouver les étudiants selon plusieurs critères. En gros c'est un moteur de recherche que je dois faire. Le problème viens au moment ou dans mon moteur de recherche je met des checkboxs. En effet, je ne récupère que la dernière checkbox cochée.

le code de mon formailaire:

				<tr>
		<td>Degree:</td>
		<td>No degree<input type="checkbox" name="degree[]" value="no degree" /></td>
		<td>Bachelor<input type="checkbox" name="degree[]" value="undergraduate" /></td>
		<td>Graduate<input type="checkbox" name="degree[]" value="graduate" /></td>
		<td>Doctoral<input type="checkbox" name="degree[]" value="doctoral" /></td>
	</tr>

et le code php pour la récupérartion de donnée via une requête:

$where="(";

if ($genre!=""){ $where.="e_civilite='$genre' AND ";}
if ($nom!=""){ $where.="e_nom LIKE '$nom%' AND ";}
if ($prenom!=""){ $where.="e_prenom LIKE '$prenom%' AND ";}
if ($datemin!=""){ $where.="e_annee_n BETWEEN '$datemin' AND '$datemax' AND ";}
if ($cp!=""){ $where.="e_code LIKE '$cp%' AND ";}
if ($ville!=""){ $where.="e_ville LIKE '$ville%' AND ";}
if ($pays!=""){ $where.="e_country='$pays' AND ";}
if ($mail!=""){ $where.="e_email LIKE '%$mail%' AND ";}
if ($nationalite!=""){ $where.="e_nationalite LIKE '$nationalite%' AND ";}
if ($etudemin!=""){ $where.="e_yearstudy BETWEEN '$etudemin' AND '$etudemax' AND ";}
if ($diplomemin!=""){ $where.="e_yeargraduation BETWEEN '$diplomemin' AND '$diplomemax' AND ";}
if ($universite!=""){ $where.="e_nameuniversity LIKE '%$universite%' AND ";}
if ($expmin!=""){ $where.="e_yearsexperience BETWEEN '$expmin' AND '$expmax' AND ";}
if ($major!=""){ $where.="e_major='$major' AND ";}
if ($industry!=""){ $where.="e_industry='$industry' AND ";}
[color=#FF0000]foreach ($degree as $choix){
	if ($degree!=""){ $where.="e_degree='$choix' AND ";}
}[/color]


$where=substr($where, 0, strlen($where)-4);
$where.=")";

//création de la requête
$sql="SELECT DISTINCT * FROM eleve WHERE $where ORDER BY e_nom ASC;";

Etant débutatn la dedans j'avoue que je galère assez et surtout personne ne peut m'aider dasn la société car ils ne connaissent pas du tout le code donc voilà. J'espère que vous pourrez m'aidez à résoudre ce pb, merci d'avance

- edit de Quarky : ajout des balises

 -
Lien vers le commentaire
Partager sur d’autres sites

Au lieu de

foreach ($degree as $choix){
if ($degree!=""){ $where.="e_degree='$choix' AND ";}
}

Tu dois mettre

foreach ($degree as $choix){
if ($choix!=""){ $where.="e_degree='$choix' AND ";}
}

Sinon, je te conseille de changer tout tes

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

par ceci (dans le cas où le name de l'input vaut "nom") :

 if ($_POST['nom']!=""){ $where.="e_nom LIKE '".$_POST['nom']."%' AND ";}

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup de m'avoir répondu :)

Cependant j'ai toujours un soucis. En fait si je ne choisi qu'une case, pas de soucis, ça me trie bien les données par rapport à ce choix mais si je choisi plus d'une case, j'ai l'impression qu'il cherche dans la base les champs où on trouve tous les choix cochés à la fois. Alors que je souhaite afficher les champs ou on trouve un de mes choix.

Exemple: Si je coche la case "No degree" uniquement il va me sortir que les gens avec "No degree".

Mais si je choisi "No degree" et "Graduate" par exemple à ce moment là il ne me sort personne alors que je voudrais qu'il me sortent les gens avec "No degree" et les gens avec "Graduate".

J'ai l'impression qu'il cherche les gens qui sont "No degree" et "Graduate" en même temps et là forcément il ne trouve personne.

Si vous avez une idée, je suis preuneur ^^

Lien vers le commentaire
Partager sur d’autres sites

Ceci est dû à ta requête SQL que tu fabrique avec des AND partout alors que pour ce qui est des cases à cocher, tu devrais mettre des OR (pour ce que tu cherches à faire en tout cas).

Donc, au lieu de ça :

(...)
if ($industry!=""){ $where.="e_industry='$industry' AND ";}
foreach ($degree as $choix){
 if ($choix!=""){ $where.="e_degree='$choix' AND ";}
}
$where=substr($where, 0, strlen($where)-4);
$where.=")";
(...)

Tu devrais faire ça (ajout des parenthèses avant et après la boucle sur $degree) :

(...)
if ($industry!=""){ $where.="e_industry='$industry' AND (";}
$test=0;
foreach ($degree as $choix){
 if ($choix!=""){ 
if ($test=="0") {
  $where.="e_degree='$choix' ";
  $test=1;
}else{
  $where.="OR e_degree='$choix' ";
}
 }
}
$where.=")";	 
$where=substr($where, 0, strlen($where)-4);
$where.=")";
(...)

Lien vers le commentaire
Partager sur d’autres sites

par ceci (dans le cas où le name de l'input vaut "nom") :

 if ($_POST['nom']!=""){ $where.="e_nom LIKE '".$_POST['nom']."%' AND ";}

Ouhlala misère, bonjour l'injection SQL en puissance...

 if ($_POST['nom']!=""){ $where.="e_nom LIKE '".mysql_real_escape_string($_POST['nom'])."%' AND ";}

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...