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 :

Création dynamique de formulaires


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut Création dynamique de formulaires
    Salut,

    Je planche actuellement sur une interface administrateur en PHP, en relation avec une base MySQL. Mon interface se compose d'un bon lot de formulaires crées dynamiquement en fonction du nombre de champs dans une table de la base de données. Pour couronner le tout, j'utilise des templates afin de bien séparer mon design de mon code.

    Bref, tout va bien jusque là. Seul problème, étant donné qu'une seule ligne de code suffit pour créer une dizaine de checkbox par exemple (ou des radios), comment les différencier ?

    Mon fichier .php qui crée le bloc pour les checkbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ($antecedent = mysql_fetch_assoc($result))
    {
    $template->assign_block_vars('antecedent',array(
    'LIBELLE_ANTECEDENT'=> $antecedent['LIBELLE_ANTECEDENT'],
    ));
    Mon fichier .tpl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <!-- BEGIN antecedent -->
     
    {antecedent.LIBELLE_ANTECEDENT} <input type="checkbox" name="antecedent" value="{antecedent.LIBELLE_ANTECEDENT}">
     
    <!-- END antecedent -->
    En fait, lorsque je veux récupérer la valeur d'une checkbox (si elle est cochée), tout va bien, mais lorsque il y a plusieurs checkbox cochées, c'est la dernière qui est prise en compte. Donc en fait, serait t-il possible de différencier chaque checkbox d'une autre afin de récupérer toutes les valeurs voulues ? Genre par une boucle qui assigne une valeur supplémentaire, un tableau ou une concaténation quelconque ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    en name met "antecedent[]" et tu recuperera le resultat en faisant $_POST["antecedent"][0],$_POST["antecedent"][1] etc ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Bah apparemment l'information n'est pas récupérée. :/ Rien ne s'affiche.

    Parce qu'en fait, je voudrais obtenir les valeurs des checkbox qui sont cochées. Dans la plupart des cas, l'utilisateur cochera plusieurs cases, donc comment faire pour enregistrer toutes les valeurs ? Faire une boucle qui enregistrera les valeurs des checkbox dans une variable ? Je signale au passage que ces données seront ensuite insérées dans une base de données. ^^

  4. #4
    Invité
    Invité(e)
    Par défaut
    a tu essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?
    for($i = 0;$i<$_POST["antecedent"];$i++){
    echo $_POST["antecedent"][$i]
    }?>
    ??

    sinon affiche moi le resultat de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <pre><?
    printr($_POST);
    ?></pre>

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Alors pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <pre><?
    printr($_POST);
    ?></pre>
    Le serveur me renvoie une Fatal Error, la fonction Printr n'étant pas définie. (faut toucher le php.ini pour activer une fonctionnalité ?).

    Et pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?
    for($i = 0;$i<$_POST["antecedent"];$i++){
    echo $_POST["antecedent"][$i]
    }?>
    Les valeurs cochées sont bien affichées ouai, mais l'éxecution est super longue, j'ai même une Fatal Error qui apparaît :

    Maximum Execution timùe of 30 seconds excedeed.

    La boucle semble donc être une solution, mais faut la retoucher pour que ce soit plus rapide je pense, mais je vois pas pourquoi c'est si long ? Est-ce parqu'elle vérifie tous les $_POST envisageables ? Et vu que j'ai une trentaine de checkbox sur la page, ça prendrait donc autant de temps ? Avec un Isset qui vérifie si des $_POST ont été envoyés, puis la boucle qui vient ensuite, ça serait mieux ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    desolé j'avai oublié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    <?
    for($i = 0;$i<sizeof($_POST["antecedent"]);$i++){
    echo $_POST["antecedent"][$i]
    }?>
    ça ne t'affiche que ceux qui sont cochés.

    EDIT : pour afficher un array c'est plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <pre><?
    print_r($_POST);
    ?></pre>
    encore désolé pour les faute d'orthographe

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Pas besoin de t'excuser, c'est déjà très sympa de ta part de m'aider.

    Alors j'ai essayé et donc...

    La boucle entraîne toujours la fatal error du maximum execution time. Ca affiche bien les valeurs des checkbox cochées mais ça prend un temps fou.

    La méthode print_r enregistre bien les valeurs cochées dans un tableau, mais déforme toute ma mise en page par la même occasion, c'est possible juste de les enregistrer sans les afficher ? Puis ensuite de les récupérer dans une requête sql dans un truc du genre :

    SELECT ID_ANTECEDENT from Antecedent
    WHERE Libelle_Antecedent = '".array[]."';

    Tiens au passage, c'est possible de faire des procédures en SQL ? J'en ai déjà fait en PL/SQL donc si c'est possible pourquoi pas tester comme ça.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tu peut faire des procedure en sql oui, va sur la doc de mysql tout y est bien expliqué.

    pour ce qui est d'enregistrer tu peut le faire avec un "IN" en sql. Donc il te faut parcourir ton tableau et créer une chaine du style "id1,id2,id3" et donc créer une requète comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ID_ANTECEDENT from Antecedent
    WHERE Libelle_Antecedent IN (id1,id2,id3);
    pour la boucle essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?
    echo sizeof($_POST["antecedent"])."<br/>" ;
    for($i = 0;$i<sizeof($_POST["antecedent"]) && isset($_POST["antecedent"][$i];$i++){
    echo $_POST["antecedent"][$i]."<br/>";
    }?>
    dit moi stp ce que la première ligne affiche

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    J'irai voir la doc' officielle pour voir comment ça marche. ^^

    Pour la boucle, ça fonctionne correctement maintenant !

    La première ligne affiche le bon nombre de checkbox cochées, puis après la boucle s'occupe d'afficher les valeurs.
    En tout cas je te remercie Bourgui, surtout que ça va me servir pour d'autres projets.

    Et sinon, est-ce qu'on peut procéder de la même manière avec un javascript ? Genre une checkbox qui désactive toutes les autres si elle est cochée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <script>
     
    function selection_tout_groupe()
    {
    var griser = false;
    if(document.getElementById('antecedent0').checked) // un ID donné manuellement
    griser = true;
     
    for(var i=1;i<10;i++)
    if(document.getElementById('antecedent'[i])
    document.getElementById('antecedent'[i]).disabled = griser;
    }
     
    </script>
    Cette manière pourrait marcher, en théorie ? (enfin un truc du genre quoi ^^).

  10. #10
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function unCheckAll(name){
    var tab = document.getElementsByName(name);
    for(var i = 0;i<tab.length;i++){
    tab[i].checked = false ;
    }
    }
    ça me semble bon. tu appelle avec le name que tu a donné a tout tes checkbox "antecedent[]".

    EDIT : j'avait pas compris ce que tu voulait fair,e je croyai que tu voulait les decocher, pour desactiver c'est mabox.disabled = "disabled" ou = "" pour activer.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Je garde ça de côté pour le moment donc.

    Je veux juste revenir sur la boucle. Elle marche toujours très bien, t'inquiètes pas. Mais en fait je voudrais insérer dans un tableau les valeurs des checkbox, avec un truc 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
    $k = 1;
    $antecedent = array[];
     
    for ($i = 0;$i<sizeof($_POST["antecedent"]) && isset($_POST["antecedent"][$i];$i++)
    {
    echo $_POST["antecedent"][$i]."<br/>";
     
    for($j = 0; $j <sizeof($_POST["antecedent"]); $j++)
    {
    $antecedent[$k] = $_POST["antecedent"[$i]
    $k++;
    } 
     
    }
    // un exemple pour vérifier si ça marche
     
    echo $antecedent[1];
    Sauf que ça marche pas, le serveur me renvoie une erreur signalant un [ inattendu.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $antecedent[$k] = $_POST["antecedent"[$i]
    bouh le noob

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $antecedent[$k] = $_POST["antecedent"][$i]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 0;$i<sizeof($_POST["antecedent"]) && isset($_POST["antecedent"][$i];$i++)
    rololo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i = 0;$i<sizeof($_POST["antecedent"]) && isset($_POST["antecedent"][$i]);$i++)
    Voila pour la syntaxe, sinon pourkoi tu fait pas uniquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ($i = 0;$i<sizeof($_POST["antecedent"]) && isset($_POST["antecedent"][$i]);$i++)
    {
    $antecedent[$i] = $_POST["antecedent"[$i]
    }
    j'ai pas compris pourquoi t'avais fait 2 boucle imbriquée ...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Monsieur le Juge, pour ma défense je plaide les erreurs de saisie dans mon message.

    Euh pourquoi deux boucles, très bonne question. ^^ En fait vu comme ça c'est vrai que c'est inutile.

    Et après dans ma requête donc, le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ID_ANTECEDENT from antecedent
    WHERE Libelle_Antecedent IN ('".$antecedent[1]."');
    ça pourrait marcher donc ? (faut que j'aille voir la doc' comme tu m'avais dit pour les procédures, vu que selon les cas, il peut y avoir 5 checkbox cochées comme il peut y en avoir zéro ^^).

    EDIT : rolala, t'as vu que t'as oublié un crochet fermant toi aussi ? ^^

  14. #14
    Invité
    Invité(e)
    Par défaut
    il te faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(sizeof($antecedent) > 0){
     $chaine_in = "'".join("','",$antecedent)."'";//va mettre ton tableau sous forme 'valeur1','valeur2','valeur3' etc ....
    mysql_query("SELECT ID_ANTECEDENT from antecedent
    WHERE Libelle_Antecedent IN (".$chaine_in.")");
    [traitement]
    }

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    T'es sûr pour la condition, parce qu'apparement il ne rentre jamais dedans. Pour tester, j'ai calé une vielle requête sql toute simple et elle ne s'execute pas (j'ai vérifié la base pour voir).

    Faudrait pas plutôt :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(sizeof($_POST["antecedent"]) > 0)
    {
     $chaine_in = "'".join("','",$antecedent)."'";
     
    mysql_query("SELECT ID_ANTECEDENT from antecedent
    WHERE Libelle_Antecedent IN (".$chaine_in.")");
     
    [traitement]
     
    }
    J'ai testé, mais apparemment il y a un soucis avec les arguments passés à la fonction join().

  16. #16
    Invité
    Invité(e)
    Par défaut
    est ce que tu fait ce traitement apres avoir remplis (et déclaré) le tableau $antecedent ?

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Bah de toute manière le tableau d'antécédents est rempli dès le chargement de la page non ? Sinon dans mon code, ma boucle est imbriquée dans ma condition, puisque si aucune checkbox n'est cochée, autant ne pas appliquer les instructions...

  18. #18
    Invité
    Invité(e)
    Par défaut
    si tu fait la condition avant, alors tu peut virer mon "sizeof", sinon si join te retourne une erreur c'est que $antecedent est pas un tableau, la ou tu le declare, est ce que tu ecri bien "$antecedent = array();" ? sinon quel est le message d'erreur exact qui t'es retourné ?

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2008
    Messages : 30
    Par défaut
    Pour qu'on s'y retrouve je vais remettre le code :

    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
    $antecedent = array();
     
    if(sizeof($_POST["antecedent"]>0)
    {
     
    for($i = 0;$i <sizeof($_POST["antecedent"]) && isset($_POST["antecedent"][$i]);$i++)
    {
     
    $chaine_in = "'".join("','",$antecedent)."'";
     
    //mon traitement qui va insérer les données dans la base
     
    $sql_insertion = ("INSERT INTO details_patient(Patient, Antecedent)
    select id_patient from patient where patient.nom like '".$nom."' ans patient.prenom like '".$prenom."'
    select ID_Antecedent from antecedent where libelle_antecedent IN ('".$chaine_in."')");
     
    //les variables noms et prenoms sont envoyés à la page par un formulaire en post aussi
     
    mysql_query(sql_insertion);
     
    }
     
    }
    En passant,ma requête inclut des sous-requêtes pour aller chercher les informations dans la base, mais est-ce que la structure de la requête est bonne aussi ? (j'ai matté des cours et ça ressemble à ça).

  20. #20
    Invité
    Invité(e)
    Par défaut
    faut pas mettre ta requète dans la boucle !, ta boucle doit juste initialisé ton tableau $antecedent, et apres tu fait tes requètes.


    remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chaine_in = "'".join("','",$antecedent)."'";
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $chaine_in = join("','",$antecedent);

Discussions similaires

  1. [JSP] Création dynamique de n lignes de formulaire
    Par edralzar dans le forum Struts 1
    Réponses: 6
    Dernier message: 25/09/2014, 15h52
  2. [JavaScript] Création dynamique de formulaires avec jQuery
    Par rberthou dans le forum Contribuez
    Réponses: 2
    Dernier message: 21/09/2009, 10h40
  3. Création dynamique de formulaire
    Par rberthou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/09/2009, 18h19
  4. Création dynamique de formulaires
    Par del-dongo dans le forum ASP.NET
    Réponses: 3
    Dernier message: 24/04/2008, 14h24
  5. Réponses: 8
    Dernier message: 06/07/2006, 08h19

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