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

Langage PHP Discussion :

[Tableaux] Problème de valeur dans un tableau (array)


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut [Tableaux] Problème de valeur dans un tableau (array)
    Bonjour,

    Voici mon problème.

    Sur une page, j'affiche un certain nombre d'informations issues d'une base de donnée.

    Certaines des données sont modifiables grâce à un formulaire dont vous trouverez l'extrait qui me pose un problème ci-dessous.

    On dois d'abord cocher la checkbox correspondant à la ligne ou aux lignes que l'on souhaite modifier puis faire son choix dans la liste <select>.

    Sachant que l'on a la possibilité de sélectionner une ou plusieures lignes à modifier, je stock les valeurs de mes checkbox et des <select> dans des tableaux (check[] et alert[]).

    Ce qui se passe c'est qu'à l'envoi des données, le tableau alert[] enregistre non seulement les données des lignes cochées mais aussi celles des lignes non cochées.

    Ce qui me donne ca :

    Array check[] : Array ( [0] => 26 )
    Array Alert[] : Array ( [0] => vert [1] => orange [2] => vert )
    Alert : orange
    Requete : UPDATE wst_install SET site_alert = 'vert' WHERE id = '26'

    Alors que je devrais avoir ca :

    Array check[] : Array ( [0] => 26 )
    Array Alert[] : Array ( [0] => orange)
    Alert : orange
    Requete : UPDATE wst_install SET site_alert = 'orange' WHERE id = '26'

    Auriez vous une idée de la raison pour laquelle le tableau alert[] enregistre toutes les valeurs de chaque lignes au lieu de m'enregistrer uniquement les valeurs de mes lignes sélectionnées ?

    J'espère avoir été clair...

    Ci-dessous mon formulaire et son traitement.

    Merci

    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
    20
    21
     
    <form method="POST" action="'.$_SERVER['PHP_SELF'].'">';
     
    while ($voir = mysql_fetch_array($result)) {
    echo '
    	<tr bgcolor="#FFFFFF" class="tab_donnees" height="20px">
     
    		<td><input type="checkbox" name="check[]" value="'.$voir['id'].'"></td>
    		<td>	
    			<select class="select" name="alert[]" size="1">
    				<option value="vert">Vert
    				<option value="orange">Orange
    				<option value="rouge">Rouge
    			</select>
    		</td>	
    	</tr>';
    }
    echo '
    </table>
    <br>
    <div class="div_rec"><input type="submit" class="rec_mods" value="Enregistrer les changements"></form>

    Traitement 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    if ((isset($HTTP_POST_VARS['check']))&&(isset($HTTP_POST_VARS['alert']))) {
     
    		$array_count = count($check);
    		/*echo '<br>Nbre :';
    		echo $array_count;
    		echo '<br>Nbre 2:';
    		echo $array_count2;
    		echo '<br>';*/
     
        	for($y=0; $y<$array_count; $y++) {
    		//echo 'OK2';
    	 	$db_conn = db_connect();
            $requete = "UPDATE wst_install
    					SET site_alert = '$alert[$y]'
    					WHERE id = '$check[$y]'";
     
    		$result = mysql_query($requete);
        }
    	if ($result == true) {
    		echo '<div class="div-alert-b"><br>Changements effectués avec succès !<br><a href="javascript:history.go(-1)">Continuer</a><br><br>';
    		echo 'Tab Check : ';
    		print_r($check);
    		echo '<br>Tab Alert : ';
    		print_r($alert);
    		echo '<br>Alert : ';
    		echo $alert[1];
    		echo '<br>Requete : ';
    		echo $requete;
    		echo '
    		<br><br></div>';
    	}
    	if ($result == false) {
    		echo '<div class="div-alert-b"><br>Changements impossible !<br><a href="javascript:history.go(-1)">Continuer</a><br><br></div>';
    	}
    }

  2. #2
    Membre éprouvé Avatar de macbook
    Inscrit en
    Février 2006
    Messages
    838
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 838
    Points : 1 009
    Points
    1 009
    Par défaut
    Renommes ton <select> en "alert" plutôt que "alert[]" pour voir ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    J'ai déjà essayé ca et malheureusement ca ne fonctionne pas mieux.

    J'ai également essayé de vider le tableau $alert à la fin du traitement des données mais ca ne fonctionne pas non plus.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Points : 362
    Points
    362
    Par défaut
    j'ai une question a quoi correspond cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $array_count = count($check);
    et bien sur les valeur surtout $check

    et pourquoi au lieu de ta boucle que je comprend pas trop ou tu veux en venir tu fais pas un truc du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE wst_install SET site_alert = '$_POST['allerte']' WHERE id = '$_POST['check']'
    Et si tu as plusieur ligne possible a cocher ou checker tu leur balance un input hidden pour cacher le numero au quel tu est et tu remplace le nom de tes input par check.$i et alert.$i ou i est la ligne a UPDATE ou tu en est.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $array_count = count($check);
    Cette ligne compte et renvoie le nombre de checkbox cochée.

    Ce qui me saoule c'est que $check renvoie bien le bon nombre de cases cochée mais que $alert lui, ne renvoi pas le bon nombre.

    En ce qui concerne ta solution , zulot, tu récupère comment les valeurs de $alert pour chaques lignes si tu ne les stocke pas dans un tableau ?

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Fais attention à ne pas utiliser register_globals à "On", c'est plus sûr.
    Du coup, fais attention à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $array_count = count($check);
    De manière générale, essaie d'être homogène dans l'accès à tes variables.

  7. #7
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Salut

    C'est normal que check[] et alert[] n'est pas le meme nombre d'élément.

    check[] n'est renseigné qu'avec les valeurs cochées alors que alert[] est renseigné avec les valeurs de tous les select puisqu'ils ne sont pas filtrés.

    Il faudrait faire un traitement en js pour ne transmettre que celles dont la checkbox est cochée.

    Pierre

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    Salut,

    C'est bien ce qui me semblait mais j'étais pas sur.

    Par contre un traitement en js, là je suis impuissant...

    A moins que je remplace mon select par des checkbox sachant que je n'ai que trois choix possible.

  9. #9
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    L'autre solution, à mon avis plus efficace, est de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $checks = array();
    if(!empty($_POST['check']){
       foreach($_POST['check'] as $check){
          if(!empty($check)){
             $checks[] = $check;
          }
       }
    }
    À la fin, le tableau $checks ne contiendra que les cases cochées.

  10. #10
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Ce que tu peux faire, j'ai pas testé mais je pense que cela fonctionne:

    Tu mets tous tes selects 'disabled' par défaut. Donc ils ne sont pas transmis.

    Quand une case est coché, il faut rendre le select correspondant actif.

    Pour identifier un select, il faudrait lui attribuer un 'id' ayant pour valeur la value de la checkbox correspondante.

    Voilà

    Pierre

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    J'ai testé en mettant des chexbox à la place du select. Et ca fonctionne. Mais c'est moins beau.

    Je vais essayer vous suggetions.

    Merci

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    Mon problème ne viens pas du tableau $check qui renvoie lui le nombre correct de cases cochée mais vient de mon champ <select>

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    J'ai réussi à trouver un srcipt me permettant de désactiver le champ select. Par contre il ne m'applique la désactivation que sur la première ligne de mon tableau.

    Et au chargement de la page, les champs ne sont pas désactivé, il faut que je slique deux fois sur la checkbox pour désactiver le champ.

    Voici le 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
    <script language="Javascript">
    // ==================
    //	Activations - Désactivations
    // ==================
    function GereControle(Controleur, Controle, Masquer) {
    var objControleur = document.getElementById(Controleur);
    var objControle = document.getElementById(Controle);
    	if (Masquer=='1')
    		objControle.style.visibility=(objControleur.checked==true)?'visible':'hidden';
    	else
    		objControle.disabled=(objControleur.checked==true)?false:true;
    	return true;
    }
    </script>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <input type="checkbox" name="check[]" id="chkb_1" onClick="GereControle(\'chkb_1\', \'texte_1\', \'0\');" value="'.$voir['id'].'">
     
    <select class="select" name="alert[]" id="texte_1" size="1">
    				<option value="vert">Vert
    				<option value="orange">Orange
    				<option value="rouge">Rouge
    			</select>

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    J'ai réussi à trouver un srcipt me permettant de désactiver le champ select. Par contre il ne m'applique la désactivation que sur la première ligne de mon tableau.

    Et au chargement de la page, les champs ne sont pas désactivé, il faut que je slique deux fois sur la checkbox pour désactiver le champ.

    Voici le 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
    <script language="Javascript">
    // ==================
    //	Activations - Désactivations
    // ==================
    function GereControle(Controleur, Controle, Masquer) {
    var objControleur = document.getElementById(Controleur);
    var objControle = document.getElementById(Controle);
    	if (Masquer=='1')
    		objControle.style.visibility=(objControleur.checked==true)?'visible':'hidden';
    	else
    		objControle.disabled=(objControleur.checked==true)?false:true;
    	return true;
    }
    </script>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <input type="checkbox" name="check[]" id="chkb_1" onClick="GereControle(\'chkb_1\', \'texte_1\', \'0\');" value="'.$voir['id'].'">
     
    <select class="select" name="alert[]" id="texte_1" size="1">
    				<option value="vert">Vert
    				<option value="orange">Orange
    				<option value="rouge">Rouge
    			</select>

  15. #15
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    pour désactiver les champs au chargement de la page, il faut penser à mettre l'attribut disabled comme ceci :


    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
     
    while ($voir = mysql_fetch_array($result)) {
    echo '
       <tr bgcolor="#FFFFFF" class="tab_donnees" height="20px">
     
          <td><input type="checkbox" name="check[]" value="'.$voir['id'].'"></td>
          <td>   
             <select class="select" name="alert[]" id="texte_1" size="1" disabled>
                <option value="vert">Vert
                <option value="orange">Orange
                <option value="rouge">Rouge
             </select>
          </td>   
       </tr>';
    }

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 122
    Points : 67
    Points
    67
    Par défaut
    Merci de votre aide, je viens de résoudre mon problème ;-)

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

Discussions similaires

  1. [Tableaux] retrouver une valeur dans un tableau
    Par tininou dans le forum Langage
    Réponses: 3
    Dernier message: 26/01/2007, 22h04
  2. Réponses: 6
    Dernier message: 26/12/2006, 17h01
  3. Réponses: 2
    Dernier message: 19/12/2005, 12h23
  4. [Tableaux] Extraction de valeur dans un tableau
    Par pirouette_07 dans le forum Langage
    Réponses: 6
    Dernier message: 21/10/2005, 17h54
  5. [Tableaux]Ajouter des valeurs dans un tableau
    Par Antoine1183 dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 03/04/2005, 13h41

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