D'accord ! compris
Cette partie est résolue, mais en fait j'ai maintenant une seconde partie ! Je n'en avais pas parlé tant que j'étais bloqué sur ça...
Ma recherche avancée doit aussi interroger 3 autres critères : communes, périodes et thématiques. Une table pour chaque (id, nom) et chacune une table d'association avec la table temoignages (celles des interviews).
tables: communes et asso_communes / periodes et asso_periodes / thematiques et asso_thematiques
Pour les interroger, j'ai choisi d'utiliser des groupes de checkbox : un groupe pour les communes, un pour les périodes et un pour les thématiques, qui me renvoient chacun un array pour récupérer la liste des items à chercher dans la base.
J'ai fait ce choix, car on doit pouvoir cocher autant de communes qu'on veut pour les additionner.
Voici le code du formulaire de tout à l'heure, avec cette section en plus (pour le moment, il n'y a que la partie "communes", espérant que je n'aurai qu'à dupliquer pour les 2 autres) / J'ai coupé car en réalité il y a 60 communes !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 <form method="post" action="resultats.php"> <fieldset> <h5>Recherche par mots-clés</h5> <p> <label for="motscles">Saisissez votre recherche</label> : <input type="text" name="motscles" id="motscles" /> </p> </fieldset> <br /> <details> <summary><strong>Recherche avancée</strong> <em>(cliquez pour afficher les options)</em></summary> <fieldset> <h5>Communes</h5> <div class="options-recherche"> <div class="flex"> <ul class="liste-recherche"> <li><label><input type="checkbox" name="communes[]" value="Autheui" /> Autheuil</label></li> <li><label><input type="checkbox" name="communes[]" value="Cailly" /> Cailly</label></li> <li><label><input type="checkbox" name="communes[]" value="Champenard" /> Champenard</label></li> <li><label><input type="checkbox" name="communes[]" value="Crasville" /> Crasville</label></li> <li><label><input type="checkbox" name="communes[]" value="Fontaine" /> Fontaine</label></li> </ul> </div> </div> </fieldset> <fieldset> <h5>Périodes</h5> </fieldset> <fieldset> <h5>Thématiques</h5> </fieldset> <fieldset> <h5>Options</h5> <div class="options-recherche"> <p> Tous les témoignages ont une version texte. Presque tous ont une version audio et une version vidéo, en fonction de l'accord des témoins.<br /> De nombreux témoins présentent des documents (photos, archives, etc.) dans leur témoignage. </p> Vous pouvez ici filtrer la recherche en fonction de ces critères. </p> <p class="titre-opt-rech"><strong>Vidéo</strong></p> <ul class="liste-recherche"> <li><label><input type="radio" name="avecVideo" value="-99" checked="checked" /> Afficher tous les résultats</label></li> <li><label><input type="radio" name="avecVideo" value="1" /> Vidéo obligatoire</label></li> <li><label><input type="radio" name="avecVideo" value="0" /> Résultats sans vidéo</label></li> </ul> <p class="titre-opt-rech"><strong>Audio</strong></p> <ul class="liste-recherche"> <li><label><input type="radio" name="avecAudio" value="-99" checked="checked" /> Afficher tous les résultats</label></li> <li><label><input type="radio" name="avecAudio" value="1" /> Audio obligatoire</label></li> <li><label><input type="radio" name="avecAudio" value="0" /> Résultats sans audio</label></li> </ul> <p class="titre-opt-rech"><strong>Documents</strong></p> <ul class="liste-recherche"> <li><label><input type="radio" name="avecDocuments" value="-99" checked="checked" /> Afficher tous les résultats</label></li> <li><label><input type="radio" name="avecDocuments" value="1" /> Documents présentés obligatoires</label></li> <li><label><input type="radio" name="avecDocuments" value="0" /> Résultats sans documents présentés</label></li> </ul> </div> </fieldset> </details> <br /> <p style="text-align: center;"><input type="submit" value="Valider" id="valider" /></p> </form>
Et là, j'ai un problème de logique : pour faire la jointure correctement avec les bonnes tables (sachant qu'il y aura ensuite aussi les périodes et les thématiques )
Et aussi pour récupérer convenablement le contenu de mes arrays, les transformer en liste et construire cette partie de la clause WHERE
J'ai fait plusieurs essais mais rien ne sort...
Pour mémoire, le code de la requête actuelle :
J'ai commencé à traiter mon array Communes de cette façon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 <?php // traitement de la recherche // connexion bdd try { $pdo = new PDO('mysql:host=localhost;dbname=base;charset=utf8', 'root', '', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ]); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $where = []; $data = []; // types de données pour PDO // construction de la clause WHERE // Traitement de la recherche par mots-clés if (isset($_POST['motscles'])) { $data[':motscles'] = '%'.$_POST['motscles'].'%'; $where[] = 'i.retranscription LIKE :motscles'; } // Traitement de la section "Options" $choix = [0, 1]; if (isset($_POST['avecVideo'], $choix[$_POST['avecVideo']])) { $where[] = "i.video = {$choix[$_POST['avecVideo']]}"; } if (isset($_POST['avecAudio'], $choix[$_POST['avecAudio']])) { $where[] = "i.audio = {$choix[$_POST['avecAudio']]}"; } if (isset($_POST['avecDocuments'], $choix[$_POST['avecDocuments']])) { $where[] = "i.documents = {$choix[$_POST['avecDocuments']]}"; } // écriture de la clause WHERE $where = empty($where) ? '' : ' WHERE '. implode(' AND ', $where); $sql = <<<sql SELECT GROUP_CONCAT( CONCAT(t.civilite, ' ', t.prenom, ' ', t.nom, ', ', t.qualite) ORDER BY t.nom SEPARATOR ' ~~ ') AS groupe, i.id, i.nom_fichier FROM temoins as t INNER JOIN asso_temoins at ON at.temoin_id = t.id INNER JOIN temoignages i ON i.id = at.temoignage_id {$where} GROUP BY i.id ORDER BY i.nom_fichier sql; $stmt = $pdo->prepare($sql); $exec = $stmt->execute($data); $data = $stmt->fetchAll(); if (empty($data)) { echo 'Aucun résultat<br /><a href="recherche.php">Retour au formulaire de recherche</a>'; } else { $nb = count($data); echo '<p>', $nb, ' résultat', ($nb > 1) ? 's' : '', ' :</p>'; // échappement des caractères dangereux $hsc = function($p) { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); }; foreach ($data as $v) { echo <<<html <p><a href="temoignage.php?id={$v['id']}">Témoignage de {$hsc($v['groupe'])}</a></p> html; } } ?>
Hum...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // Traitement de la section "commune" if (isset($_POST['communes'])) { $array = $_POST['communes']; foreach ($array as $listecommunes) { *ICI JE SUIS PERDU* ; } $where[] = *ET ICI AUSSI*;
à moins que je n'aie imaginé une solution trop compliquée ?
Partager