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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut UPDATE de case à cocher
    Mon problème est simple à exprimer mais me semble difficile à résoudre...enfin de mon point de vue !

    J'ai un formulaire dans lequel je coche des cases que j'arrive à insérer dans ma BDD et que j'arrive ensuite à restituer dans ce même formulaire...

    Le problème : quid de la case cochée que je décoche et faire la mise à jour dans la BDD ???

    J'ai bien tenté de trouver la solution dans divers forums, mais je ne trouve pas...quelqu'un peut m'aider SVP ?

    Merci d'avance pour les diverses pistes proposées,
    @+
    Jérôme

    Voilà un bout de code pour illustrer mon problème :

    Pour un INSERT pas de problèmes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    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...etc
    mais le problème c'est que les cases non cochées ne renvoient rien
    donc comment traiter un UPDATE ?

    Merci pour le temps que vous passez à éclairer ma lanterne...
    Jérôme

    Est-ce que ceci serait un bon pas vers la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    if (isset($_POST['check']))
    {
            // la case a bien été cochée
    }
    else
    {
            // case non cochée
    }
    ?>

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    La solution la plus simple est de supprimer toutes les données avant de faire l'INSERT des données cochées.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Oui ça je sais faire et c'est sûr que c'est la solution la plus simple.

    MAIS : j'ai des données dans d'autres colonnes de la même table que je ne peux pas supprimer sinon je perds tout...

    d'où mon questionnement : comment faire un UPDATE ?

    HumHum, pas si simple...

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 346
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 346
    Billets dans le blog
    17
    Par défaut
    Lors du traitement du formulaire :
    Tu récupères toutes les valeurs cochées en bdd
    Tu compares à celles soumises par le formulaire
    Tu fais un DELETE de celles n'étant pas dans le formulaire
    Tu fais un INSERT de celles n'étant pas en bdd
    Si besoin tu fais un UPDATE de celles ayant été modifiées

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Ok...donc :

    1) je fais un SELECT de ma table des enregistrements concernés (jusque là pas de soucis...)

    2) je compare : comment ?

    3) ensuite je fais des if else pour INSERT DELETE UPDATE... non ?

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    j'ai des données dans d'autres colonnes de la même table que je ne peux pas supprimer sinon je perds tout...
    Quand tu decoches un case tu dois garder des données en reference avec cette case ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    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.

  8. #8
    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

  9. #9
    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.

  10. #10
    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. #11
    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

  12. #12
    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 ?)

+ Répondre à la discussion
Cette discussion est résolue.

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