IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête préparée qui ne fonctionne pas [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    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>&nbsp;<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" />&nbsp;Autheuil</label></li>
    									<li><label><input type="checkbox" name="communes[]" value="Cailly" />&nbsp;Cailly</label></li>
    									<li><label><input type="checkbox" name="communes[]" value="Champenard" />&nbsp;Champenard</label></li>
    									<li><label><input type="checkbox" name="communes[]" value="Crasville" />&nbsp;Crasville</label></li>
    									<li><label><input type="checkbox" name="communes[]" value="Fontaine" />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
    								<li><label><input type="radio" name="avecVideo" value="1" />&nbsp;Vidéo obligatoire</label></li>
    								<li><label><input type="radio" name="avecVideo" value="0" />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
    								<li><label><input type="radio" name="avecAudio" value="1" />&nbsp;Audio obligatoire</label></li>
    								<li><label><input type="radio" name="avecAudio" value="0" />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
    								<li><label><input type="radio" name="avecDocuments" value="1" />&nbsp;Documents présentés obligatoires</label></li>
    								<li><label><input type="radio" name="avecDocuments" value="0" />&nbsp;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 :
    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' : '', '&nbsp;:</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&nbsp;{$hsc($v['groupe'])}</a></p>
    html;
        }
    }
     
    ?>
    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
    // Traitement de la section "commune"
     
    if (isset($_POST['communes'])) {
        $array = $_POST['communes'];
        foreach ($array as $listecommunes) {
            *ICI JE SUIS PERDU* ;
        }
        $where[]           = *ET ICI AUSSI*;
    Hum...
    à moins que je n'aie imaginé une solution trop compliquée ?

  2. #22
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    en tout cas, merci vous deux du temps que vous consacrez à me répondre

  3. #23
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Tu dois fonctionner plus par analogie (la transposition d'un code existant à ta problématique) et surtout, tu dois te manger l'étude du langage, du moins avoir un socle de connaissances élémentaires du PHP et ça c'est que de la lecture de la doc PHP
    Ton code devrait être plutôt du genre :
    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
    // générateur de tag PDO
    $tag = function(): string {
        // majuscule minuscule digit
        return ':'.chr(mt_rand(65, 90)).chr(mt_rand(97, 122)).mt_rand(1, 1000);
    };
     
    $where_or = [];
     
    // Traitement de la section "commune"
    if ( ! empty($_POST['communes'])) {
        foreach ($_POST['communes'] as $comm) {
            $t          = $tag();
            $data[$t]   = $comm;
            $where_or[] = "i.commune = {$t}";  // je ne connais pas la table à mettre ici
        }
    }
     
    $where    = implode(' AND ', $where);
    $where_or = implode(' OR ', $where_or);
     
    if ($where) {
        $where = ' WHERE '.$where;
    }
     
    if ($where_or) {
        if ($where) {
            $where .= ' AND ('.$where_or.')'; 
        } else {
            $where = ' WHERE '.$where_or;
        }
    };
    Rassure-moi, t'as quand même pas trop l'impression qu'on fait ton travail ?

  4. #24
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- L'approche de rawsrc est comparable à celle DÉJÀ montrée.
    Tu aurais effectivement pu la découvrir par toi-même.

    Je sais qu'il est toujours plus facile de faire travailler les autres (surtout par cette chaleur), mais il ne faut pas abuser non plus.

    Citation Envoyé par rawsrc Voir le message
    ...avoir un socle de connaissances élémentaires du PHP et ça c'est que de la lecture de la doc PHP...
    @rawsrc
    En l'occurrence, ici, c'est plutôt un manque d'expérience et de connaissances en écriture de requêtes SQL, non ?

    @burnic
    Tu N'est PAS le PREMIER à faire un "module de recherche/sélection" en PHP/SQL.
    Par conséquent, il existe certainement DÉJÀ des discussions qui traitent de ces problématiques.
    A TOI de faire une recherche préliminaire...



    2- une autre approche est d'utiliser IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE id_communes IN (...,...,...,... )"
    • ...,...,...,... est la liste des id_communes des communes cochées.

    Là, pas de passage en paramètre possible :
    • il faut l'écrire directement DANS la requête sous forme de liste, séparés par des virgules
    • et d'abord s'assurer que ce sont bien des numériques, avec (ça, on ne peut pas l'inventer et pour le coup, c'est du PHP ) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $arr = array_map('intval', $arr );
      -> Transforme tous les éléments d'un array en numériques via la fonction intval.
    • ensuite, on concatène les éléments avec une virgule :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $list = implode(',', $arr);

    BIEN SUR, je te laisse faire les recherches nécessaires pour comprendre les fonctions utilisées.


    N.B. De plus (ce que n'a pas précisé rawsrc), il faut bien sûr JOINDRE la table communes dans la requête, avec INNER JOIN.

  5. #25
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    2- une autre approche est d'utiliser IN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE id_communes IN (...,...,...,... )"
    • ...,...,...,... est la liste des id_communes des communes cochées.

    Là, pas de passage en paramètre possible :
    T'es sûr de toi ?!??

    Je vais vérifier mais je crois que je l'avais déjà fait et que ça fonctionnait sans problèmes, en plus j'ai déjà mis un générateur de tags PDO

  6. #26
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon j'ai vérifié et c'est tout à fait possible de gérer des placeholders dans une clause IN avec PDO
    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
    $where_in = [];
     
    // Traitement de la section "commune"
    if ( ! empty($_POST['communes'])) {
        foreach ($_POST['communes'] as $comm) {
            $t          = $tag();
            $data[$t]   = $comm;
            $where_in[] = $t; 
        }
    }
     
    $where    = implode(' AND ', $where);
    $where_in = implode(',', $where_in);
     
    if ($where) {
        $where = ' WHERE '.$where;
    }
     
    if ($where_in) {
        if ($where) {
            $where .= ' AND i.communes IN ('.$where_in.')';
        } else {
            $where = ' WHERE i.communes IN ('.$where_in.')';
        }
    }

  7. #27
    Invité
    Invité(e)
    Par défaut
    On ne s'est pas compris...
    Ce n'est pas ce que j'ai voulu dire.

    1- Toi, tu passes CHAQUE commune en paramètre.
    Ça, c'est OK.
    En effet, ça fonctionne très bien.

    (par contre après, tu te compliques inutilement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    // Traitement de la section "commune"
    $where_in = [];
    if ( ! empty($_POST['communes'])) {
        foreach ($_POST['communes'] as $comm) {
            $t          = $tag();
            $data[$t]   = $comm;
            $where_in[] = $t; 
        }
    	$where[] = ' i.communes IN ('.implode(',', $where_in).')';
    }
     
    // construction de la clauqe WHERE (à la fin)
    $where = ( !empty($where) )? ' WHERE '.implode(' AND ', $where) : '';
    2- Mais si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $list = implode(',', $arr);
    $list sera de la forme ...,...,...
    C'est CETTE variable $list qu'on ne peut pas passer "tel quel" en paramètre.
    (et là, je pense que tu seras d'accord).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    // Traitement de la section "commune"
    if ( !empty($_POST['id_commune'])) {
    	$list = implode(',', array_map('intval',$_POST['id_commune']));
    	$where[] = ' i.communes IN ('.$list.')';
    }
    3- A NOTER que moi, j'ai parlé de récupérer des id.
    Et toi, des noms (de communes).

    Si j'avais eu des "noms" à traiter, j'aurais certainement utilisé la méthode que tu as fourni en premier (avec les ' OR ').
    Dernière modification par Invité ; 26/07/2019 à 11h59.

  8. #28
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    bah je suis parti de ce qui avait déjà été fait donc j'ai évité de tout péter
    et surtout de son code et là pas d’ambiguïté :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <ul class="liste-recherche">
      <li><label><input type="checkbox" name="communes[]" value="Autheui" />&nbsp;Autheuil</label></li>
      <li><label><input type="checkbox" name="communes[]" value="Cailly" />&nbsp;Cailly</label></li>
      <li><label><input type="checkbox" name="communes[]" value="Champenard" />&nbsp;Champenard</label></li>
      <li><label><input type="checkbox" name="communes[]" value="Crasville" />&nbsp;Crasville</label></li>
      <li><label><input type="checkbox" name="communes[]" value="Fontaine" />&nbsp;Fontaine</label></li>
    </ul>

  9. #29
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Oui effectivement, c'est la première fois que je dois construire des requêtes aussi complexes (je n'étais même pas censé le faire, j'ai accepté d'essayer pour rendre service à ce groupe d'associations qui l'utilisera, mais il apparaît que pas mal de notions me manquent finalement). Désolé d'avoir donné l'impression de m'en décharger sur vous ce n'était pas du tout le but, et d'ailleurs j'ai appris beaucoup en vous lisant.

    J'ai passé l'après-midi d'hier à tenter de m'inspirer de la solution déjà construite par rawsrc, mais ça n'avait pas marché :/
    Je me suis aussi demandé s'il ne serait pas plus simple de récupérer les id plutôt que les noms.

    Je devrais peut-être essayer de construire d'abord cette requête "communes" toute seule avant de vouloir la combiner à l'autre requête.

  10. #30
    Invité
    Invité(e)
    Par défaut
    "burnic" ? "Histonic" ?


    1- Un autre intérêt des id, c'est qu'ils sont déjà "indexé" dans la table (PRIMARY KEY).
    La performance devrait être meilleure.

    2- Quant aux requêtes :
    • tu peux les écrire "à la main" (avec des données "bidon"),
    • et les tester directement dans phpMyAdmin, pour vérifier/confirmer la bonne syntaxe.

  11. #31
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Histonic ! (j'ai eu un problème de sécurité avec l'ancien pseudo, il se trouve que le changement est intervenu en pleine discussion...)

    ça me semble plus simple en effet avec les id ; et si j'avais dû commencer par cette requête, j'aurais sans doute opté pour IN en effet.
    Je pense que je vais d'abord faire ces quelques tests

  12. #32
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    J'ai fait les tests en question et mes requêtes fonctionnent, par contre lorsque je la combine à celle qui gère l'ensemble du formulaire, j'obtiens "aucun résultat" à ma recherche. J'ai dû faire une erreur de syntaxe quelque part, mais je ne la trouve pas (j'ai pourtant glissé quelques print_r pour vérifier le contenu de mes arrays et ils semblent corrects...)

    Peux-tu y jeter un œil stp ?
    merci

    (j'ai déjà fait les jointures de mes prochaines tables, en prévision)

    Code formulaire ( c'est le même, j'ai juste en plus encadré les values des checkbox de guillemets pour la clause IN() ) :
    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
    <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>&nbsp;<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='"Autheuil"' />&nbsp;Autheuil</label></li>
    									<li><label><input type="checkbox" name="communes[]" value='"Cailly"' />&nbsp;Cailly</label></li>
    									<li><label><input type="checkbox" name="communes[]" value='"Champenard"' />&nbsp;Champenard</label></li>
    									<li><label><input type="checkbox" name="communes[]" value='"Crasville"' />&nbsp;Crasville</label></li>
    									<li><label><input type="checkbox" name="communes[]" value='"Fontaine"' />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
    								<li><label><input type="radio" name="avecVideo" value="1" />&nbsp;Vidéo obligatoire</label></li>
    								<li><label><input type="radio" name="avecVideo" value="0" />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
    								<li><label><input type="radio" name="avecAudio" value="1" />&nbsp;Audio obligatoire</label></li>
    								<li><label><input type="radio" name="avecAudio" value="0" />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
    								<li><label><input type="radio" name="avecDocuments" value="1" />&nbsp;Documents présentés obligatoires</label></li>
    								<li><label><input type="radio" name="avecDocuments" value="0" />&nbsp;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>

    Code de la requête :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    <?php
     
    print_r($_POST); // afficher le contenu de $_POST pendant le développement
     
    // 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 = [];
    $having = " ";
    $data  = []; // types de données pour PDO
     
    // construction de la clause WHERE
     
     
    // traitement de la section "mots-clés"
     
    if (isset($_POST['motscles'])) { 
        $data[':motscles'] = '%'.$_POST['motscles'].'%';
        $where[]           = 'i.retranscription LIKE :motscles';
    }
     
     
    // traitement de la section "Communes"
     
    if (isset($_POST['communes'])) {
        $data[':communes'] = implode(',', $_POST['communes']);
     
        $where[]           = 'c.nom IN (:communes)';
    }
     
    print_r($data);
     
     
    // traitement de la section "Périodes"
     
     
     
     
    // traitement de la section "Thématiques"
     
     
     
     
    // 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);
     
    print_r($where);
     
    // écriture de la clause HAVING
     
     
     
     
    // préparation puis exécution de la requête
     
    $sql = <<<sql
    SELECT GROUP_CONCAT( DISTINCT CONCAT(t.civilite, ' ', t.prenom, ' ', t.nom, ', ', t.qualite) ORDER BY t.nom SEPARATOR ' ~~ ') AS groupe, i.id, i.nom_fichier
    FROM temoins t
    INNER JOIN asso_temoins as at  ON at.temoin_id  = t.id
    INNER JOIN temoignages  i   ON i.id             = at.temoignage_id
    LEFT JOIN asso_communes ac  ON ac.temoignage_id = i.id
    LEFT JOIN communes c        ON c.id             = ac.commune_id
    LEFT JOIN asso_periodes ap  ON ap.temoignage_id = i.id
    LEFT JOIN periodes p        ON p.id             = ap.periode_id
    LEFT JOIN asso_matieres am  ON am.temoignage_id = i.id
    LEFT JOIN matieres m        ON m.id             = am.matiere_id
    {$where}
    GROUP BY i.id
    {$having}
    ORDER BY i.nom_fichier
    sql;
     
    $stmt = $pdo->prepare($sql);
    $exec = $stmt->execute($data);
    $data = $stmt->fetchAll();
     
     
    // affichage des résultats
     
    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' : '', '&nbsp;:</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&nbsp;{$hsc($v['groupe'])}</a></p>
    html;
        }
    }
     
    ?>

  13. #33
    Invité
    Invité(e)
    Par défaut
    1-
    Citation Envoyé par Histonic Voir le message
    ...j'ai juste en plus encadré les values des checkbox de guillemets...
    Tu as pris un coup de chaud ???
    Va t'aérer...

    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // traitement de la section "Communes"
     
    if (isset($_POST['communes'])) {
        $data[':communes'] = implode(',', $_POST['communes']);
     
        $where[]           = 'c.nom IN (:communes)';
    }
    Là, tu mélanges les 2 méthodes...
    Ce n'est NI ce que rawrsc a proposé, NI ce que J'AI proposé : ça ne va pas.
    RELIS ce qu'on t'a écrit (et choisis UNE et UNE SEULE méthode !)


    3- Tu n'as manifestement pas compris le fonctionnement d'une requête préparée, avec utilisation de bindvalue().
    LIS LA DOC.



    IMPORTANT : si tu ne comprends pas le code que rawsrc t'a proposé (avec $data, $where,...), DIS-LE CLAIREMENT.
    Ça fera gagner du temps...
    Dernière modification par Invité ; 26/07/2019 à 18h36.

  14. #34
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Au temps pour moi, je n'avais pas vu la déclaration du "générateur de tags PDO" de rawsrc, ce qui fait que je n'ai pas compris les lignes qui l'utilisaient (évidemment) et j'ai tenté de bidouiller quelque chose qui me paraissait pouvoir passer...

    J'ai compris l'utilisation de bindvalue() dans les requêtes préparées, bien que je l'ai découverte avec vous.
    Tout fonctionne bien, et j'ai pu dupliquer la chose pour mes deux autres critères, et ça marche !

    Merci beaucoup à vous 2 pour votre patience (et maintenant je vais prendre l'air !)

  15. #35
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    Je reviens sur cette discussion car je viens de constater qu'il y a un problème dans son exécution... lorsque je ne coche des cases que dans UN des critères (communes, périodes ou thématiques), tout va bien.
    Par contre, quand j'essaie de les combiner, à 2 ou 3, quels qu'ils soient, j'obtiens le message d'erreur " Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number in D:\wamp64\www\interviews\resultats.php on line 136"
    J'avoue que je ne comprends pas pourquoi...
    Si quelqu'un peut m'éclairer, merci beaucoup !

    Code du formulaire :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    <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>&nbsp;<em>(cliquez pour afficher / masquer les options)</em></summary>					
              <fieldset>
                <h5>Communes</h5>
                <em>(du territoire de l'Agglo)</em>
                <p style="font-size: small;">
                </p>
                <div class="options-recherche">
                  <div class="flex">
                    <ul class="liste-recherche">
                      <li><label><input type="checkbox" name="communes[]" value="Champenard" />&nbsp;Champenard</label></li>
                      <li><label><input type="checkbox" name="communes[]" value="Les-Trois-Lacs" />&nbsp;Les-Trois-Lacs</label></li>
                      <li><label><input type="checkbox" name="communes[]" value="Saint-Didier-des-Bois" />&nbsp;Saint-Didier-des-Bois</label></li>
                      <li><label><input type="checkbox" name="communes[]" value="Villers-sur-le-Roule" />&nbsp;Villers-sur-le-Roule</label></li>
                      <li><label><input type="checkbox" name="communes[]" value="Vironvay" />&nbsp;Vironvay</label></li>
                      <li><label><input type="checkbox" name="communes[]" value="Vraiville" />&nbsp;Vraiville</label></li>					
                    </ul>
                  </div>
                </div>
              </fieldset>
     
              <fieldset>
                <h5>Périodes</h5>
                <div class="options-recherche">
                  <div class="flex">
                    <ul class="liste-recherche">
                      <li><label><input type="checkbox" name="periodes[]" value="1900-1914" />&nbsp;1900-1914</label></li>
                      <li><label><input type="checkbox" name="periodes[]" value="Première Guerre mondiale" />&nbsp;Première Guerre mondiale</label></li>
                      <li><label><input type="checkbox" name="periodes[]" value="Entre deux guerres" />&nbsp;Entre deux guerres</label></li>
                      <li><label><input type="checkbox" name="periodes[]" value="Seconde Guerre mondiale" />&nbsp;Seconde Guerre mondiale</label></li>
                      <li><label><input type="checkbox" name="periodes[]" value="Années 1950" />&nbsp;Années 1950</label></li>
                      <li><label><input type="checkbox" name="periodes[]" value="Années 1960" />&nbsp;Années 1960</label></li>
                      <li><label><input type="checkbox" name="periodes[]" value="Années 1970" />&nbsp;Années 1970</label></li>
                      <li><label><input type="checkbox" name="periodes[]" value="1980 à nos jours" />&nbsp;1980 à nos jours</label></li>
                    </ul>
                  </div>
                </div>
              </fieldset>
     
              <fieldset>
                <h5>Thématiques</h5>
                <div class="options-recherche">
                  <div class="flex">
                    <ul class="liste-recherche">
                      <li><label><input type="checkbox" name="thematiques[]" value="Faune" />&nbsp;Faune</label></li>
                      <li><label><input type="checkbox" name="thematiques[]" value="Flore" />&nbsp;Flore</label></li>
                      <li><label><input type="checkbox" name="thematiques[]" value="Histoire" />&nbsp;Histoire</label></li>
                      <li><label><input type="checkbox" name="thematiques[]" value="Légendes" />&nbsp;Légendes</label></li>
                      <li><label><input type="checkbox" name="thematiques[]" value="Vie quotidienne" />&nbsp;Vie quotidienne</label></li>
                    </ul>
                  </div>
                </div>
              </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" />&nbsp;Afficher tous les résultats</label></li>
                    <li><label><input type="radio" name="avecVideo" value="1" />&nbsp;Vidéo obligatoire</label></li>
                    <li><label><input type="radio" name="avecVideo" value="0" />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
                    <li><label><input type="radio" name="avecAudio" value="1" />&nbsp;Audio obligatoire</label></li>
                    <li><label><input type="radio" name="avecAudio" value="0" />&nbsp;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" />&nbsp;Afficher tous les résultats</label></li>
                    <li><label><input type="radio" name="avecDocuments" value="1" />&nbsp;Documents présentés obligatoires</label></li>
                    <li><label><input type="radio" name="avecDocuments" value="0" />&nbsp;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>
    Code de la page de traitement :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    try {
        $pdo = new PDO('mysql:host=localhost;dbname=interviews;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 section "mots-clés"
     
    if (isset($_POST['motscles'])) { 
        $data[':motscles'] = '%'.$_POST['motscles'].'%';
        $where[]           = 'i.retranscription LIKE :motscles';
    }
     
     
    // traitement des trois critères d'indexation
     
    // générateur de tag PDO
    $tag = function(): string {
        // majuscule minuscule digit
        return ':'.chr(mt_rand(65, 90)).chr(mt_rand(97, 122)).mt_rand(1, 1000);
    };
     
    $where_in = [];
     
    // traitement de la section "Communes"
     
    if (isset($_POST['communes'])) {
        foreach ($_POST['communes'] as $comm) {
            $t          = $tag();
            $data[$t]   = $comm;
            $where_in[] = $t; 
        }
        $where[] = ' c.nom IN ('.implode(',', $where_in).')';
    }
     
     
    // traitement de la section "Périodes"
     
    if (isset($_POST['periodes'])) {
        foreach ($_POST['periodes'] as $per) {
            $t          = $tag();
            $data[$t]   = $per;
            $where_in[] = $t; 
        }
        $where[] = ' p.nom IN ('.implode(',', $where_in).')';
    }
     
     
    // traitement de la section "Thématiques"
     
    if (isset($_POST['thematiques'])) {
        foreach ($_POST['thematiques'] as $mat) {
            $t          = $tag();
            $data[$t]   = $mat;
            $where_in[] = $t; 
        }
        $where[] = ' m.nom IN ('.implode(',', $where_in).')';
    }
     
     
    // 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);
     
     
    // préparation puis exécution de la requête
     
    $sql = <<<sql
    SELECT GROUP_CONCAT( DISTINCT CONCAT(t.civilite, ' ', t.prenom, ' ', t.nom, ', ', t.qualite) ORDER BY t.nom SEPARATOR ' ~~ ') AS groupe, i.id, i.nom_fichier
    FROM temoins t
    INNER JOIN asso_temoins as at  ON at.temoin_id  = t.id
    INNER JOIN temoignages  i   ON i.id             = at.temoignage_id
    LEFT JOIN asso_communes ac  ON ac.temoignage_id = i.id
    LEFT JOIN communes c        ON c.id             = ac.commune_id
    LEFT JOIN asso_periodes ap  ON ap.temoignage_id = i.id
    LEFT JOIN periodes p        ON p.id             = ap.periode_id
    LEFT JOIN asso_matieres am  ON am.temoignage_id = i.id
    LEFT JOIN matieres m        ON m.id             = am.matiere_id
    {$where}
    GROUP BY i.id
    ORDER BY i.nom_fichier
    sql;
     
    $stmt = $pdo->prepare($sql);
    $exec = $stmt->execute($data);
    $data = $stmt->fetchAll();
     
     
    // affichage des résultats
     
    if (empty($data)) {
       echo 'Aucun résultat<br /><a href="recherche.php">Nouvelle recherche</a>';
    } else {
        $nb = count($data);
        echo '<p>', $nb, ' résultat', ($nb > 1) ? 's' : '', '&nbsp;:</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&nbsp;{$hsc($v['groupe'])}</a></p>
    html;
        }
    }
     
    ?>

  16. #36
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il faut réinitialiser $where_in a chaque fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $where_in = [];
    if (isset($_POST['periodes'])) {
       foreach ($_POST['periodes'] as $per) {
    ...
       }
    }
    $where_in = [];
    ...

  17. #37
    Futur Membre du Club
    Homme Profil pro
    Conseil en assistance à maîtrise d'ouvrage
    Inscrit en
    Juin 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Conseil en assistance à maîtrise d'ouvrage

    Informations forums :
    Inscription : Juin 2019
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Ah mais oui bien sûr ! (je relisais les implode mais c'était correct...) merci beaucoup, ça marche !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Interbase requête SQL qui ne fonctionne pas
    Par colorid dans le forum InterBase
    Réponses: 6
    Dernier message: 20/11/2007, 17h36
  2. Requête hibernate qui ne fonctionne pas
    Par sheura dans le forum Hibernate
    Réponses: 4
    Dernier message: 28/09/2007, 16h20
  3. requête match qui ne fonctionne pas.
    Par sam01 dans le forum Requêtes
    Réponses: 3
    Dernier message: 29/05/2006, 20h28
  4. [MySQL] Requête update qui ne fonctionne pas
    Par Sylvain245 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/12/2005, 16h40
  5. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo