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 :

Formulaire de MAJ général avec checkbox


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 77
    Points : 54
    Points
    54
    Par défaut Formulaire de MAJ général avec checkbox
    Salut,

    Je bloque sur un truc qui ça se trouve est tout con...

    Voici mon problème :

    J'ai un formulaire qui affiche les articles de ma base de données :

    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
     
    <form method="post" action="check_article_index.php">
     
    				<div id="tab_gestion_produit_accueil">
     
    					<table>
     
    						<tr>
     
    							<td width="60px">Image</td>
    							<td width="300px">Libell&eacute;</td>
    							<td width="60px">Prix Vente</td>
    							<td width="60px">Accueil ?</td>
     
    						</tr>
     
     
     
    	<?php // Requête permettant d'afficher la liste des articles
    	$query1 = "SELECT * FROM Produits ORDER BY Top_accueil_produit DESC, Libelle_produit";
    	$result1 = mysql_query($query1) or die (mysql_error());
     
    while ($ligne1 = mysql_fetch_array($result1)) {
     
    							$count = mysql_num_rows($result1); ?>
     
    							<input type="hidden" name="ID_produit[]" value="<?php echo $ligne1['ID_produit']; ?>" />
    							<input type="hidden" name="count" value="<?php echo $count; ?>" />
    							<input type="hidden" name="login" value="<?php echo $_SESSION['pseudo']; ?>" />
     
    							<tr>
     
    								<td width="60px">
    									<img src="http://www.monadresse.com/Images/Produits/<?php echo $ligne1['Code_produit'].'_01.jpg'; ?>" height="40px" width="36px" alt="Image <?php $ligne1['Libelle_produit']; ?>" />
    								</td>
    								<td width="300px" align="left">
    									<?php echo $ligne1['Libelle_produit']; ?>
    								</td>
    								<td width="60px" align="left">
     
    									<?php if ($ligne1['PrixPromo_produit'] == 0) {
     
    										$prix = $ligne1['PrixVente_produit'];
     
    									} else {
     
    										$prix = $ligne1['PrixPromo_produit'];
     
    									}
     
    									echo $prix.' €'; ?>
     
    								</td>
    								<td width="60px">
    									<input type="checkbox" name="Top_accueil_produit[]" value="<?php echo $ligne1['Top_accueil_produit']; ?>" <?php if ($ligne1['Top_accueil_produit'] == '1') echo ' checked="checked"'; ?>>
    								</td>
     
    							</tr>
     
                                                            <tr align="center">
     
    								<td align="center" colspan="4">
     
    									<p>&nbsp;</p>
     
    									<input type="submit" value="Valider" />
     
    									<p>&nbsp;</p>
     
    								</td>
     
    							</tr>
     
    					</table>
     
    				</div>
     
    			</form>
    Et je veux que si je coche la checkbox de la ligne de mon article alors un champs de ma table article se mettent à 1.

    Ma page de traitement fait cela :

    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
     
    // On garde les sessions au passage sur cette page
    session_start();
     
    // Si les infos de connexion sont fausses alors on renvoi vers la page identification.php
    if (!isset($_COOKIE['login']) or $_SESSION['type'] <> '1') {
     
    	header('location: http://www.monadresse.com/Pages/identification.php?connexion_ko=1');
     
    } else {
     
    	// On va chercher le fichier des fonctions
    	include_once("fonctions.php");
     
    	// Connexion à la BD
    	ouvrir_BD();
     
    	// On récupère le nombre d'enreg à modifier + le login de l'utilisateur
    	$count = $_POST['count'];
    	$login = $_POST['login'];
     
    	for ($i = 0; $i < $count; $i++) {
     
    		// On récupère l'ID
    		$ID_produit = $_POST['ID_produit'][$i];
    		$Top_accueil_produit = $_POST['Top_accueil_produit'][$i];
     
    		// Gestion de la checkbox
    		if (isset($Top_accueil_produit)) {
     
    			$val = 1;
     
    		} else {
     
    			$val = 0;
     
    		}
     
    		// Traitement des dates / heures / utilisateurs	
    		$DateMaj_produit = date('Y-m-d');
    		$HeureMaj_produit = date('H:i:s');
    		$UserMaj_produit = $login;
     
    		// Requête permettant de modifier l'article		
    		$query = "UPDATE Produits SET
    		Top_accueil_produit = '$val',
    		DateMaj_produit = '$DateMaj_produit',
    		HeureMaj_produit = '$HeureMaj_produit',
    		UserMaj_produit = '$UserMaj_produit'
    		WHERE 
    		ID_produit='$ID_produit'";
    		$result = mysql_query($query) or die (mysql_error());*/
     
    	}
     
    	// Déconnexion de la base de données
    	mysql_close();
     
    	// Traitement du message
    	$message2 = 'Les articles de la page d\'accueil ont &eacute;t&eacute; modifi&eacute;s';
    	$identifiant2 = uniqid('');
    	$_SESSION[$identifiant2] = $message2;
     
    	// On renvoi à la page
    	header('Location: gerer_article_index.php?id_message_ok='.$identifiant2.'');*/
     
    }
    Problème : ça ne met pas à jour les lignes que j'ai coché mais à chaque fois les premières lignes de ma requête qui est dans le formulaire.

    Exemple : j'ai une liste de 20 articles, je coche les lignes 5, 7 et 13, au lieu de mettre à 1 le champ pour mes enreg 5, 7 et 13, ça le fait pour les enreg 1, 2 et 3 !

    Je m'arrache les cheveux, je n'arrive pas à trouver où est la faille..... ??

    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    $count n'a pas grand intérêt, à partir du moment où il existe un identifiant auto-incrémenté.
    Chaque enregistrement en BdD, et donc chaque ligne du tableau, est "identifiable" par $ligne1['ID_produit'].

    Il s'agirait donc ici de revoir la logique de conception.

    Pour ne répondre qu'à ton problème, le plus simple au niveau des checkbox et de remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="Top_accueil_produit[]" value="..... />
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="Top_accueil_produit[<?php echo $ligne1['ID_produit']; ?>]" value="..... />

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 77
    Points : 54
    Points
    54
    Par défaut
    Merci pour ta réponse.

    Je viens de tester mais même avec ça, ça ne marche pas mieux.

    J'ai une autre page quasi similaire mais sans checkbox et ça marche parfaitement bien....

    Une autre idée ?

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    La suggestion de jreaux62 me semble une bonne solution.

    Citation Envoyé par lebanner82
    Merci pour ta réponse.Je viens de tester mais même avec ça, ça ne marche pas mieux.
    Le problème ne viendrait peut être pas au niveau du formulaire, mais peut être dans la manière d'exploiter les données renvoyés par ce formulaire.

    Si tu opte pour la solution de jreaux62, il suffit de faire une boucle foreach() avec $_POST['Top_accueil_produit']
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    foreach ($_POST['Top_accueil_produit'] as $ID_produit => $val) {
        // Liste des checkbox cochés
        echo 'ID_produit : '.$ID_produit.'<br />';
    }
    ?>
    Ca devrait lister tous les ID des produits de Top_accueil_produit cochés.

    Cependant, il ne faudrait peut être pas s'arrêter à mettre à jour uniquement les checkbox cochés, il faudrait théoriquement mettre à jours les checkbox non cochés aussi dont la valeur d'origine étaient à 1.
    Il ne faut pas perdre de vu que seul les checkbox cochés sont renvoyés par POST lorsqu'on valide le formulaire.
    C'est à dire que lorsqu'on affiche le formulaire et que (pour exemple) le produit 5 vaut 1 (en Top Accueil), à l'affichage il sera coché par défaut.
    Si l'utilisateur le décoche, ça sous-entend qu'il ne veut plus qu'il fasse parti des Top Accueil, donc il faut mettre à jour ce produit (le 5) et mettre 0 comme valeur.
    Ca sous entend qu'il faudrait faire une 1ère boucle sur tous les produits, puis dans cette boucle boucler sur les produits cochés :
    -> SI produit coché : mettre comme valeur 1
    -> SINON mettre comme valeur 0


    Le plus simple peut être aurait été d'exploiter des boutons radios :
    Top Accueil : Oui | Non
    Comme cela, tous les produits seront renvoyés par le formulaire, du coup, à la réception des données on pourra boucler sur tous les produits et il suffit de les mettre à jour selon la valeur du bouton radio (0 ou 1).
    Ceci dit, s'il y a énormément de produits, c'est pas très top/optimisé comme solution.


    Ceci dit, la logique veut que la liste des produits en Top accueil est juste un sous-ensemble de tous les produits, donc pas tous.
    Donc mettre un champ "Top_accueil_produit" dans la table "Produits" est théoriquement une erreur de conception.
    Je dis théoriquement car ça peu se faire quand même.

    Ce qui veut dire qu'il serait peut être mieux de créer une table spécifique pour exprimer ce besoin, une table genre "top_accueil".
    Champs : id | id_produit
    Ensuite, il suffit d'enregistrer uniquement les produits qui seront en TopAccueil, et supprimer ceux qu'on ne souhaite plus.
    Il n'y aura jamais de requête de type update.

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

Discussions similaires

  1. [MySQL] Modifier un formulaire avec checkbox
    Par isa150183 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/01/2007, 21h32
  2. Réponses: 1
    Dernier message: 24/10/2006, 12h10
  3. Timeout sur POST formulaire avec checkbox
    Par shyangel dans le forum Langage
    Réponses: 16
    Dernier message: 11/05/2006, 12h59
  4. [MySQL] Formulaire de MAJ avec photos
    Par ¤dinky¤ dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 31/03/2006, 13h04
  5. Pb validation formulaire avec checkbox
    Par wolfe dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/12/2005, 08h50

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