Comment modifier mon code de liste simple à multiple ?

Fermé
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - Modifié par geekat le 10/09/2015 à 14:16
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017 - 11 sept. 2015 à 16:54
Bonsoir,
Je suis entrain de modifier mon code qui permet de faire une recherche sur plusieurs critères, mes listes étaient simples (1 seule option à sélectionner à la fois), je dois les modifier en listes de selection multiples ( 1 ou plusieurs options à sélectionner à la fois).
J'ai modifié cette liste, je peux désormais sélectionner plusieurs options. Mais pour faire la recherche je ne sais pas comment le modifier.
<?php
/* Code pour une liste simple */
$thematique=(!empty($_POST['thematique']))?($_POST['thematique']):NULL; 
if( !empty($_POST['thematique']) )
   $criteres[]="thematique LIKE '{$_POST['thematique']}'";
$strWhere = isset($criteres) && count($criteres)>0 ? " WHERE " . implode(' AND ', $criteres) : '';
$sql="SELECT * FROM categorisation " . $strWhere ;
sth = $bdd->prepare($sql);
$sth->execute();
/* Afficher les résultats */
$result = $sth->fetchAll();

?>
<div id="liste_structure"> La liste des structures correspondant aux critères : </div>

<?php 
if(count($result)){

foreach( $result as $donnees ){
   // echo $donnees['id_struct'].'<br>';
   $id_struct=$donnees['id_struct'];
  
  $sql2="SELECT * FROM structure WHERE id_struct='$id_struct' AND famille_contact='Piste de recherche'";
 
  $sth = $bdd->prepare($sql2);
 $sth->execute();
 /* Afficher les résultats */
 $result = $sth->fetchAll();
 
 foreach( $result as $donnees ){
  $contact=$donnees['nom_contact'];
  $struct=$donnees['id_struct'];
?> 
 <div id="liens">
  <a href="recherche-contact?nom_contact=<?php echo $contact; ?>"> <?php echo $contact.'<br>'; ?></a>
 </div> 
<?php
         }
       }
    }
    else {
     echo "<br> Aucun résultat trouvé !";
     }


Code de la liste multiple :
         <select id="thematique" name = "thematique[]" multiple="multiple"  >	
	        <option value="1">Guerre d'Espagne</option>
		<option value="2">MIE</option>
		<option value="3">Migration  </option>	
		<option value="4">Réunification familiale</option>	 
                <option value="5">WWII</option>
	</select>
A voir également:

1 réponse

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
11 sept. 2015 à 11:32
Salut,

Une solution simple et rapide est d'utiliser l'opérateur de comparaison sql IN et la fonction php implode :
if(!empty($_POST['thematique'])) {
    $criteres[] = "thematique IN (" . implode(',', $_POST['thematique']) . ")";
}


Pour éviter les injections sql, il faut également échapper les caractères réservés. Puisque tu n'utilises que des entier, tu peux simplement utiliser intval() pour éviter les injections sql, autrement il faudrait utiliser la méthode PDO::quote() ou une requête préparée avec des paramètres.

Soit :
if(!empty($_POST['thematique'])) {
    $criteres[] = "thematique IN (" . implode(',', array_map('intval', $_POST['thematique'])) . ")";
}


Bonne journée
1
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
11 sept. 2015 à 16:17
Merci beaucoup! Je vais essayer ça. Et j'ai juste une question : est-ce que ça peut marcher si j'ai : |1|6| IN |3|4|6|
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
11 sept. 2015 à 16:24
Je n'ai pas compris ta question, peux tu détailler un peu plus ?
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
11 sept. 2015 à 16:35
Je veux dire est-ce je que comparer avec le IN les tableaux |1|6| et |3|4|6| et trouver en commun le 6 ?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
11 sept. 2015 à 16:47
Les valeurs 1,2, ... correspondent au choix effectué par l'utilisateur dans liste déroulante name="thematique[]". L'utilisateur pourra donc sélectionner les valeurs 1|6 ou sélectionner les valeurs 3|4|6 mais je comprend pas comment tu peux récupérer deux sélections différentes 1|6 et 3|4|6.

Si tu veux trouver les éléments commun entre deux tableau, tu peux utiliser la fonction php array_intersect() mais je ne comprend bien le rapport avec ta requête.
0
geekat Messages postés 228 Date d'inscription vendredi 31 juillet 2015 Statut Membre Dernière intervention 24 février 2017
11 sept. 2015 à 16:54
En fait c'est les valeurs qu'il faut comparer pas toute la sélection car il n'y aura pas forcément la même suite de chiffres.
Le rapport avec la requête, c'est juste un exemple où :
thematique = 1|6 et $_POST['thematique'] = 3|4|6

Je vais essayer cette fonction merci.
0