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 cases à cocher multiples qui ne fonctionne pas


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut update de cases à cocher multiples qui ne fonctionne pas
    Bonjour à tous,

    Pour faire suite à mon post http://www.developpez.net/forums/d12...e/#post6942613 Je n'arrive pas à faire un update des caser à cocher 'ok'. Pour rappel, le code que 'rawsrc' m'avait donné fonctionne parfaitement:
    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
    <?php
    $mission_id = $PDO->quote($modif_renfort_id, PDO::PARAM_INT);
    $sql        = <<<SQL
    SELECT
        d.vd_id, d.vd_renfort_id, d.id_renfort_volontaires, d.nom, d.date_dispo, d.ok,
        v.*,
        m.date_debut,
        m.date_fin
    FROM
        volontaires_dispo d
        INNER JOIN renfort_volontaires v ON v.k_id_renfort_volontaires = d.id_renfort_volontaires
        INNER JOIN renfort m             ON m.id_renfort               = v.k_id_renfort
    WHERE
        m.id_renfort = {$mission_id}
        AND d.date_dispo BETWEEN m.date_debut AND m.date_fin
    ORDER BY
        d.date_dispo
    SQL;
     
    $data = $PDO->query($sql, PDO::FETCH_ASSOC)->fetchAll(); // j'avais oublié le fetchAll()
     
    if (empty($data)) {
        // aucun volontaire disponible
     
    }
    else {
        // les dates sont déterminées par les bornes des dates de la mission
        // qu'on récupère du 1er enregistrement
        $debut    = DateTime::createFromFormat('Y-m-d', $data[0]['date_debut']);
        $fin      = DateTime::createFromFormat('Y-m-d', $data[0]['date_fin']);
        $interval = new DateInterval('P1D');
        $dates    = array($debut->format('Y-m-d'));
        while($debut < $fin) {
            $dates[] = $debut->add($interval)->format('Y-m-d');
        }
     
        // par défaut on considère qu'il n'y a aucune disponibilité pour chaque date
        $default_dispo = array_fill_keys(array_values($dates), false);
     
        $rows = array();
        foreach($data as $row) {
            $id = $row['k_id_volontaire'];
            // si on n'a pas déjà rencontré le volontaire on le crée
            if (empty($rows[$id])) {
                $rows[$id] = array(
                    'dispo' => $default_dispo,
                    'nom'   => $row['nom'],
                    'ok'    => array()
                    // d'autres valeurs à la place des * dans ton SELECT
                );
            }
            // on récupère les diponibilités
            $rows[$id]['dispo'][$row['date_dispo']] = true;
            // on récupère la colonne ok
            $rows[$id]['ok'][$row['date_dispo']] = ( empty($row['ok']));
        }
     
        // rendu
    ?><div class="centrage_submit">
        <table bgcolor="#FFFFFF">
            <thead><!-- entête du tableau -->
                <tr>
                    <th class="td_140px"><b> Réservistes </b></th>
     
                    <?php foreach($dates as $d): ?>
    		<?php // ... on la convertit donc en format: jj-mm-aaaa
    			$d = implode('-', array_reverse(explode('-', $d)));
    		?>
                        <th class="td_date"><?php echo $d ?></th><!-- <th> est le <td> de l'entête du tableau -->
                    <?php endforeach ?>
                </tr>
            </thead>
            <tbody>
                <?php foreach($rows as $id => $row): ?>
                <tr>
                <?php $nom = $row['nom']; ?>
                    <td bgcolor='#CCCCCC'><input type="text" name='nom[]' value="<?php echo $nom ?>" class="tableau_gris"</td>
                    <?php foreach($row['dispo'] as $date => $v): ?>
                    <td bgcolor='#CCCCCC'>
                        <?php if ($v): ?>
    			<input type="checkbox" name='selection_date[]' <?php echo (($row['ok'][$date]) ? '' : 'checked="checked" ') ?>/>
    			<?php else: ?>
    			&nbsp;
                        <?php endif ?>
                    </td>
                    <?php endforeach ?>
                </tr>
                <?php endforeach ?>
            </tbody>
        </table>
    	</div>
    <?php
    }
    }
    echo '<div class="centrage_pre">';
    print_r("<pre>");print_r($data);print_r("</pre>");
    print("\n");
    echo '</div>';
    }
    ?>
    <input type="submit" name="validation_a1"  value=" --> Modifier le renfort <-- " />
    J'ai simplement rajouté la variable $nom pour avoir une valeur dans mon input 'nom'. Avec ce code j'obtiens ce tableau dans mon formulaire:
    - id_volontaires_dispo étant l'identifiant de la ligne.
    - ok : la case à cocher correpondant à la ligne id_volontaires_dispo donc si ma table est composé comme ceci pour par exemple le renfort 52:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Table volontaires_dispo
    id_volontaires_dispo | k_id_renfort_volontaires | nom  | date_dispo | ok
    ----------------------------------------------------------------------
              1          |             1            | nom1 | 2012-09-01 | 1
              2          |             1            | nom1 | 2012-09-02 | 0
              3          |             1            | nom1 | 2012-09-03 | 0
              4          |             2            | nom2 | 2012-09-01 | 1
              5          |             2            | nom2 | 2012-09-02 | 0
              6          |             2            | nom2 | 2012-09-03 | 0
    - id_volontaires_dispo = 1, nom serait = à nom 1, ok = 1 (validé)
    - id_volontaires_dispo = 2, nom serait = à nom1, ok = 0 (non validé)
    - id_volontaires_dispo = 3, nom serait = à nom1, ok = 0 (non validé)
    - id_volontaires_dispo = 4, nom serait = à nom2, ok = 1 (validé)
    - id_volontaires_dispo = 5, nom serait = à nom2, ok = 0 (non validé)
    - id_volontaires_dispo = 6, nom serait = à nom2, ok = 0 (non validé)

    Je visualise bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           nom       | 01-09-2012 | 02-09-2012 | 03-09-2012 | 
    --------------------------------------------------------
            nom1     |     1      |     0      |     0      |
            nom2     |     1      |     0      |     0      |
    Si cela est utile voilà ce que me donne un print_r($data):
    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
    Array
    (
        [0] => Array
            (
                [vd_id] => 256
                [vd_renfort_id] => 52
                [id_renfort_volontaires] => 108
                [nom] => 4
                [date_dispo] => 2013-05-01
                [ok] => 1
                [k_id_renfort_volontaires] => 108
                [rv_host] => 
                [k_id_renfort] => 52
                [k_id_volontaire] => 4
                [date_debut] => 2013-05-01
                [date_fin] => 2013-05-03
            )
     
        [1] => Array
            (
                [vd_id] => 259
                [vd_renfort_id] => 52
                [id_renfort_volontaires] => 109
                [nom] => 6
                [date_dispo] => 2013-05-01
                [ok] => 1
                [k_id_renfort_volontaires] => 109
                [rv_host] => 
                [k_id_renfort] => 52
                [k_id_volontaire] => 6
                [date_debut] => 2013-05-01
                [date_fin] => 2013-05-03
            )
     
        [2] => Array
            (
                [vd_id] => 257
                [vd_renfort_id] => 52
                [id_renfort_volontaires] => 108
                [nom] => 4
                [date_dispo] => 2013-05-02
                [ok] => 0
                [k_id_renfort_volontaires] => 108
                [rv_host] => 
                [k_id_renfort] => 52
                [k_id_volontaire] => 4
                [date_debut] => 2013-05-01
                [date_fin] => 2013-05-03
            )
     
        [3] => Array
            (
                [vd_id] => 260
                [vd_renfort_id] => 52
                [id_renfort_volontaires] => 109
                [nom] => 6
                [date_dispo] => 2013-05-02
                [ok] => 0
                [k_id_renfort_volontaires] => 109
                [rv_host] => 
                [k_id_renfort] => 52
                [k_id_volontaire] => 6
                [date_debut] => 2013-05-01
                [date_fin] => 2013-05-03
            )
     
        [4] => Array
            (
                [vd_id] => 258
                [vd_renfort_id] => 52
                [id_renfort_volontaires] => 108
                [nom] => 4
                [date_dispo] => 2013-05-03
                [ok] => 0
                [k_id_renfort_volontaires] => 108
                [rv_host] => 
                [k_id_renfort] => 52
                [k_id_volontaire] => 4
                [date_debut] => 2013-05-01
                [date_fin] => 2013-05-03
            )
     
        [5] => Array
            (
                [vd_id] => 261
                [vd_renfort_id] => 52
                [id_renfort_volontaires] => 109
                [nom] => 6
                [date_dispo] => 2013-05-03
                [ok] => 0
                [k_id_renfort_volontaires] => 109
                [rv_host] => 
                [k_id_renfort] => 52
                [k_id_volontaire] => 6
                [date_debut] => 2013-05-01
                [date_fin] => 2013-05-03
            )
     
    )
    Maintenant je n'arrive pas à faire un update de mes cases 'ok' si par exemple je change dans mon formulaire les données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           nom       | 01-09-2012 | 02-09-2012 | 03-09-2012 | 
    --------------------------------------------------------
            nom1     |     1      |     1      |     0      |
            nom2     |     0      |     0      |     1      |
    Le code de ma page renfort_modification_ok.php qui traite l'update
    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
    $modif_renfort_id = '';
    $selection_date = '';
    $nom = '';
    // La page d'insertion 
    	if ( $_POST['modif_renfort_id'] > 0  && $_POST['selection_date'] >= 0  && $_POST['nom'] > 0);
    	{
    		require"./includes/identifiants.php";
    		require"includes/header.php"; 
    		require"includes/menu_brigade_55989526915988.php";
    		$nom = $_POST['nom'];
    		$modif_renfort_id = $_POST['modif_renfort_id'];
    		$selection_date = $_POST['selection_date'];
    		print_r( $nom);
    		print_r( $modif_renfort_id);
    		print_r( $selection_date);
    // Avec une requête préparée
    $req = $PDO->prepare('UPDATE volontaires_dispo SET ok = :selection_date WHERE vd_renfort_id = :modif_renfort_id AND nom = :nom');
    $req->execute(array('vd_renfort_id' => $modif_renfort_id, 'nom' => $nom, 'ok' => $selection_date));
    }	
    ?>
    Alors avant que 'rawsrc' ne se moque parce que j'ai cherché pendant un mois la solution (seulement 2 jours pour ce cas) je vous demande humblement de l'aide j'obtiens ces messages d'erreur et de notice:
    Notice: Array to string conversion in C ligne 20
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C ligne 20
    Ce qui correspond à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req->execute(array('vd_renfort_id' => $modif_renfort_id, 'nom' => $nom, 'ok' => $selection_date));
    Encore merci d'avance!
    Mimosa21
    PS: merci rawsrc pour la solution de mon dernier post.

  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
    Sans voir le formulaire c'est difficile de te répondre.
    Au vu de l'erreur, ton formulaire renvoit un tableau pour au moins une des valeurs.

    Fait un
    pour contrôler.

    Si ton formulaire renvoit intentionnellement un tableau car tu cherches à modifier plusieurs valeurs, alors il faut parcourir ce tableau et faire une requête UPDATE par ligne à modifier.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    Citation Envoyé par sabotage
    Sans voir le formulaire c'est difficile de te répondre.
    Je crois qu'il l'a tout simplement oublié, non ?
    On voit bien la balise <input type="submit".../> mais la balise <form>...</form> tu l'as cachée ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut
    Bonjour rawsrc (ça fait plaisir) et Sabotage,

    Oui ils existent bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <FORM name="renfort_a_modifier" id="renfort_a_modifier" action="index.php?p=content/renfort/renfort_modification_ok" method="post" >
    en haut de mon formulaire justement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="submit" name="validation_a1"  value=" --> Modifier le renfort <-- " />
    et fermeture du form tout en bas par

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    la soluce réside dans le passage au script du couple {id; état case à cocher}.
    Donc il faudrait que tu fasses le lien ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="selection_date[]" <?php echo (($row['ok'][$date]) ? '' : 'checked="checked" ') ?>/>
    tu dois te débrouiller pour que selection_date soit un tableau ayant pour clé les id correspondant aux valeurs de la colonne ok, quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="selection_date[<?php echo $row['id'] ?>" <?php echo (($row['ok'][$date]) ? '' : 'checked="checked" ') ?>/>
    Ainsi dans ton script de traitement, tu vas récupérer en une seule passe, les id des enregistrements avec le statut de la case à cocher.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut
    Bonjour rawsrc, Sabotage et tout le monde,

    Bon ben comme d'habitude je galère quelle valeur dois-je mettre dans la value de ma case à cocher name="selection_date[<?php echo $row['id'] ?>" pour que je reçoive dans ma page de retour si je fais un print_r() les changements effectués sur les cases à cocher.

    Comme d'habitude plusieurs jours passés dessus sans résultat probant!!!

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/05/2014, 12h28
  2. [AC-2003] case à cocher qui ne fonctionne pas
    Par olivier777 dans le forum IHM
    Réponses: 13
    Dernier message: 15/09/2009, 19h49
  3. [VBA-E]Select case qui ne fonctionne pas :(
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 31/01/2006, 12h13
  4. [MySQL] Requête update qui ne fonctionne pas
    Par Sylvain245 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 05/12/2005, 16h40
  5. [MySQL] UPDATE qui ne fonctionne pas
    Par philippef dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 13/09/2005, 14h35

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