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

Langage PHP Discussion :

Vérifier un champ radio


Sujet :

Langage PHP

  1. #21
    Invité
    Invité(e)
    Par défaut
    OK.
    Donc pas incompatible avec le code que je t'ai donné (utilisation de la SESSION pour les erreurs).


    N.B. Pour info : suppose que short_open_tag soit à "on" dans le php.ini.
    Attention à la portabilité sur un server externe (hébergement), où short_open_tag peut être à "off" par défaut.

  2. #22
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Salut, Je reviens vers vous, mon projet avance mais je rencontre un petit problème..

    J'ai remplacé les champs radio par des champs checkbox et la.. aucune erreur mais sur le vardump je ne vois pas plusieurs sélections mais seulement la dernière dans la liste d'une checkbox.. je ne sais pas si je suis très précis dans mes explications.. voici mon code (explication plus bas) :

    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
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    <?php
     
    // array
    $array_origine = array('Européenne', 'Africaine', 'Asiatique', 'Arabe', 'Indienne', 'Hispanique', 'Autre', 'Sans importance');
    $array_religion = array('Protestante', 'Catholique', 'Musulmane', 'Juive', 'Bouddhiste', 'Orthodoxe', 'Autre', 'Croyante, non pratiquante', 'Ni croyante, ni pratiquante', 'Sans importance');
    $array_consommation_tabac = array('Jamais', 'Plusieurs fois dans l\'année', 'Environ une fois par semaine', 'Plusieurs fois par semaine', 'Plusieurs fois par jour');
    $array_consommation_alcool = array('Jamais', 'Plusieurs fois dans l\'année', 'Environ une fois par semaine', 'Plusieurs fois par semaine', 'Plusieurs fois par jour');
    $array_nombre_enfants = array('Oui', 'Non');
     
    // Initialisation / Récupération
    $recherche_origine = (isset($_POST['recherche_origine']))? $_POST['recherche_origine'] : '';
    $recherche_religion = (isset($_POST['recherche_religion']))? $_POST['recherche_religion'] : '';
    $recherche_consommation_tabac = (isset($_POST['recherche_consommation_tabac']))? $_POST['recherche_consommation_tabac'] : '';
    $recherche_consommation_alcool = (isset($_POST['recherche_consommation_alcool']))? $_POST['recherche_consommation_alcool'] : '';
    $recherche_nombre_enfants = (isset($_POST['recherche_nombre_enfants']))? $_POST['recherche_nombre_enfants'] : '';
     
    // Traitement form
    if(!empty($_POST)){
     
        if (empty($recherche_origine)) {
            $_SESSION['flash']['danger'] = 'De quelle origine souhaitez-vous que la personne que vous recherchez soit ?';
        } elseif (!in_array($recherche_origine, $array_origine)) {
            $_SESSION['flash']['danger'] = 'De quelle origine souhaitez-vous que la personne que vous recherchez soit ? Veuillez répondre à la question.';
        }
     
        if (empty($recherche_religion)) {
            $_SESSION['flash']['danger'] = 'De quelle religion souhaiteriez-vous que la personne que vous recherchez soit ?';
        } elseif (!in_array($recherche_religion, $array_religion)) {
            $_SESSION['flash']['danger'] = 'De quelle religion souhaiteriez-vous que la personne que vous recherchez soit ? Veuillez répondre à la question.';
        }
     
        if (empty($recherche_consommation_tabac)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous que la personne que vous recherchez fume ?';
        } elseif (!in_array($recherche_consommation_tabac, $array_consommation_tabac)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous que la personne que vous recherchez fume ? Veuillez répondre à la question.';
        }
     
        if (empty($recherche_consommation_alcool)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous que la personne que vous recherchez consomme de l\'alcool ?';
        } elseif (!in_array($recherche_consommation_alcool, $array_consommation_alcool)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous que la personne que vous recherchez consomme de l\'alcool ? Veuillez répondre à la question.';
        }
     
        if (empty($recherche_nombre_enfants)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous une personne qui vit avec des enfants de moins de 18 ans ?';
        } elseif (!in_array($recherche_nombre_enfants, $array_nombre_enfants)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous une personne qui vit avec des enfants de moins de 18 ans ? Veuillez répondre à la question.';
        }
     
        var_dump($_POST);
    }
    ?>
     
    <div class="page-header">
        <h1>Recherche avancée</h1>
    </div>
     
    <form action="" method="POST">
     
        <div class="form-group">
            <label>De quelle origine souhaitez-vous que la personne que vous recherchez soit ?</label>
            <?php
            foreach($array_origine as $origine) // on parcourt l'array des origines (défini plus haut).
            {
                $checked = ($recherche_origine == $origine)? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_origine" value="<?php echo $origine; ?>" <?php echo $checked; ?>/><?php echo $origine; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_religion">De quelle religion souhaiteriez-vous que la personne que vous recherchez soit ?</label>
            <?php
            foreach($array_religion as $religion) // on parcourt l'array des religions (défini plus haut).
            {
                $checked = ($recherche_religion == $religion)? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_religion" value="<?php echo $religion; ?>" <?php echo $checked; ?>/><?php echo $religion; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_consommation_tabac">Accepteriez-vous que la personne que vous recherchez fume ?</label>
            <?php
            foreach($array_consommation_tabac as $consommation_tabac) // on parcourt l'array (défini plus haut).
            {
                $checked = ($recherche_consommation_tabac == $consommation_tabac)? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_consommation_tabac" value="<?php echo $consommation_tabac; ?>" <?php echo $checked; ?>/><?php echo $consommation_tabac; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_consommation_alcool">Accepteriez-vous que la personne que vous recherchez consomme de l'alcool ?</label>
            <?php
            foreach($array_consommation_alcool as $consommation_alcool) // on parcourt l'array (défini plus haut).
            {
                $checked = ($recherche_consommation_alcool == $consommation_alcool)? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_consommation_alcool" value="<?php echo $consommation_alcool; ?>" <?php echo $checked; ?>/><?php echo $consommation_alcool; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_nombre_enfants">Accepteriez-vous une personne qui vit avec des enfants de moins de 18 ans ?</label>
            <?php
            foreach($array_nombre_enfants as $nombre_enfants) // on parcourt l'array (défini plus haut).
            {
                $checked = ($recherche_nombre_enfants == $nombre_enfants)? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_nombre_enfants" value="<?php echo $nombre_enfants; ?>" <?php echo $checked; ?>/><?php echo $nombre_enfants; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <button type="submit" class="btn btn-default">Submit</button>
    </form>
    Par exemple : pour le premier checkbox "De quelle origine souhaitez-vous que la personne que vous recherchez soit ?" je sélectionne les 3 premiers donc :
    Européenne
    Africaine
    Asiatique

    et le vardump m'affiche uniquement le dernier coché donc Asiatique

  3. #23
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    • des boutons "radio" ne permettent qu'un seul choix -> 1 valeur
    • des cases "checkbox" permettent plusieurs choix -> 1 array de valeurs


    dans le cas de "checkbox",
    1/ input : le name doit comporter des []
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        <input type="checkbox" name="recherche_origine[]" value="<?php echo $origine; ?>" <?php echo $checked; ?>/><?php echo $origine; ?>
    2/ on doit réceptionner un array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $recherche_origine = (isset($_POST['recherche_origine']))? $_POST['recherche_origine'] : array(); // checkbox -> array
    3/ Affichage, traitement,...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach( $recherche_origine as $ce_choix_origine )
    {
      echo '<p>origine : '.$ce_choix_origine.'</p>';
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ou   echo '<p>origine(s) : '.implode( ', ', $recherche_origine).'</p>';
    4/ lors du ré-affichage dans le formulaire (cases cochées), on doit comparer non plus avec une valeur mais avec un array (voir-> in_array()) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             foreach($array_origine as $origine) // on parcourt l'array des origines (défini plus haut).
            {
               $checked = ( in_array($origine, $recherche_origine) )? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).

  4. #24
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    j'ai une erreur à coté de chaque choix checkbox :
    Warning: in_array() expects parameter 2 to be array, string given in C:\wamp\www\site2\controller\recherche_avancee.php on line 72
    ligne 72 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $checked = (in_array($recherche_origine, $origine))? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
    APERÇU des modifs :

    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
    <?php
     
    // array
    $array_origine = array('Européenne', 'Africaine', 'Asiatique', 'Arabe', 'Indienne', 'Hispanique', 'Autre', 'Sans importance');
     
    // Initialisation / Récupération
    //$recherche_origine = (isset($_POST['recherche_origine']))? $_POST['recherche_origine'] : '';
    $recherche_origine = (isset($_POST['recherche_origine']))? $_POST['recherche_origine'] : array(); // checkbox -> array
     
    // Traitement form
    if(!empty($_POST)){
     
        if (empty($recherche_origine)) {
            $_SESSION['flash']['danger'] = 'De quelle origine souhaitez-vous que la personne que vous recherchez soit ?';
        } elseif (!in_array($recherche_origine, $array_origine)) {
            $_SESSION['flash']['danger'] = 'De quelle origine souhaitez-vous que la personne que vous recherchez soit ? Veuillez répondre à la question.';
        }
     
        var_dump($_POST);
    }
    ?>
     
    <h1>Recherche avancée</h1>
     
    <form action="" method="POST">
     
        <div class="form-group">
            <label>De quelle origine souhaitez-vous que la personne que vous recherchez soit ?</label>
            <?php
            foreach($array_origine as $origine) // on parcourt l'array des origines (défini plus haut).
            {
                $checked = (in_array($recherche_origine, $origine))? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_origine[]" value="<?php echo $origine; ?>" <?php echo $checked; ?>/><?php echo $origine; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <button type="submit" class="btn btn-default">Submit</button>
    </form>

  5. #25
    Invité
    Invité(e)
    Par défaut
    Ce n'est pourtant pas difficile de faire un copier-coller... (tu es tombé dans le piège tête baissée !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $checked = ( in_array($origine, $recherche_origine) )? ..........
    ...ni de LIRE LA DOC.
    Dernière modification par Invité ; 11/05/2016 à 16h12.

  6. #26
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    fonctionne parfaitement.

    oui j'avoue que sur ce coup la, j'ai merdé ! j'aime bien ré-écrire le code pour bien assimiler les choses.

    par contre je ne comprends pas la partie 3 de ton exemple ? c'est pour les verifs ?

    au niveau des verifs..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (empty($recherche_origine)) {
            $_SESSION['flash']['danger'] = 'De quelle origine souhaitez-vous que la personne que vous recherchez soit ?';
        } elseif (!in_array($recherche_origine, $array_origine)) {
            $_SESSION['flash']['danger'] = 'De quelle origine souhaitez-vous que la personne que vous recherchez soit ? Veuillez répondre à la question.';
        }
    j'ai pas très bien compris comment faire les verifs je te rassure j'ai lu la doc avant même d'envisager de t'écrire.

  7. #27
    Invité
    Invité(e)
    Par défaut
    Le 3/ est juste un "ré-affichage de contrôle" des données transmises (au lieu du var_dump).
    Pas de rapport avec la "gestion d'erreur".
    Juste 2 façons différentes d'afficher les données provenant d'un array :
    • soit avec foreach(....)
    • soit avec implode(....)

    Sit tu as copié-collé (!) ce que j'ai écrit, tu devrais pouvoir le tester !

    Cela dit, il faut bien que tu traites les données que tu reçois : enregistrement en BdD,....

  8. #28
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    oui c'est évident, je vais enregistrer les données dans ma table mais avant je me concentre sur les vérifs des checkbox et pour le moment.. c'est pas gagné !

    Que je coche une ou plusieurs checkbox, il m'affiche toujours ERREUR 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (empty($recherche_origine)) {
            $_SESSION['flash']['danger'] = 'ERREUR NIVEAU 1';
        } elseif (!in_array($recherche_origine, $array_origine)) {
            $_SESSION['flash']['danger'] = 'ERREUR NIVEAU 2';
        }

  9. #29
    Invité
    Invité(e)
    Par défaut
    $recherche_origine est un ARRAY !

    Il faut modifier la condition pour comparer TOUTES les valeurs : foreach(...)...

    Cela dit, cette vérification est ridicule.
    Quel intérêt pour un "pseudo-hacker" de "détourner" ton formulaire pour en modifier ces valeurs ?
    Ridicule, inutile, sans intérêt = une perte de temps...
    Et une fausse impression de sécurité.

  10. #30
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    si la vérif complète est longue à faire ok donc selon toi aucun risque de faille plus grave par la suite si un utilisateur modifie les choix checkbox ??

    Je compte enregistrer chaque array dans une colonne de ma table donc je sécurise quand même avec htmlspecialchars n'est-ce pas ? car le tableau devient une chaîne avec implode.. enfin si j'ai bien compris ? je viens de lire la doc php sur le implode la.

    si oui, ou je place le htmlspecialchars ? dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $insertion_bdd_origine = implode( ', ', $recherche_origine);
    la variable $insertion_bdd_origine me servira dans la requete sql.

    Et sinon comme vérif je laisse donc uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (empty($recherche_origine)) {
       $_SESSION['flash']['danger'] = 'ERREUR NIVEAU 1';
    }

  11. #31
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1/ la SEULE chose à faire pour sécuriser les données pour insertion/modification en BdD est une requête préparée.
    2/ la SEULE chose à faire pour sécuriser les données à l'AFFICHAGE est d'utiliser htlmentities().

    3/ STOP !
    As-tu réfléchi à LA SUITE du programme ? à la CONCEPTION ?
    C'est bien beau d'enregistrer des trucs en BdD. Mais as-tu réfléchi à leur traitement par la suite ?
    • Comment faire une sélection/recherche selon un(des) critère(s) particulier(s) ?
    • comment modifier ces critères de sélection ? Comment en ajouter ?

    Actuellement, tu écris "en dur" des array : es-ce judicieux ? pratique ?
    Réponse : NON.
    Ce n'est pas la meilleure méthode. (et une erreur classique de padawan)

    BONNE METHODE :
    Prenons l'exemple de l'origine :

    1/ on crée une TABLE en Bdd
    "T_USE_ORIGINES"
    • id_origine (int auto-incrément)
    • nom_origine (varchar)

    On peut alors facilement ajouter/modifier/supprimer une origine dans cette TABLE.
    Et, pourquoi pas, gérer plusieurs langues :
    • nom_origine_fr (varchar)
    • nom_origine_en (varchar)



    2/ Pour l'affichage des options/checkbox/radio :
    • On parcourt cette TABLE
    • on mets l'IDENTIFIANT dans la value="..." !


    3/ On récupère... les IDENTIFIANTS id_origine (et pas les noms)

    4/ Ce sont ces identifiants qu'on enregistre :
    • soit directement dans la TABLE "T_USE_USERS" (SI c'est un critères unique)
    • soit dans une TABLE de JOINTURE (S'IL existe PLUSIEURS choix possible -> cas des checkbox)

    qu'est-ce qu'une TABLE de JOINTURE ?
    ex. T_USE_ORIGINES_JOIN : cette table relie les identifiants des USERS aux identifiants des ORIGINES
    • id_user (int)
    • id_origine (int)


    5/ Réaffichage
    En fonction de l'(des) identifiants enregistrés (id_origine), on récupère via une requête les noms (nom_origine).

    6/ Recherche d'un critère ?
    pour le <select>, idem, on met l'identifiant comme value="..." des options.
    La requête se fait alors sur cet IDENTIFIANT.

    EN CLAIR : au lieu de foncer tête baissé, de t'arrêter à chaque obstacle pour te demander "et maintenant, je fais quoi ?"
    => ARRETE DE CODER ET REFLECHIS.
    => PRENDS UN PAPIER ET UN CRAYON ET ECRIS.

    La REFLEXION et une BONNE CONCEPTION représente 80% du travail.
    CODER vient après.
    Dernière modification par Invité ; 12/05/2016 à 08h09.

  12. #32
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Salut,

    Alors.. merci pour ton post que j'ai lu attentivement. J'ai clairement moins d'expérience que toi en programmation et technique de conception mais laisse moi te dire qu'avant de commencer mon script j'ai bien pris un crayon et une feuille de papier pour en effet écrire mes idées et mon schéma de conception (qu'il soit bon ou mauvais). Je ne suis pas du genre à foncer tête baissé.

    bon.. maintenant parlons de la conception justement :

    Actuellement, tu écris "en dur" des array : es-ce judicieux ? pratique ?
    Réponse : NON.
    Ce n'est pas la meilleure méthode. (et une erreur classique de padawan)

    BONNE METHODE :
    Prenons l'exemple de l'origine :

    1/ on crée une TABLE en Bdd
    "T_USE_ORIGINES"
    id_origine (int auto-incrément)
    nom_origine (varchar)

    On peut alors facilement ajouter/modifier/supprimer une origine dans cette TABLE.
    Ce n'est peut-être pas la meilleure méthode ok, mais selon moi une table est utile (que) si les données sont susceptible d'être ajouter/modifier/supprimer et la.. ce n'est pas le cas pour les origines ! Pourquoi je serai amené à modifier la liste des origines par la suite ? La liste ne changera jamais.. donc pourquoi faire une table avec la liste des origines ? un simple tableau suffit amplement, tu ne trouve pas toi ? (a mon sens). Et de plus, ça n’empêche pas d'utiliser des identifiants d'origines avec un tableau comme dans le premier exemple sur la doc types.array.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    // le tableau avec identifiant + nom
    $array = array(
        1 => "nom 1",
        2 => "nom 2",
        3 => "nom 3",
        4 => "nom 3",
    );
    var_dump($array);
     
    // Conversion et création d'une variable pour l'enregistrement des données
    $test = implode( ', ', $array);
    ?>
    Le format d'enregistrement dans la table :
    Les données (par exemple pour les origines acceptées par le membre) vont être enregistré dans la table preferences_membres sous la forme (exemple) : 1, 3, 6

    Pour la recherche :
    Pour rechercher dans la bdd j'ai pensé à LIKE ? ce n'est peut-être pas adapté et lourd en ressources surement mais mes compétences s’arrêtent lâ.

    Pour l'affichage :
    Par exemple si je veux afficher les origines que le membre xy accepte de rencontrer alors je compare le tableau plus haut et je sais donc que 1 = Européenne.

  13. #33
    Invité
    Invité(e)
    Par défaut
    Une TABLE des ORIGINES sera bien plus pratique par la suite :
    • module de recherche par origine
    • gestion ajouter/modifier/supprimer : tu ne sais pas encore si c'est utile ou pas, mais c'est mieux de le prévoir.
    • gestion en plusieurs langues
    • ...

    Mais c'est toi qui voit

    N.B. Si ce sont bien les index de ton array que tu enregistres en BDD, ça devrait le faire aussi

    Mais dans ce cas, il est possible de déclarer l'array comme CONSTANTE (depuis PHP 5.6.0) :
    Depuis PHP 5.6, il est possible de définir des constantes de tableaux en utilisant le mot clé const
    et, depuis PHP 7, les constantes de tableaux peuvent aussi être définies en utilisant define().
    Vous pouvez utiliser des tableaux dans les expressions scalaires des constantes (par exemple, const FOO = array(1,2,3)[0], mais le résultat final doit être une valeur scalaire de type autorisé.
    Exemple #2 :
    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
    <?php
    // Fonctionne depuis PHP 5.3.0
    const CONSTANT = 'Bonjour le monde !';
     
    echo CONSTANT;
     
    // Fonctionne depuis PHP 5.6.0
    const ANOTHER_CONST = CONSTANT.'; Aurevoir le monde !';
    echo ANOTHER_CONST;
     
    const ANIMALS = array('chien', 'chat', 'oiseaux');
    echo ANIMALS[1]; // affiche "chat"
     
    // Fonctione depuis PHP 7
    define('ANIMALS', array(
        'chien',
        'chat',
        'oiseaux'
    ));
    echo ANIMALS[1]; // affiche "chat"
    ?>
    Dernière modification par Invité ; 12/05/2016 à 17h35.

  14. #34
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Merci pour tes encouragements et ton aide précieuse aussi car grâce à toi j'avance bien. Doucement mais surement...

    oui en effet, comme je compte utiliser les tableaux sur 3 ou 4 pages du script donc oui bonne idée pour les constantes array.. il serait bien de mettre les tableaux dans un fichier commun.. par exemple peut-être le fichier de functions généraliste du script ? ainsi je me répète pas..

    Je voulais aussi te montrer l'évolution de la fameuse page de critères de recherche.

    oui oui quasi l’après-midi entière.. je suis lent mais j'apprends

    bon, la voici :

    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
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    <?php
    logged_only(); // Vérifie si le membre est connecté.
     
    $titre = 'Recherche avancée'; // titre meta
     
    $user_id = $_SESSION['auth']->id; // Récupère l'id du membre connecté.
     
    // array
    $array_origine = array('Européenne', 'Africaine', 'Asiatique', 'Arabe', 'Indienne', 'Hispanique', 'Autre', 'Sans importance');
    $array_religion = array('Protestante', 'Catholique', 'Musulmane', 'Juive', 'Bouddhiste', 'Orthodoxe', 'Autre', 'Croyante, non pratiquante', 'Ni croyante, ni pratiquante', 'Sans importance');
    $array_consommation_tabac = array('Jamais', 'Plusieurs fois dans l\'année', 'Environ une fois par semaine', 'Plusieurs fois par semaine', 'Plusieurs fois par jour');
    $array_consommation_alcool = array('Jamais', 'Plusieurs fois dans l\'année', 'Environ une fois par semaine', 'Plusieurs fois par semaine', 'Plusieurs fois par jour');
    $array_nombre_enfants = array('Oui', 'Non');
     
    // Initialisation / Récupération
    $recherche_origine = (isset($_POST['recherche_origine']))? $_POST['recherche_origine'] : array(); // checkbox -> array
    $recherche_religion = (isset($_POST['recherche_religion']))? $_POST['recherche_religion'] : array();
    $recherche_consommation_tabac = (isset($_POST['recherche_consommation_tabac']))? $_POST['recherche_consommation_tabac'] : array();
    $recherche_consommation_alcool = (isset($_POST['recherche_consommation_alcool']))? $_POST['recherche_consommation_alcool'] : array();
    $recherche_nombre_enfants = (isset($_POST['recherche_nombre_enfants']))? $_POST['recherche_nombre_enfants'] : '';
     
    // Traitement form
    if(!empty($_POST)){
     
        if (empty($recherche_origine)) {
            $_SESSION['flash']['danger'] = 'De quelle origine souhaitez-vous que la personne que vous recherchez soit ?';
        }
     
        if (empty($recherche_religion)) {
            $_SESSION['flash']['danger'] = 'De quelle religion souhaiteriez-vous que la personne que vous recherchez soit ?';
        }
     
        if (empty($recherche_consommation_tabac)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous que la personne que vous recherchez fume ?';
        }
     
        if (empty($recherche_consommation_alcool)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous que la personne que vous recherchez consomme de l\'alcool ?';
        }
     
        if (empty($recherche_nombre_enfants)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous une personne qui vit avec des enfants de moins de 18 ans ?';
        } elseif (!in_array($recherche_nombre_enfants, $array_nombre_enfants)) {
            $_SESSION['flash']['danger'] = 'Accepteriez-vous une personne qui vit avec des enfants de moins de 18 ans ? Veuillez répondre à la question.';
        }
     
        if(empty($_SESSION['flash'])) {
            $req = $pdo->prepare("INSERT INTO recherche_avancee SET idmbr = ?, origine = ?, religion = ?, tabac = ?, alcool = ?, enfants = ?");
     
            // Conversion et création de variables pour l'insertion des données dans la table.
            $bdd_origine = implode( ', ', $recherche_origine);
            $bdd_religion = implode( ', ', $recherche_religion);
            $bdd_tabac = implode( ', ', $recherche_consommation_tabac);
            $bdd_alcool = implode( ', ', $recherche_consommation_alcool);
     
            $req->execute([$user_id, $bdd_origine, $bdd_religion, $bdd_tabac, $bdd_alcool, $_POST['recherche_nombre_enfants']]);
     
            $_SESSION['flash']['success'] = 'Vos critères de recherche ont bien été enregistrés.';
        }
     
        var_dump($_POST); // Un var_dump toujours pour les tests..
    }
    ?>
     
    <div class="page-header">
        <h1>Recherche avancée</h1>
    </div>
     
    <form action="" method="POST">
     
        <div class="form-group">
            <label>De quelle origine souhaitez-vous que la personne que vous recherchez soit ?</label>
            <?php
            foreach($array_origine as $libelle_origine => $origine) // on parcourt l'array des origines (défini plus haut).
            {
                $checked = (in_array($origine, $recherche_origine))? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_origine[]" value="<?php echo $libelle_origine; ?>" <?php echo $checked; ?>/><?php echo $origine; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_religion">De quelle religion souhaiteriez-vous que la personne que vous recherchez soit ?</label>
            <?php
            foreach($array_religion as $libelle_religion => $religion) // on parcourt l'array des religions (défini plus haut).
            {
                $checked = (in_array($religion, $recherche_religion))? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_religion[]" value="<?php echo $libelle_religion; ?>" <?php echo $checked; ?>/><?php echo $religion; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_consommation_tabac">Accepteriez-vous que la personne que vous recherchez fume ?</label>
            <?php
            foreach($array_consommation_tabac as $libelle_consommation_tabac => $consommation_tabac) // on parcourt l'array (défini plus haut).
            {
                $checked = (in_array($consommation_tabac, $recherche_consommation_tabac))? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_consommation_tabac[]" value="<?php echo $libelle_consommation_tabac; ?>" <?php echo $checked; ?>/><?php echo $consommation_tabac; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_consommation_alcool">Accepteriez-vous que la personne que vous recherchez consomme de l'alcool ?</label>
            <?php
            foreach($array_consommation_alcool as $libelle_consommation_alcool => $consommation_alcool) // on parcourt l'array (défini plus haut).
            {
                $checked = (in_array($consommation_alcool, $recherche_consommation_alcool))? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="checkbox">
                    <label>
                        <input type="checkbox" name="recherche_consommation_alcool[]" value="<?php echo $libelle_consommation_alcool; ?>" <?php echo $checked; ?>/><?php echo $consommation_alcool; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <div class="form-group">
            <label for="recherche_nombre_enfants">Accepteriez-vous une personne qui vit avec des enfants de moins de 18 ans ?</label>
            <?php
            foreach($array_nombre_enfants as $nombre_enfants) // on parcourt l'array (défini plus haut).
            {
                $checked = ($recherche_nombre_enfants == $nombre_enfants)? ' checked="checked"' : ''; // permet de cocher la sélection après traitement du formulaire (utile en cas d'erreur à corriger).
                ?>
                <div class="radio">
                    <label>
                        <input type="radio" name="recherche_nombre_enfants" value="<?php echo $nombre_enfants; ?>" <?php echo $checked; ?>/><?php echo $nombre_enfants; ?>
                    </label>
                </div>
                <?php
            }
            ?>
        </div>
     
        <button type="submit" class="btn btn-default">Submit</button>
    </form>
    le résultat des enregistrements..

    Nom : phpmyadmin.png
Affichages : 73
Taille : 49,1 Ko

    tu as des suggestions ? ou améliorations ?

    sinon je ne sais pas comment enregistrer dans la table l'index de recherche_nombre_enfants ET en même temps pouvoir faire la vérif plus haut.. car le champ est en radio, je n'ai pas réussi moi en tout cas.

    Merci.

  15. #35
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    2 solutions pour enregistrer les valeurs en Bdd : la BONNE et la MOINS BONNE.

    SOLUTION 1 : La MOINS BONNE = celle que tu utilises
    • lister dans un seul champs les valeurs possibles sous forme de liste
      ex. 1,25,45,378


    Problème : Comment faire pour trouver une valeur dans un telle liste (on ne peut pas utiliser SELECT ... IN (...)) ?
    Réponse ICI : FIND_IN_SET
    IMPORTANT : séparateur => virgule (SANS espaces)


    SOLUTION 2 : la BONNE
    • les TABLES de JOINTURE

    Ex.
    T_ORIGINE_JOIN
    • id_user
    • id_origine

    1 seule ligne par origine, plusieurs lignes pour lister toutes les origines d'un user.

    Requête de recherche :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    "SELECT * 
       FROM T_USER U
       INNER JOIN T_ORIGINE_JOIN OJ
       ON U.id_user = OJ.id_user
       WHERE OJ.id_origine =..."


    Remarque : d'où, encore une fois, l'intérêt de créer AUSSI la TABLE des ORIGINES ( utile dans une requête SQL).

  16. #36
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Je viens de comprendre ton système..

    mais donc pour chaque critères je dois créer une table différente si j'ai bien compris..
    donc une table :
    T_ORIGINE_JOIN
    T_RELIGION_JOIN
    T_TABAC_JOIN
    T_ALCOOL_JOIN
    et T_ENFANTS_JOIN pas besoin si ? car il comporte uniquement oui ou non en choix.

    donc 4 ou 5 tables en plus..

    et si je lis correctement ton message a la fin :

    Remarque : d'où, encore une fois, l'intérêt de créer AUSSI la TABLE des ORIGINES ( utile dans une requête SQL).
    Je dois aussi lister chaque critère possible dans une autre table donc 10 tables à créer en tout ???

    pouh.. Je ne sais plus trop quoi faire moi, je suis un peu dépassé par cette partie du script.. pourtant je suis sur cette page depuis 15 jours.

  17. #37
    Invité
    Invité(e)
    Par défaut
    Re.

    C'est plus complexe a mettre en place, mais ce sera plus pratique a l'usage.


    Il n'est pas difficile de recreer les array avec fetchAll().
    Donc ca ne modifiera pas trop ton code.

    Par contre tu y gagneras ensuite sur les requetes de recherches...


    N.B. Pour les booleens 0/1 - oui/non, un simple champ suffit.
    Idem pour tabac/alcool : on ne coche qu'une case normalement, non ?
    A moins que ce ne soient les criteres qu'on recherche chez l'autre, c'est ca ?
    Dernière modification par Invité ; 15/05/2016 à 23h51.

  18. #38
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Juillet 2015
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juillet 2015
    Messages : 518
    Points : 184
    Points
    184
    Par défaut
    Non, pour tabac et alcool il y a plusieurs choix possible. Form :

    Recherche avancée :

    De quelle origine souhaitez-vous que la personne que vous recherchez soit ?
    Européenne
    Africaine
    Asiatique
    Arabe
    Indienne
    Hispanique
    Autre
    Sans importance

    De quelle religion souhaiteriez-vous que la personne que vous recherchez soit ?
    Protestante
    Catholique
    Musulmane
    Juive
    Bouddhiste
    Orthodoxe
    Autre
    Croyante, non pratiquante
    Ni croyante, ni pratiquante
    Sans importance

    Accepteriez-vous que la personne que vous recherchez fume ?
    Jamais
    Plusieurs fois dans l'année
    Environ une fois par semaine
    Plusieurs fois par semaine
    Plusieurs fois par jour

    Accepteriez-vous que la personne que vous recherchez consomme de l'alcool ?
    Jamais
    Plusieurs fois dans l'année
    Environ une fois par semaine
    Plusieurs fois par semaine
    Plusieurs fois par jour

    Accepteriez-vous une personne qui vit avec des enfants de moins de 18 ans ?
    Oui
    Non
    ET il y a le même formulaire mais avec des boutons radio concernant les particularités de la personne elle-même (du membre connecté). tu comprends ? alors la, en effet comme avec les boutons radio = un choix possible par question donc impeccable et facile à faire.

    Mais pour le form des checkbox, il s'agit des critères de recherche. Donc avec ton système il y a bien 8 tables à créer.. et encore autant de tables si par la suite je souhaite proposer d'autres critères de recherches aux membres.. donc je ne sais pas quoi faire.. je suis complètement perdu

  19. #39
    Invité
    Invité(e)
    Par défaut
    La nuit porte conseil...

  20. #40
    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 : 48
    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
    Salut,

    Je ne pense pas que cela soit pertinent de créer une table pour presque chaque genre de question... C'est pas 10 ou 20 tables que t'auras à créer mais 100 ou 200 !
    Ta problématique est une excellente candidate pour une architecture de type EAV (Entité - Attribut - Valeur)
    Si tu optes pour ce choix et pour te faciliter la vie je te conseille de passer sur PostgreSql avec le type de donnée HStore (ça fait de merveilles)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [Mail] Comment vérifier un champs obligatoire ?
    Par casier dans le forum Langage
    Réponses: 25
    Dernier message: 17/11/2006, 09h34
  2. Champ radio vides
    Par allstar dans le forum Struts 1
    Réponses: 2
    Dernier message: 18/08/2006, 11h37
  3. controle champ radio
    Par clara2005 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/12/2005, 21h30
  4. [Formulaire] vérifier les champs avant enregistrement
    Par julien_t_m dans le forum Access
    Réponses: 5
    Dernier message: 16/10/2005, 20h53
  5. vérifier deux champs vides
    Par mikky dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/06/2005, 14h04

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