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 :

UPDATE de case à cocher [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Membre Expert Avatar de nathieb
    Homme Profil pro
    DevOps
    Inscrit en
    Mai 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 058
    Par défaut Bonjour,
    Bonjour,

    Essayes ! il faut simplement qu'au moment de ta requête au premier affichage tu es mis tes valeurs en session, tu affiches la page , le gars fais les modifs, il renvoie la requête et la tu compares.

    Envoie un début de script, et la on corrige
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    {
    Je fais ma requete en base ...
    if(monrésiultat n'est pas null) alors
    je stocke en session mes valeurs
    }
    j'affiche m'a page
    ...
    olivier

  2. #22
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Par défaut
    tu peux raisonner autrement,

    tu créé une fonction Is_Checked bolléenne. elle te permet de savoir si oui ou non la case est cochée, et puis la fonction check_button qui met ton bouton en checked selon la valeur de ta variable.

  3. #23
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Par défaut
    J'ai pensé à un autre truc :

    pour chaque case à cocher A tu créé une autre B, son contraire mais invisible, donc si A est cochée B est décochée, sinon c'est B qui est cochée automatiquement (javascript).

    puis l'expression de ta requête tu le construit au fur et à mesure que tu parcoure tes variables, mais là tu a toutes tes variables cochées ou non

  4. #24
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par sabotage Voir le message
    La solution la plus simple est de supprimer toutes les données avant de faire l'INSERT des données cochées.
    Reprenons cette solution simple, en la modifiant légèrement.

    Tu ne peux pas TOUT supprimer dans la TABLE, car ton tableau (formulaire) peut ne contenir qu'une sélection d'élèves (de tel ou tel établissement,...).

    Par contre, on peut envisager de supprimer les lignes de TOUS CEUX du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="list_eleves[<?php echo $row['NUMELEVE']; ?>]" value="<?php echo $row['NUMELEVE']; ?>" />
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $list_eleves = $_POST['list_eleves']; // array contenant TOUS les NUMELEVE sélectionnés (affichés dans le formulaire)
    On peut alors supprimer toutes ces lignes, avant de traiter les cases à cocher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql_delete = "DELETE FROM tatable WHERE NUMELEVE IN (" . implode(',' , $list_eleves) . ")";
    $req = $bdd->prepare($sql_delete);
    ...
    N.B.

  5. #25
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonjour à tous,
    Alors des news de mon appli. de gestion des élèves...

    Pour jreaux :
    Ta solution est bonne mais je n'ai dans mon formulaire que les élèves d'une classe précise et d'un établissement précis pour une période précise...j'ai donc déjà toutes les données pour faire un DELETE des élèves concernés...en revanche je perds bien l'information de l'enregistrement (une date en l'occurrence) effacée lors du DELETE...ce qui implique la ressaisie (pas cool) de la date...

    Pour mandrake_of_mandregas :

    l'idée de la double case à cocher est peut-être bonne...j'y réfléchis...merci pour cette astuce ! ! !

    Pour nathieb :
    Je vais essayer ta soluce...je sais pas trop comment je vais m'y prendre notamment pour mettre le tableau en session...enfin je vais bien trouver...je vous tiens au courant de tout cela.


    En tous cas merci à tous pour votre aide,
    Jérôme

  6. #26
    Invité
    Invité(e)
    Par défaut
    Peux-tu nous rappeler comment tu fais le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = $bdd->prepare('INSERT INTO...etc
    N.B. Je pense qu'on aurait avancé plus vite si, dès ton PREMIER message, tu avais donné les informations nécessaires et suffisantes.
    (nous ne sommes pas censés avoir lu tes précédentes discussions, ni être obligés de les chercher)

    Notamment : comment sont enregistrées les cases cochées/non-cochées ?

    [Edit] Si j'ai bien compris, tu as 8 cases à cocher par élève ($_POST['matiere'][$i], avec $i de 1 à 8)
    Donc, si un élève coche les 8 cases, tu crées 8 lignes d'enregistrement dans la TABLE, c'est bien ça ?

    Un petit EXTRAIT de la TABLE serait bienvenu.

    En fait, la solution dépendra essentiellement de la méthodologie que TU as adoptée.

  7. #27
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonsoir à tous,
    Donc avec des sessions je commencerais à obtenir des résultats...
    Voilà mon 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    $tableau = array();
    while ($donnees = $req_liste->fetch())
    { 
    ?>
    <tr class="prem <?php echo ( ($j % 2 == 0) ? 'classe1' : 'classe2' ) ?>">
    <?php
    $j++;
    ?>
    	<td><?php echo $donnees['NOM_ELEVE'].' '.$donnees['PRENOM_ELEVE'];?></td>
    		<INPUT TYPE="HIDDEN" NAME="etab" VALUE="<?php echo $donnees['NUMETAB'];?>">
    		<INPUT TYPE="HIDDEN" NAME="division" VALUE="<?php echo $donnees['NUMDIVISION'];?>">
    		<INPUT TYPE="HIDDEN" NAME="periode" VALUE="<?php echo $donnees['NUM_PERIODE'];?>">
    <?php
    //$req_mat = $bdd->prepare('SELECT * FROM lo_matiere');
    //$req_mat->execute();
    for ($i = 1 ; $i < 9 ; $i++)
    {
    	$req_voeux = $bdd->prepare('SELECT * FROM lo_travailler where NUMMATIERE = '.$i.' and NUMPERIODE = ? and NUMETAB = ? and NUMDIVISION = ? and NUMELEVE = '.$donnees['NUMELEVE'].' order by NUMELEVE');
    	$req_voeux->execute(array($_GET['numperiode'], $_GET['numetab'], $_GET['numdivision']));
    	if ($req_voeux->rowcount() > 0)
    	{
    		$voeux = $req_voeux->fetch();
    		$selected = ($voeux['NUMELEVE'] == $donnees['NUMELEVE']) ?  ' checked="checked" ' : '';
    		array_push($tableau, $donnees['NUMETAB'],$donnees['NUMDIVISION'],$donnees['NUMELEVE']);
    		echo '<td align = "center"><input type="checkbox" name="matiere[' .  $i . '][' . $donnees['NUMELEVE'] . ']" value="' .  $donnees['NUMELEVE'] .'"' . $selected .'</td>';
    	}
    	else
    	{
    		echo '<td align = "center"><input type="checkbox" name="matiere[' .  $i . '][' . $donnees['NUMELEVE'] . ']" value="' .  $donnees['NUMELEVE'] .'"</td>';
    	}
    }
    }
    $_SESSION['tableau'] = $tableau;
    que je traite avec la page php suivante :

    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
    <?php
    session_start();
    	if (isset($_SESSION['user']) && (!empty($_SESSION['user'])))
    	{
     
    //echo '<pre>';
    //var_dump($_POST);
    //echo '</pre>';
     
    include('../param_conn.php');
    $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
     
     
    $kaho=$_SESSION['tableau'];
     
    foreach($kaho AS $value)
    {
    echo '<pre>';
    echo"$value<br>";
    echo '<pre>';
    }
     
    $sql_delete = $bdd->prepare('DELETE FROM lo_travailler WHERE NUMETAB = ? and NUMDIVISION = ? and NUMPERIODE = ? ');
    $sql_delete->execute(array($_POST['etab'], $_POST['division'], $_POST['periode']));
     
     
    if(!empty($_POST['matiere'])){ // si des cases sont cochées
    	for ($i=1; $i < 9 ; $i++){ // pour chaque matiere
    		if(!empty($_POST['matiere'][$i])){ // si des cases sont cochées pour cette matiere
    		echo 'Les élèves suivants ont coché la matiere '.$i.' : ';
    			foreach($_POST['matiere'][$i] as $numeleve){
    				echo $numeleve.', ';
     
    				$req = $bdd->prepare('INSERT INTO lo_travailler
    J'obtiens bien une différence des cases cochées / décochées...
    Maintenant comment je traite la différence ? Avec ce que tu m'as dit Olivier mais je ne vois pas comment le faire ?


    BOnjour,

    En session tu gardes le tableau des cases cochées, tu le compares à ton POST, et tu fais une différence des deux tableaux. en PHP il existe des méthodes pour trouver la différence.

    http://php.net/manual/fr/function.array-diff-uassoc.php

    Regardes le premier exemple

    Olivier
    Merci d'avance pour votre aide.
    Jérôme

  8. #28
    Invité
    Invité(e)
    Par défaut
    Tu as ici une erreur de logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		<INPUT TYPE="HIDDEN" NAME="etab" VALUE="<?php echo $donnees['NUMETAB'];?>">
    		<INPUT TYPE="HIDDEN" NAME="division" VALUE="<?php echo $donnees['NUMDIVISION'];?>">
    		<INPUT TYPE="HIDDEN" NAME="periode" VALUE="<?php echo $donnees['NUM_PERIODE'];?>">
    • Soit ces valeurs sont valables pour TOUTES les lignes, et cela n'a rien à faire dans la boucle while,
    • soit il faut les identifier pour chaque élève, avec des ...[] aux name :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		<input type="hidden" name="etab[<?php echo $donnees['NUMELEVE']; ?>]" value="<?php echo $donnees['NUMETAB'];?>">
    		<input type="hidden" name="division[<?php echo $donnees['NUMELEVE']; ?>]" value="<?php echo $donnees['NUMDIVISION'];?>">
    		<input type="hidden" name="periode[<?php echo $donnees['NUMELEVE']; ?>]" value="<?php echo $donnees['NUM_PERIODE'];?>">
    (il me semble l'avoir déjà fait remarquer dans une autre discussion, non ?)

  9. #29
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Euh oui...c'est exact ! Je vais corriger cela...

    Et pour ma question, une petite idée ?

    Jérôme

  10. #30
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Peux-tu nous rappeler comment tu fais le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = $bdd->prepare('INSERT INTO...etc
    Notamment : comment sont enregistrées les cases cochées/non-cochées ?

    [Edit] Si j'ai bien compris, tu as 8 cases à cocher par élève ($_POST['matiere'][$i], avec $i de 1 à 8)
    Donc, si un élève coche les 8 cases, tu crées 8 lignes d'enregistrement dans la TABLE, c'est bien ça ?

    Un petit EXTRAIT de la TABLE serait bienvenu.
    Ce à quoi j'ajoute :
    actuellement, tu ne fais que des INSERT, c'est bien ça ?
    D'où risque de doublon, d'où la question...

  11. #31
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonsoir,
    J'arrive bien à mettre mon tableau en session j'ai donc la liste des cases initialement cochées apparaissant dans mon formulaire...

    J'ai bien la liste des cases modifiées (cochées / ou décochées) que je récupère lors de l'envoi de mon formulaire...

    Voilà un bout du code lors de la réception 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
    $kaho=$_SESSION['tableau'];
     
    foreach($kaho AS $value)
    {
    echo '<pre>';
    echo"$value<br>";
    echo '<pre>';
    }
     
    function key_compare_func($a, $b)
    {
        if ($a == $b) {
            return 0;
        }
        return ($a > $b)? 1:-1;
    }
     
    $result = array_diff_uassoc($_POST['matiere'], $kaho, "key_compare_func");
    print_r($result);
    J'imagine faire un test dans une boucle qui parcourt les tableaux en faisant un INSERT dans le cas d'une case cochée, un DELETE dans le cas d'une case décochée...mais est-ce que quelqu'un peut me mettre sur la piste pour le code car pour l'instant je n'ai pas d'idées, enfin pas trop ! ! !
    Merci d'avance,
    Jérôme

  12. #32
    Invité
    Invité(e)
    Par défaut
    Si tu veux de l'aide, ce serait bien de répondre aux questions qu'on te pose.

  13. #33
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonjour,

    Voilà la structure de la table lo_travailler et quelques enregistrements :

    Code sql : 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
    CREATE TABLE IF NOT EXISTS `lo_travailler` (
      `NUMETAB` varchar(32) NOT NULL,
      `NUMDIVISION` varchar(32) NOT NULL,
      `NUMELEVE` int(4) NOT NULL,
      `NUMPERIODE` varchar(32) NOT NULL,
      `NUMMATIERE` varchar(32) NOT NULL,
      `DATETRAVAILLER` date DEFAULT NULL,
      `HEUREDEBUT` time DEFAULT NULL,
      `HEUREFIN` time DEFAULT NULL,
      `NUMINTER` int(4) DEFAULT NULL,
      PRIMARY KEY (`NUMETAB`,`NUMDIVISION`,`NUMELEVE`,`NUMPERIODE`,`NUMMATIERE`),
      KEY `NUMDIVISION` (`NUMDIVISION`),
      KEY `NUMELEVE` (`NUMELEVE`),
      KEY `NUMPERIODE` (`NUMPERIODE`),
      KEY `NUMMATIERE` (`NUMMATIERE`),
      KEY `NUMETAB` (`NUMETAB`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    --
    -- Contenu de la table `lo_travailler`
    --
     
    INSERT INTO `lo_travailler` (`NUMETAB`, `NUMDIVISION`, `NUMELEVE`, `NUMPERIODE`, `NUMMATIERE`, `DATETRAVAILLER`, `HEUREDEBUT`, `HEUREFIN`, `NUMINTER`) VALUES
    ('1', '1GA1', 1, '1', '1', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('1', '1GA1', 1, '1', '2', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('1', '1GA1', 3, '1', '3', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('1', '1GA1', 6, '1', '6', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('1', '1GA1', 22, '1', '1', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('1', '1GA1', 22, '1', '2', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('2', 'BTSSIOUNDEUX', 793, '1', '1', '2013-09-06', '00:00:00', '00:00:00', 2),
    ('2', 'BTSSIOUNDEUX', 793, '1', '2', '2013-09-07', '00:00:00', '00:00:00', 8),
    ('2', 'BTSSIOUNDEUX', 793, '1', '6', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('2', 'BTSSIOUNDEUX', 793, '2', '1', '0000-00-00', '00:00:00', '00:00:00', 0);

    Effectivement, si je coche les 8 cases je crée bien 8 enregistrements dans la table.

    Et en effet actuellement je ne fais que des INSERT après avoir fait un DELETE des lignes concernées...et c'est là qu'est le hic, je perds de l'information en faisant le DELETE...mais avec les sessions il semblerait qu'il y ait une piste de ce côté là.

    Voilà mon code avec mon INSERT et mon DELETE et au début du script le démarrage de l'utilisation des sessions (exemples repris d'internet) :

    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
    $kaho=$_SESSION['tableau'];
     
    foreach($kaho AS $value)
    {
    echo '<pre>';
    echo"$value<br>";
    echo '<pre>';
    }
     
    function key_compare_func($a, $b)
    {
        if ($a == $b) {
            return 0;
        }
        return ($a > $b)? 1:-1;
    }
     
    $result = array_diff_uassoc($_POST['matiere'], $kaho, "key_compare_func");
    print_r($result);
     
    $sql_delete = $bdd->prepare('DELETE FROM lo_travailler WHERE NUMETAB = ? and NUMDIVISION = ? and NUMPERIODE = ? ');
    $sql_delete->execute(array($_POST['etab'], $_POST['division'], $_POST['periode']));
     
     
    if(!empty($_POST['matiere'])){ // si des cases sont cochées
    	for ($i=1; $i < 9 ; $i++){ // pour chaque matiere
    		if(!empty($_POST['matiere'][$i])){ // si des cases sont cochées pour cette matiere
    		echo 'Les élèves suivants ont coché la matiere '.$i.' : ';
    			foreach($_POST['matiere'][$i] as $numeleve){
    				echo $numeleve.', ';
     
    $req = $bdd->prepare('
    INSERT INTO lo_travailler
    (NUMETAB,
    NUMDIVISION,
    NUMELEVE,
    NUMPERIODE,
    NUMMATIERE,
    DATETRAVAILLER,
    HEUREDEBUT,
    HEUREFIN,
    NUMINTER
    )
    VALUES
    (   :NUMETAB,
     :NUMDIVISION,
     :NUMELEVE,
     :NUMPERIODE,
     :NUMMATIERE,
     :DATETRAVAILLER,
     :HEUREDEBUT,
     :HEUREFIN,
     :NUMINTER
    )');
     
    $req -> bindValue('NUMETAB',$_POST['etab'],PDO::PARAM_STR);
    $req -> bindValue('NUMDIVISION',$_POST['division'],PDO::PARAM_STR);
    $req -> bindValue('NUMELEVE',$numeleve,PDO::PARAM_STR);
    $req -> bindValue('NUMPERIODE',$_POST['periode'],PDO::PARAM_STR);
    $req -> bindValue('NUMMATIERE',$i,PDO::PARAM_STR);
    $req -> bindValue('DATETRAVAILLER',"",PDO::PARAM_STR);
    $req -> bindValue('HEUREDEBUT',"",PDO::PARAM_STR);
    $req -> bindValue('HEUREFIN',"",PDO::PARAM_STR);
    $req -> bindValue('NUMINTER',"",PDO::PARAM_STR);
     
    if ($req->execute())
    {
    header('Location: listeeleve_division.php?numetab='.$numetab.'');
    }
    else
    {
    echo 'erreur';
    }
     
    }
    echo '<br />';
    }
    }
    }
    Voilà, j'espère avoir répondu à vos questions et que cela va vous permettre de m'aider. Merci d'avance.
    Jérôme

  14. #34
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    tu n'es pas obligé de passer par une SESSION.
    De simples champs "hidden" peuvent faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="checkAvant[<?php echo $donnees['NUMELEVE']; ?>][<?php echo $i; ?>]" value="<?php echo $checkAvant[$i];?>">

  15. #35
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonjour à tous,

    Effectivement avec les champs "hidden" cela fonctionne...
    Mais...comment je peux comparer les deux tableaux...avec array_diff_uassoc mais comment l'utiliser ?

    Merci,
    Jérôme

  16. #36
    Invité
    Invité(e)
    Par défaut
    Contrairement aux cases à cocher, les champs "hidden" renvoient TOUTES les données !
    On peut donc boucler dessus, et comparer TOUTES les valeurs.
    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
    $checkAvant_array = $_POST['checkAvant']; // array de toutes les valeurs, pour tous les élèves concernés
    foreach($checkAvant_array as $idx => $checkAvant) // $idx vaut NUMELEVE
    {
       for($i=1; $i<9; $i++)
       {
          // on compare $checkAvant[$i] avec $check[$i] (la valeur retour de la case à cocher correspondante, après test d'existence)
          $check[$i] = $_POST['matiere'][$i]; // (sauf erreur)
          // ...
          // c'est ici qu'une bonne logique est nécessaire pour :
          if( $checkAvant[$i]!=0 && !isset($checkAvant[$i]) ) {
             // => DELETE
          }
          elseif(  $checkAvant[$i]==0 && isset($checkAvant[$i]) ) {
             // => INSERT
          }
         // (je te laisse compléter !)
       }
    }
    De fait, on ne touche pas aux lignes si les 2 valeurs sont inchangées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          if( $checkAvant[$i]!=0 && isset($checkAvant[$i]) ) {
             // => on ne fait rien !
          }
    N.B. $checkAvant[$i] = 0 si la case n'avait pas été cochée, c'est-à-dire que la ligne n'existait pas en Bdd.

  17. #37
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Ok je crois que j'ai compris...je teste et je te repost...merci beaucoup !

    Bon c'est la galère...
    Voilà un dump de mes variables :

    Code de retour des variables pour l'élève 121 aucune case cochée avant, matière 1 cochée après envoi du formulaire :

    Code retour de variables : 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
    array
      'etab' => string '1' (length=1)
      'division' => string '1STMG1' (length=6)
      'periode' => string '1' (length=1)
      'checkAvant' => 
        array
          121 => 
            array
              1 => string '0' (length=1)
              2 => string '0' (length=1)
              3 => string '0' (length=1)
              4 => string '0' (length=1)
              5 => string '0' (length=1)
              6 => string '0' (length=1)
              7 => string '0' (length=1)
              8 => string '0' (length=1)
      'matiere' => 
        array
          1 => 
            array
              121 => string '121' (length=3)

    Avec ce code que j'ai tenté de remanipuler sans résultats pobants :

    Code php : 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
    $checkAvant_array = $_POST['checkAvant']; // array de toutes les valeurs, pour tous les élèves concernés
    foreach($checkAvant_array as $idx => $checkAvant) // $idx vaut NUMELEVE
    {
       for($i=1; $i<9; $i++)
       {
     
    	  if ($checkAvant[$i]!=0 && isset($checkAvant[$i])) {
    	  // => on ne fait rien !
          }
     
    	  elseif ($checkAvant[$i]!=0 && !isset($checkAvant[$i])) {
             $sql_delete = $bdd->prepare('DELETE FROM lo_travailler WHERE NUMETAB = ? and NUMDIVISION = ? and NUMPERIODE = ? and NUMELEVE = ?');
    		 $sql_delete->execute(array($_POST['etab'], $_POST['division'], $_POST['periode'], $idx));
          }
          elseif  ($checkAvant[$i]==0 && isset($checkAvant[$i])) {
             $req = $bdd->prepare('INSERT INTO lo_travailler...

    Ah si il me fait quelque chose : là il n'y a qu'un élève de concerné et il m'insère 8 lignes (les matières) dans la table, sinon il m'en insère 16 pour deux élèves, etc... je ne vois pas d'où cela peut provenir...je cherche toujours...voilà voilà....bonne soirée à zot'tout...Jérôme

  18. #38
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonjour à tous,
    Bon ! ! ! Procédons par ordre : attardons-nous sur l'insertion de données dans ma table...voilà un dump de mes variables :

    Code dump variables : 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
    array
      'etab' => string '1' (length=1)
      'division' => string '1STMG1' (length=6)
      'periode' => string '1' (length=1)
      'checkAvant' => 
        array
          121 => 
            array
              1 => string '0' (length=1)
              2 => string '0' (length=1)
              3 => string '0' (length=1)
              4 => string '0' (length=1)
              5 => string '0' (length=1)
              6 => string '0' (length=1)
              7 => string '0' (length=1)
              8 => string '0' (length=1)
      'matiere' => 
        array
          121 => 
            array
              1 => string '0' (length=1)

    ckeckAvant : tout est à zéro et c'est normal puisque je n'ai rien de coché dans mon formulaire...
    matiere : là il y a un comportement bizarre puisque il me met '0' alors que c'est une case que je viens de cocher...mais bon ce n'est pas grave à partir du moment où j'ai quelque chose dans mon array matiere, je le teste dans le code suivant :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $checkAvant_array = $_POST['checkAvant']; // array de toutes les valeurs, pour tous les élèves concernés
    foreach($checkAvant_array as $idx => $checkAvant) // $idx vaut NUMELEVE
    {
       for($i=1; $i<9; $i++)
       {
        if  ($checkAvant[$i]==0 && isset($_POST['matiere'][$i])) {
             $req = $bdd->prepare('INSERT INTO lo_travailler

    donc si ckeckAvant[$i]==0 --> vrai et isset($_POST['matiere'][$i] --> toujours faux...pourquoi alors que mon array matiere contient une case cochée ???


    Merci d'avance,
    Jérôme

  19. #39
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par jeje_974 Voir le message
    ckeckAvant : tout est à zéro et c'est normal puisque je n'ai rien de coché dans mon formulaire...
    NON.
    ckeckAvant est censé contenir les valeurs ENREGISTREES en base de données AVANT :
    • 1,2,...,8 (num de la case = NUMMATIERE ?) si la ligne existe en base de données (case DEJA COCHEE)
    • 0 sinon (pas de ligne en Bdd = case non-cochée)


    Comment remplis-tu cette variable ?

    Ton extrait de TABLE est, pour le NUMELEVE 793 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ('2', 'BTSSIOUNDEUX', 793, '1', '1', '2013-09-06', '00:00:00', '00:00:00', 2),
    ('2', 'BTSSIOUNDEUX', 793, '1', '2', '2013-09-07', '00:00:00', '00:00:00', 8),
    ('2', 'BTSSIOUNDEUX', 793, '1', '6', '0000-00-00', '00:00:00', '00:00:00', 0),
    ('2', 'BTSSIOUNDEUX', 793, '2', '1', '0000-00-00', '00:00:00', '00:00:00', 0);
    Je ne comprends pas les lignes 1 et 4 (même NUMMATIERE, mais NUMPERIODE différents, c'est ça ?)

  20. #40
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Oui je le suis mal exprimé...ckeckAvant contient bien les valeurs de la BDD avant...ça c'est bon !

    1,2,...,8 (num de la case = NUMMATIERE ?) si la ligne existe en base de données (case DEJA COCHEE)
    Oui c'est bien cela.

    Je ne comprends pas les lignes 1 et 4 (même NUMMATIERE, mais NUMPERIODE différents, c'est ça ?)
    Oui c'est bien cela aussi.

    Comment remplis-tu cette variable ?
    Quelle variable ? ckeckAvant ?

    Merci pour ton aide et ton analyse.
    Jérôme

    PS : ce que je ne comprends pas c'est pourquoi $_POST['matiere'][$i] est toujours à false ????

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

Discussions similaires

  1. [MySQL] requete update et case à cocher
    Par totot dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/08/2013, 17h40
  2. [MySQL] update de cases à cocher multiples qui ne fonctionne pas
    Par mimosa21 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 09/12/2012, 11h28
  3. [VBA UPDATE] Problème UPDATE et cases à cocher
    Par rungis78-76 dans le forum VBA Access
    Réponses: 6
    Dernier message: 08/10/2009, 08h39
  4. [MySQL] Update avec case à cocher
    Par Vetchostar dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 01/11/2008, 14h28
  5. update champs de type "case à cocher"
    Par manu971 dans le forum VBA Access
    Réponses: 5
    Dernier message: 21/11/2007, 12h38

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