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 :

Enregistrer checkbox dans bdd avec un update


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Enregistrer checkbox dans bdd avec un update
    Bonjour,

    J'essaye d'enregistrer le booleen coché à 1 dans le champ formulaire_affich de ma bdd, j'ai fait plusieurs tentatives mais ça ne fonctionne pas, rien dans le champ à l'update.
    Comment je peux faire ?

    Merci pour l'aide



    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
    17
     
     
    if(isset($_POST['submit']))
    {
    	if (isset($_POST['Id_status']) && !empty($_POST['Id_status'])) 
    	{
    		foreach ($_POST['Id_status'] as $Id_status) 
    		{
    			echo $Id_status.'<br />'; // Correspond aux valeurs des Id_status cochés
    			$query = mysql_query('UPDATE table SET formulaire_affich = 1 WHERE id = '.$Id_status);
    		}
            }
    	else 
    	{
    		// Aucun statut de coché
    	}
    }



    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    echo '<td><input type="checkbox" name="Id_status[]" value='.$item['Id_status'].'></td>';


    Code html :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    <input type="submit" name"submit" value="Enregistrer"/>

  2. #2
    Invité
    Invité(e)
    BOnjour,

    1- tu en es encore à utiliser mysql_ ?

    2- Il manque des double quotes :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    echo '<td><input type="checkbox" name="Id_status[]" value="'.$item['Id_status'].'" /></td>';


    3- Le echo $Id_status affiche-t-il bien les bonnes valeurs (checkbox cochées) ?

  3. #3
    Nouveau membre du Club
    Merci pour ta réponse.
    Je sais je code comme une porcinette mais je vais essayer de m'améliorer avec le temps...
    Je ne récupère rien dans le
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    echo $Id_status
    , il en a rien à faire

  4. #4
    Invité
    Invité(e)
    Vérifie que ton formulaire est bien en method="post".
    sinon, par défaut, c'est get.

  5. #5
    Nouveau membre du Club
    Oui il l'est bien
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    <form method="post" action="index.php">

  6. #6
    Membre confirmé
    Tu peux inspecter l'élément de tes inputs et vérifier les valeurs de $item['Id_status']

    Car si sa valeur est vide, il est normal que tu reçoives des données vides

  7. #7
    Nouveau membre du Club
    Oui quand je passe par l'inspecteur, la valeur est vide, il n'y a rien dans le tableau.
    Mon champ dans ma table est formulaire_affich et je souhaite récupérer une valeur 1 si le checkbox est coché, qu'est-ce qui ne va pas du coup dans mon code ?

  8. #8
    Invité
    Invité(e)
    Bonjour,

    peux-tu :
    • montrer le formulaire complet (avec le PHP) ?
    • ainsi qu'un extrait du code HTML généré ("Ctrl"+"U")

  9. #9
    Nouveau membre du Club
    Merci

    voici le code du formulaire :
    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
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <!-- saved from url=(0014)about:internet -->
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    </head>
     
    <body>
     
     
    <div id="wrapper">
    	<div id="pressurePage">
     
    	<br /><br /><br />
     
    	<form method="post" action="index.php" class="form">
      <div class="form-group has-search">
      <span class="fa fa-search form-control-feedback"></span>
      <input type="text" class="form-control" placeholder="Search" style="clear: both;float: right;margin: -60px 14px 0 0;width: 50%; height: 34px;" name="keywords" value="<?php //echo $description; ?>">
      <button type="submit" class="btn btn-info" style="clear: both;float: right;margin: -60px 14px 0 0;" value="Rechercher"> Search </button>
    </div>
    </form>
     
    <br />
     
    		<div id="holder" class="holder">
    			<div class="colmask leftmenu">
     
     
     
     
            <div class="container admin">
                <div class="row2">
     				<table class="table table-striped table-bordered">
                      <thead>
                        <tr>
    					  <th>Code</th>
                          <th>Description</th>
                          <th>Quantité</th>
                          <th>Catégorie</th>
                          <th>Date</th>
                          <th><div align="center">Vignette</div></th>
                          <th>Actions</th>
                          <th>FL</th>
                        </tr>
                      </thead>
                      <tbody>
                          <?php
     
                            require 'database.php';
                            $db = Database::connect();
     
     
    						if(isset($_POST['envoyer']))
    						{
          						if(!empty($_POST['formulaire_affich'])) 
    							{
    								foreach($_POST['formulaire_affich'] as $formulaire_affich) 
    								{
    									$query = mysql_query('UPDATE documentation SET formulaire_affich = 1 WHERE id = '.$formulaire_affich);
    									 //do your update query
    							 	}
    						   	}
    						}
     
     
     
     
                            $statement = $db->query("SELECT * 
    						FROM table
    						WHERE elt = 1
    						ORDER BY " . $orderby);
     
                            while($item = $statement->fetch()) 
                            {
                                echo '<tr>';
    							echo '<td class="couleur_texte">'. $item['code'] . '</td>';
                                echo '<td>'. $item['description'] . '</td>';
    							echo '<td align="center">'. $item['qte_stock'] . '</td>';
                                echo '<td>'. $item['cat'] . '</td>';
     
    							$date_d = $item['date_maj'];
    							echo '<td>'. strftime('%d-%m-%Y',strtotime($date_d)) . '</td>';
     
    							echo '<td align="center">';
     
    							if (empty($item['image']))
    							{
    								//il n'y a rien dedans donc on affiche rien
    							}
    							else
    							{
    							?> 
    				  <img src="../images/<?php echo $item['image']; ?>"  style="width:110px;height:144px;"/> 
    							<?php
    							}
    							echo '</td>';
    							echo '<td><input type="checkbox" name="Id_status[]" value='.$item['Id_status'].'></td>';
    							echo '</td>';
     
    							echo '</tr>';
     
                            }
                            Database::disconnect();
                          ?>
     
     
     
    					  <input type="submit" class="head3" name"submit" value="submit"/>
     
                    </table>
     
    				</form>
     
                </div>
            </div>
     
     
     
     
     
    		  </div>
    	  </div>
     
    </div>
    </div>
     
     
    </div>
    <div id="footer">
    	<div id="footerWrapper">
    		<div class="ft-b">
    		</div>
    	</div>
    	<div class="ft-bl">
    	</div>
     
    </div>
     
     
    </div>
    </body>
    </html>




    Et pour le code html :
    Code html :Sélectionner tout -Visualiser dans une fenêtre à part
     <td><input type="checkbox" name="Id_status[]" value=""></td>


    il n'y a rien d'autre qui soit retourné

  10. #10
    Invité
    Invité(e)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     <td><input type="checkbox" name="Id_status[]" value=""></td>

    Tu vois bien que la value est vide !...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    echo '<td><input type="checkbox" name="Id_status[]" value='.$item['Id_status'].'></td>';

    C'est donc le $item['Id_status'] qui ne va pas... (et le echo '</td>'; juste après est à supprimer)

    1- Montre la STRUCTURE de ta table SQL "table".

    2- Question subsidiaire : comment est effectuée la connexion dans database.php ??

  11. #11
    Nouveau membre du Club
    Voici ma table :

    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
     
    CREATE TABLE IF NOT EXISTS `table` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `code` varchar(50) NOT NULL,
      `description` varchar(100) NOT NULL,
      `image` varchar(300) NOT NULL,
      `version_numerique` varchar(300) NOT NULL,
      `categorie` int(11) NOT NULL,
      `division` varchar(50) NOT NULL,
      `qte_stock` int(11) NOT NULL,
      `qte_demande` int(11) NOT NULL,
      `formulaire_affich` int(11) NOT NULL,
      `date_maj` date NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;



    et ma connexion à la base pour la partie update, :
    Code php :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $dbname = 'base';
    $hostname = 'localhost';
    $username = 'root';
    $password = '';
    $conn = mysql_connect($hostname,$username,$password);
    $db_selected=mysql_select_db($dbname,$conn);



    et ma partie database.sql pour l'affichage des données :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    class Database
    {
    	private static $dbHost = "localhost";
        private static $dbName = "interdb";
        private static $dbUsername = "root";
        private static $dbUserpassword = "";
     
        private static $connection = null;
     
        public static function connect()
        {
            if(self::$connection == null)
            {
                try
                {
                  self::$connection = new PDO("mysql:host=" . self::$dbHost . ";dbname=" . self::$dbName , self::$dbUsername, self::$dbUserpassword);
                }
                catch(PDOException $e)
                {
                    die($e->getMessage());
                }
            }
            return self::$connection;
        }
     
        public static function disconnect()
        {
            self::$connection = null;
        }
     
    }


    Je ne maîtrise pas très bien les classes, j'ai fait ma partie update de façon plus ancienne pour arriver à solutionner mon problème, je galérais autrement. Désolée pour le code pas très beau.

  12. #12
    Invité
    Invité(e)
    LOL...

    1- $item['Id_status'], alors que c'est 'id' dans la table SQL
    2- Tu fais une connexion en PDO, et aussi en mysql_... ... mais pas sur la même base ! (PDO : $dbName = "interdb" - mysql_ : $dbname = "base")

    Il serait temps de faire le ménage (dans ton code !), non ?


  13. #13
    Nouveau membre du Club
    ah ah ah ah ah ah ah
    Ca marche pas même en changeant le id_status en id
    Pour la bdd, je travaille bien sur la même mais je n'avais pas changé le nom pour le mettre sur ce site, oubli
    C'est sympa de se faire moquer comme ça, je viens pour apprendre.
    Merci en attendant pour l'aide apportée

  14. #14
    Modératrice

    Bon, un problème à la fois :

    1) Faire fonctionner les accès à la base : Même si la programmation objet ne t'est pas familière, tu peux quand même utiliser PDO. En te basant sur le mini-tuto indiqué par jreaux PDO une soupe et au lit !, tu peux remplacer le mysql_connect par l'appel au script de connexion (correctement renseigné et placé au bon endroit dans ton arborescence ) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $db = include 'db_mysql.php';

    et ensuite faire les requêtes dessus :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $query = mysql_query('UPDATE table SET formulaire_affich = 1 WHERE id = '.$Id_status);

    devient :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    $stmt = $db->prepate('UPDATE table SET formulaire_affich = 1 WHERE id = :id ');
    $stmt->execute([':id' => $Id_status]);


    2) Faire fonctionner ton formulaire : Commence par faire le ménage. Les noms de champs utilisés dans le formulaire doivent être les mêmes, casse comprise, que ceux utilisés dans le PHP. Seules les cases à cocher cochées sont envoyées au formulaire, et tu reçois ce qui se trouvait dans l'attribut value du champ.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  15. #15
    Nouveau membre du Club
    Bonjour et merci pour votre aide

    J'ai fait le ménage dans mon code et ajouter des modifications Celira :

    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
    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
     
    				<form action="index.php" method="post">
     
    				<table class="table table-striped table-bordered">
                      <thead>
                        <tr>
    					  <th>Code</th>
                          <th>Description</th>
                          <th>Qté</th>
                          <th>Cat.</th>
                          <th>Date</th>
                          <th><div align="center">Vignette</div></th>
                          <th>Actions</th>
                          <th>FL</th>
                        </tr>
                      </thead>
                      <tbody>
     
    <?php
                            require 'database.php';
                            $db = Database::connect();
     
     
     
    						if(isset($_POST['submit']))
    						{
    							if (isset($_POST['formulaire_affich']) && !empty($_POST['formulaire_affich'])) 
    							{
    								foreach ($_POST['formulaire_affich'] as $formulaire_affich) 
    								{
    									$stmt = $db->prepare('UPDATE doc SET formulaire_affich = 1 WHERE id = :id ');
    									$stmt->execute([':id' => $formulaire_affich]);
    								}
    							}
    							else 
    							{
    								// Aucune case cochée
    							}
    						}
     
     
                            $statement = $db->query("SELECT * FROM doc where categorie_publication = 1");
     
                            while($item = $statement->fetch()) 
                            {
                                echo '<tr>';
    							echo '<td class="couleur_texte">'. $item['code'] . '</td>';
                                echo '<td>'. $item['description'] . '</td>';
    							echo '<td align="center">'. $item['qte_stock'] . '</td>';
                                echo '<td>'. $item['categorie_publication'] . '</td>';
    							echo '<td>';
    						?>
    							<input type="checkbox" name="formulaire_affich[]" value="<?php echo $item['formulaire_affich']; ?>" />
    							<input type="submit" name="submit" value="ajouter"/>
    							<?php
     
    							echo '</td>';
    							echo '</tr>';
                            	}
                            Database::disconnect();
                          ?>
     
     
                    </table>
     
    				</form>


    Le problème vient certainement de l'id, il ne le trouve pas. Je donne la possibilité de pouvoir cocher plusieurs checkbox et on valide avec un bouton à la fin ceux que l'on veut modifier d'où le foreach mais il y a quelque chose qui ne va pas du coup.
    Merci en attendant

  16. #16
    Membre émérite
    Salut,

    Déjà if(isset($_POST['submit'])), il est ou le bouton de type submit ayant l'attribut name="submit" ?

  17. #17
    Nouveau membre du Club
    Je viens de le changer dans mon précédent message mais ça ne change rien, ça ne fonctionne pas, je ne récupère pas le 1 dans ma table.

  18. #18
    Membre émérite
    Le problème vient surement de l'id, parce que $formulaire_affich représente les valeurs des checkbox, donc soit 1(cochée) soit 0(non cochée) mais pas l'id de la ligne.

  19. #19
    Nouveau membre du Club
    Il ne rentre pas dans la boucle, j'ai rien à l'affichage.

    Je l'ai testé après le code et là il m'affiche bien formAff :1

    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
    17
    18
    19
    20
    21
    22
     
    if(isset($_POST['submit']))
    						{
    							if (isset($_POST['formulaire_affich']) && !empty($_POST['formulaire_affich'])) 
    							{
    								foreach ($_POST['formulaire_affich'] as $formulaire_affich) 
    								{
     
    									echo 'ici';
    									$stmt = $db->prepare('UPDATE documentation SET formulaire_affich = 1 WHERE id = :id ');
    									$stmt->execute([':id' => $formulaire_affich]);
     
    									echo "formAff :".$formulaire_affich;
    								}
    							}
    							else 
    							{
    								// Aucune case cochée
    							}
    						}
     
    						echo "formAff :".$formulaire_affich;

  20. #20
    Membre émérite
    D'abord, tu dois passer le id de chaque ligne dans le bouton submit (ou bien ajouter un input de type hidden juste après le bouton submit):
    Code html :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    <input type="submit" name="submit" value="Modifier"/>
    <input type="hidden" name="id" value="<?php echo $item["id"];?>" />


    après pour l'update, tu récupères le $_POST["id"] qui devient le id maintenant :
    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
    17
    18
    19
     
     
    if(isset($_POST['submit']))
    {
           $id=$_POST['id'];
           echo "id de la ligne :".$id;
    	if (isset($_POST['formulaire_affich']) && !empty($_POST['formulaire_affich'])) 
    	{       /* tu peux préparer la requête en dehors du foreach, d'ailleur je ne vois pas l'utilité de cette boucle foreach si tu n'a qu'une seule case à cocher dans chaque ligne....*/
    	        $stmt = $db->prepare('UPDATE doc SET formulaire_affich = 1 WHERE id = :id ');
    		foreach ($_POST['formulaire_affich'] as $formulaire_affich) 
    	       {
                           $stmt->execute([':id' => $id]);//ici tu met $id et pas $formulaire_affich
    		}
    	}
            else 
           {
           // Aucune case cochée
           }
    }


    Met toujours des echo pour voir ce qui se passe.

###raw>template_hook.ano_emploi###