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 et bouton radio


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut Update et bouton radio
    Bonjour à tous,

    Je suis confronté à un problème d' UPDATE en boucle.
    Dans l'update simple (voir ci-dessous) tout fonctionne.

    Dans l'update multiple, il fonctionne sauf les boutons radios...

    Dans l'update en boucle, je n'arrive pas à récupérer la valeur du bouton radio et je désire qu'un seul couple de bouton radio par groupe d'update. Pas moyen d'y arriver.

    Si je mets mes boutons radios en dehors de ma boucle cela fonctionne visuellement mais c'est tout ...
    Je vous laisse mon code php d'update multiple en bas de post
    Est-ce que quelqu'un peut m'aider?

    Merci d'avance,
    David

    L'update simple fonctionne et voici 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <?php
    include './views/menu.inc.php';
    context_title(TXT_UPDATE_COUNTRY);
    print_r($_POST);
    $id_country = $_POST['id_country'];
    $name_country = $_POST['name_country'];
    $lang = $_POST['lang'];
    $active = $_POST['active'];
    $sql="SELECT * FROM country WHERE id_country='".$_GET['id_country']."'";
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);
     
    echo "<form name=\"update_country\" method=\"post\" action=\"\">\n";
     
    while($rows=mysql_fetch_array($result)){
    	echo "\t<input name=\"id_country\" type=\"hidden\" value=\"".$rows['id_country']."\"/>\n";
    	echo "\t<input name=\"name_country\" type=\"text\" value=\"".$rows['name_country']."\"/>\n";
    	echo " ".TXT_LANGUAGE." ".$rows['lang'].'<br />';
        echo "<input type=\"radio\" name=\"active\" value=\"1\"";
    		if($rows['active'] == 1){
    			echo "checked='checked'";
    		} 
    		echo"/>".TXT_YES;
    		echo "<input type=\"radio\" name=\"active\" value=\"0\"";
    			if($rows['active'] == 0){
    				echo "checked='checked'";
    			}
    			echo "/>".TXT_NO;
    }
    echo "<input type=\"Submit\" name=\"button\" value=\"".TXT_SAVE."\"/>\n";
    echo "</form>";
    echo $update;
    if(isset($_POST['button'])){
    	for($i = 0;$i < $count;$i++){
    		$update = "UPDATE country SET name_country='".$name_country."',active='".$active."' WHERE id_country='".$id_country."'";
    		$result_update=mysql_query($update);
    	}
    }
    if($result_update){
    	echo TXT_UPDATE_OK;
    	echo $update;
    	echo "<meta http-equiv=\"refresh\" content=\"1;URL=?section=update_country&id_country=".$_GET['id_country']."&lang=".$_SESSION['lang']."\">";
    }
    ?>
    Update multiple:

    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
     
    <?php
    include './views/menu.inc.php';
    context_title(TXT_UPDATE_COUNTRY);
    print_r($_POST);
    $id_country=$_POST['id_country'];
    $name_country=$_POST['name_country'];
    $lang=$_POST['lang'];
    $active = $_POST['active'];
    $sql="SELECT * FROM country WHERE id_group='".$_GET['id_group']."'";
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);
     
    echo '<form name="update_country_group" method="post" action="">';
     
    while($rows=mysql_fetch_array($result)){
    	echo '<input name="id_country[]" type="hidden" value="'.$id_country[]=$rows['id_country'].'"/>';
    	echo '<input name="name_country[]" type="text" value="'.$name_country[]=$rows['name_country'].'"';
    	echo "/>";
    	echo '<input name="id_group[]" type="hidden" value="'.$id_group[]=$rows['id_group'].'"/>';
    	echo " ".TXT_LANGUAGE." ".$lang[]=$rows['lang']."\n"; 
     
    echo "<input type=\"radio\" name=\"active[]\" value=\"1\"";
    	if($active[] = $rows['active'] == 1){
    		echo "checked='checked'";
    	} 
    	echo"/>".TXT_YES;
    	echo "<input type=\"radio\" name=\"active[]\" value=\"0\"";
    		if($active[] = $rows['active'] == 0){
    			echo "checked='checked'";
    		}
    		echo "/>".TXT_NO;
     }
    echo '<input type="Submit" name="button" value="Enregister"/>';
    echo '</form>';
     
    if(isset($_POST['button'])){
    	for($i=0;$i<$count;$i++){
    		$update ="UPDATE country SET name_country='".$name_country[$i]."',id_group='".$id_group[$i]."',lang='".$lang[$i]."',active='".$active[$i]."' WHERE id_country='".$id_country[$i]."'";
    		$result_update=mysql_query($update);
    		echo $update."<br>";
    	}
    }
    if($result_update){
    	echo TXT_UPDATE_OK;
    	echo $update;
    	echo "<meta http-equiv=\"refresh\" content=\"1;URL=?section=update_country_group&id_group=".$_GET['id_group']."&lang=".$_SESSION['lang']."\">";
    }
    ?>

  2. #2
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Solution trouvée.
    Je clôture et mets celle-ci:

    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
     
    if(isset($_POST['button']) && $_POST['active'] == 1){
    	for($i=0;$i<$count;$i++){
    		$update ="UPDATE country SET name_country='".$name_country[$i]."',lang='".$lang[$i]."',active='1' WHERE id_country='".$id_country[$i]."'";
    		$result_update=mysql_query($update);
    		echo $update."<br>";
    	}
    }elseif(isset($_POST['button']) && $_POST['active'] == 0){
    	for($i=0;$i<$count;$i++){
    		$update ="UPDATE country SET name_country='".$name_country[$i]."',id_group='".$id_group[$i]."',lang='".$lang[$i]."',active='0' WHERE id_country='".$id_country[$i]."'";
    		$result_update=mysql_query($update);
    		echo $update."<br>";
    	}
    }
    if($result_update){
    	echo TXT_UPDATE_OK;
    	echo $update;
    	//echo "<meta http-equiv=\"refresh\" content=\"1;URL=?section=update_country_group&id_group=".$_GET['id_group']."&lang=".$_SESSION['lang']."\">";
    }

  3. #3
    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
    Par défaut
    Salut

    Même si le formulaire d'update simple fonction, il y a une petite erreur, un petit détail qui n'est pas correcte.
    Tu fais une boucle while, or, logiquement un country_id est unique, donc il ne peu avoir que 2 alternatives :
    - soit la requête renvoie rien car le $_GET['id_country'] est incorecte, donc 0 ligne.
    - soit le $_GET['id_country'] est correcte alors on obtiendra qu'une seule et unique ligne.

    Dans les 2 cas une boucle est inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $rows=mysql_fetch_array($result);
    Ceci suffit.
    Je rajouterais qu'utiliser $row comme nom est franchement pas intuitif du tout.
    Vu que ce sont des "country", $country aurait largement mieux.
    Rend ton code plus compréhensible, tu te remercieras lors des débogages.


    Mise à part ces petites parenthèses, essai dans ce sens là pour le formulaire multiple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo '<input name="country['.$country['id_country'].'][name_country]" type="text" value="'.$country['name_country'].'" />';
    echo '<input name="country['.$country['id_country'].'][id_group]" type="text" value="'.$country['id_group'].'" />';
    ... etc ...
    Du coup, tu n'as pas besoin de champ caché, l'Identifiant fait parti du nom, c'est ça qui va permettre de retrouver ces petits.
    Au bout, on devrait obtenir un dans $_POST un tableau "country".
    Exploite une boucle foreach() sur $_POST['country'] et tu devrais obtenir les valeur comme name_country, id_group, etc ... pour chaque id_country.


    En tout cas, il ne faut pas faire comme ceci : "country[]" car dans la même boucle le navigateur va incrémenter les autres éléments automatiquement, ce qui devient quasi impossible de les retrouver après validation.
    Il faut donc soit même indiquer un identifiant, et le même pour tous les éléments, le changer uniquement à la boucle suivante (à tour de boucle).
    Il est là le principe.


    Autre point.
    Tu prévois dans le déroulement de ton code de faire l'UPDATE à la fin, en dernier.
    Tu fais un amalgame entre le déroulement du code HTML et celui de Php.
    Il est largement mieux de faire l'UPDATE avant tout éléments HTML, par conséquent avant d'afficher le formulaire.
    Par la même occasion, ça t'évitera de faire un "meta/refresh" qui franchement, est loin d'être très ergonomique.
    Faut exploiter la fonction Php header(), elle est faite pour ça.
    D'ailleurs, le fait d'afficher le contenu du formulaire avant de faire la mise à jour, ça veut dire que ce que l'on voit ne sera pas synchro, les valeurs affchées sont toujours les ancienne.
    A l'inverse, faire l'UPDATE en 1er fera qu'après, les valeurs récupérées/affichées auront les même valeurs que celle mise à jour juste avant.

    Toujours est il que lors de la validation du formulaire, le contenu de $_POST ser disponible dès la toute 1ère ligne de code de cette page, donc on peu l'exploiter dès cet instant.
    Donc coté déroulement / chronologie, il serait mieux de faire :
    1/ SI $_POST['button'] (donc SI faut faire un UPDATE) -> alors on le fait de suite.
    D'ailleurs, ça laissera tout le loisir de détecter une erreur, et éventuellement stcker le message dans une variable ou tableau Php pour l'exploiter plus tard.
    Ou inversement, avertir que la mise à jour a bien été effectuée.
    Et dernièrement, on pourra faire une redirection (header) sans aucun problème si nécessaire.

    2/ On récupère les données (SELECT). Les données seront alors synchro (qu'il y ait eu ou pas d'UPDATE précédemment).

    3/ On génère la page HTML (doctype/formulaire).
    Ici, s'il y a eu un message, on peu l'afficher là où on veut, et de la mise en forme qu'on veut.

  4. #4
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Merci de ta réponse.

    Cependant je n'arrive pas à garder la valeur du bouton radio dans l'update multiple. Hors je le fais de la même façon que dans l'update simple.
    As tu une idée?

    Merci d'avance,

    David

  5. #5
    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
    Par défaut
    Cependant je n'arrive pas à garder la valeur du bouton radio dans l'update multiple. Hors je le fais de la même façon que dans l'update simple.
    Il faut justement pas faire de le même manière, car il y a une boucle, et du coup le navigateur lui même est déboussolé.

    D'ailleurs, tu ne le fais pas de la même manière, dans le multiple, tu fais ceci pour les 2 boutons :
    active[]

    Reprends les explications que j'ai mis, et la façon de procéder (qui demandera de remanier un peu tout ça).

    Faut comprendre qu'en faisant 2 fois ça : active[] ... active[] on dit explicitement au navigateur d'incrémenter automatiquement le futur tableau qui sera renvoyé.
    Donc ça revient au même de faire ça pour les 2 premiers :
    active[0] ... active[1] -> donc avoir 2 noms différents.
    Or, un groupe de bouton radio DOIT avoir le même nom, c'est justement leur nom unique qui permettra d'avoir un groupe, donc 1 choix entre 2 (ou plusieurs) propositions.

    Donc en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Bouton 1
    echo '<input type="radio" name="country['.$country['id_country'].'][active]" value="0" />';
     
    // Bouton 2
    echo '<input type="radio" name="country['.$country['id_country'].'][active]" value="1" />';
    Ici, leur nom est unique, leur valeur : 0 et 1. Il y a juste à se préoccuper de checker le bon bouton selon la valeur dans la BDD.


    En tout cas, la façon ici de structurer le formulaire est largement plus ergonomique.
    Une simple boucle foeach() suffira pour mettre à jour tous les éléments, sans compter qu'on n'a pas besoin de champ caché.
    Le champ caché est justement une astuce pour combler ce manque de structure.

  6. #6
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cambodge

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Juin 2010
    Messages : 221
    Par défaut
    Encore un tout grand merci ;-)

    Là je suis entrain de refaire l'update simple en suivant tes conseils.
    Il fonctionne mais je n'arrive pas à récupérer la valeur du bouton radio. Hors il s'enregistre bien dans la bdd.
    Voici 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
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
    include './views/menu.inc.php';
    context_title(TXT_UPDATE_COUNTRY);
    $id_country = $_POST['id_country'];
    $name_country = $_POST['name_country'];
    $lang = $_POST['lang'];
    $active = $_POST['active'];
    $sql="SELECT * FROM country WHERE id_country='".$_GET['id_country']."'";
    $result=mysql_query($sql);
    $count=mysql_num_rows($result);
     
    $country = mysql_fetch_array($result);
     
    if(isset($_POST['button'])){
    		$update = "UPDATE country SET name_country='".$name_country."',active='".$active."' WHERE id_country='".$id_country."'";
    		$result_update=mysql_query($update);
    }
    if($result_update){
    	echo TXT_UPDATE_OK;
    	echo $update;
    	header("Location: ".$_SERVER['REQUEST_URI']."");
    }
    ?>
    <form name="update_country" method="post" action="">
    	<input name="id_country" type="hidden" value="<?php echo $country['id_country'];?>"/>
    	<input name="name_country" type="text" value="<?php echo $country['name_country'];?>"/>
    	<?php echo TXT_LANGUAGE.$country['lang'];?>
    	<input type="radio" name="active" value="1"/>
    	<?php echo TXT_YES;
    	if($country['active'] == 1){
    		echo "checked='checked'";
    	}
    	?>
    	<input type="radio" name="active" value="0"/>
    	<?php echo TXT_NO;
    	if($country['active'] == 0){
    		echo "checked='checked'";
    	}
    	?>
    	<input type="submit" name="button" value="<?php echo TXT_SAVE;?>"/>		
    </form>

  7. #7
    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
    Par défaut
    Salut

    Bien que tu ais remonté certains codes, tu effectue toujours la récupération des données (SELECT) avant de mettre à jour la Bdd.

    Il est pourtant plus logique de faire l'UPDATE avant, pour la simple raison que l'affichage qui suit coté formulaire doit tenir compte de la mise à jours.
    C'est entre autre pour ça à mon avis que tu faisais un refresh.

    C'est à mon sens ça qui te cause problème.
    Lors du SELECT, qui se fait en 1er récupère la valeur actuelle, donc pas encore celle mise à jour, il y a alors incohérence.


    Mais ton code concernant ces boutons radios comportent des erreurs.
    Les checked='checked' se trouvent en-dehors des balises <input ...etc ... />.
    Essai dans ce genre là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $check0 = '';
    $check1 = '';
    if ((int)$country['active'] === 1)  {
        $check1 = 'checked="checked"';
    }
    else {
        $check0 = 'checked="checked"';
    }
    //
    echo '<input type="radio" name="active" value="1" '.$check1.' />'.TXT_YES;
    echo '<input type="radio" name="active" value="0" '.$check0.' />'.TXT_NO;
    ?>

    Aussi, il ne faut pas faire de echo avant le header(), ça va te provoquer des erreurs.
    De plus, ce n'est pas logique.
    Quand on fait un header(), une redirection, ça sous entend qu'on ne souhaite plus poursuivre les traitement à l'endroit même où ce trouve le header(), mais que Php exécute un tout autre contenu, celui de la page indiquée du Location.
    Donc le echo (l'affichage) ne sera de toute manière pas affichée.

    Il faut comme ceci tout simplement :
    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
     
    if(isset($_POST['button'])) {
    	$update = "UPDATE country
    SET name_country = '".$name_country."',
    active = '".$active."'
    WHERE id_country='".$id_country."'";
        $result_update = mysql_query($update);
        //
        header("Location: la_page_formulaire.php?maj=Ok");
        exit();
    }
    // On récupère les données à cet instant (après l'UPDATE)
    $sql = 'SELECT ... etc ...';
    ... etc ...
     
    // On initialise un message d'avertissement si tel est le cas.
    $message = NULL;
    if(isset($_GET['maj'])) {
        if ($_GET['maj'] == 'Ok') {
            $message = TXT_UPDATE_OK;
        }
        elseif ($_GET['maj'] == 'Error') {
            $message = TXT_UPDATE_ERROR;
        }
    }
    ?>
     
     
    <doctype ...>
    <html>
     
    ... etc ...
     
    // Dans la partie HTML/Formulaire
    if (!empty($message)) echo $message
    ?>
     
    </html>
    Ici, on sépare un peu mieux la partie traitements et HTML, ce qui évite certaines erreurs, mais surtout ça offre bien plus de possibilités que de tout mélanger.

Discussions similaires

  1. [MySQL] bouton radio php mysql UPDATE multiple
    Par Billy69008 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/05/2010, 10h21
  2. recupérer la valeur d'un bouton radio
    Par ericmart dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 19/05/2008, 15h42
  3. apparition d'un chanp text au click d'un bouton radio
    Par Flobel dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 09/11/2004, 09h34
  4. [CR]liste de boutons radio
    Par inesfonfon dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 16/09/2004, 09h04
  5. Problème de boutons radio
    Par BRAUKRIS dans le forum Composants
    Réponses: 3
    Dernier message: 03/06/2004, 02h41

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