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 :

Conserver les données après le contrôle du formulaire


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut Conserver les données après le contrôle du formulaire
    Bonjour,

    Voici mon souci. J'ai une page qui contient une dizaine de formulaire tous construit sur le même schéma dans une boucle foreach(). Pour chaque groupe de cheval, il y a donc un formulaire et pour chaque cheval du groupe il y a une ligne dans le formulaire qui répertorie tout ses attributs avec des boutons, des checkbox etc... Lorsque je valide un formulaire, je fais appel à mon contrôleur qui vérifie la cohérence de la saisie puis retourne les messages d'erreur ou exécute l'action souhaiter. Le problème c'est que en cas d'erreur tout mes cases sont décochées, mes champs de saisie vidés... Je voudrais donc utiliser $_REQUEST pour récupérer l'ancienne saisie mais chaque champs n'est pas unique je ne sais pas comment réaffecter chaque valeurs au bon formulaire et à la bonne ligne??
    Voici une extrait de la construction de mon 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    <?PHP for($i=0;$i<$nombreDoublonPageCourante;$i++){?>
    			<?PHP
    				$chevaux=dsdeboub_chargerChevaux($doublons[$i]);
    			?>
    			<form name="form" method="post" action="<?PHP print(entities($_SERVER['PHP_SELF'])); ?>">
    				<table>
    					<caption><?PHP print(entities('#'.($i+1)));?></caption>
    					<tr>
    						<th>X*</th>
    						<th>ID*</th>
    						<th>Race de naissance*</th>
    						<th>Mere*</th>
    						<th>Pere*</th>
    						<th>Sexe*</th>
    					</tr>
    					<?PHP foreach($chevaux as $cheval){ ?>
    						<tr>
    							<td>
    								<input type=checkbox name="id_chevaux_selectionnes[]" value="<?PHP print($cheval['id']);?>">
    							</td>
    							<td>
    								<input type=radio name="id" value="<?PHP print($cheval['id']);?>">
    								<?PHP print("#".$cheval['id']);?>
    							</td>
    							<td>
    								<input type=radio name="race_naissance" value="<?PHP print($cheval['id_race_naissance']);?>">
    								<?PHP if($cheval['race_naissance']){print($cheval['race_naissance']);}else{print("--");}?>
    							</td>
    							<td>
    								<input type=radio name="mere" value="<?PHP print($cheval['id_cheval_mere']);?>">
    								<?PHP if($cheval['mere']){print($cheval['mere']);}else{print("--");}?>
    							</td>
    							<td>
    								<input type=radio name="pere" value="<?PHP print($cheval['id_cheval_pere']);?>">
    								<?PHP if($cheval['pere']){print($cheval['pere']);}else{print("--");}?>
    							</td>
    							<td>
    								<input type=radio name="sexe" value="<?PHP print($cheval['id_sexe']);?>">
    								<?PHP if($cheval['sexe']){print($cheval['sexe']);}else{print("--");}?>
    							</td>
    						</tr><?PHP }?>						
    						/* Bouttons d'action */
    						<tr>
    							<td class="action" colspan="3">
    								<input rel="dedoub_fusionner" name="fusionner" type="submit" value="Fusionner"/>
    							</td>
    							<td class="action" colspan="20">
    								<input rel="dedoub_voirFiche" name="voirFiche" type="submit" value="Voir la fiche"/>
    							</td>
    						</tr>
    				</table>
    				<p>
    					<input name="action" type="hidden" value=""/>
    				</p>
    			</form>
    		  <br/>
    		<?PHP } ?>
    Vous l'aurez compris, si chaque champs était repéré par un identifiant unique tout cela serait plus simple. Du genre l'id du cheval dont on a sélectionné le père, l'id du cheval sont on a sélectionné la race, le sexe... Sachant que je ne peut ni modifier les name ni les value

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    c'est un peu n'importe quoi ton truc... 10 formulaires l'un à la suite de l'autre et 10 submits à faire.... ben dis donc, j'espere que ça ne sera pas utiliser par 10.000 users sinon ton serveur il est par terre

    d'un autre cote, vu que tu peux rien modifier... t'as pas 36.000 solutions : ajouter un input hidden avec le numéro du formulaire...


    PS : t'as pas du bien comprendre à quoi servait $_REQUEST.... $_REQUEST n'a rien d'un historique de saisie... $_REQUEST contient juste les valeurs des variables $_GET, $_POST et $_COOKIE

  3. #3
    mon_nom_est_personne
    Invité(e)
    Par défaut
    et pourquoi pas stocker le tout dans une session ?

  4. #4
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Citation Envoyé par mon_nom_est_personne Voir le message
    et pourquoi pas stocker le tout dans une session ?
    bah oui c'est obligatoire, ça me semblait logique... je l'ai pas précisé... mais bon, faut qu'il identifie ses différents formulaire donc obligé de mettre un input hidden (avec la valeur de $i par exemple)

  5. #5
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Pour répondre a darkstar123456, c'est à la demande de l'unique futur utilisateur que je réalise ainsi mon application, donc le serveur tiendra largement la charge. Et un seul submit est exécuté à la fois si l'utilisateur veux travailler sur le 1er groupe il coche ce qu'il veut sur le premier formulaire puis valide c'est tout ?! $_REQUEST[' '] me permet de récupérer chaque champs dans mon contrôleur je sais donc très bien à quoi il me sert. J'ai même fait des test et en cas d'erreur j'arrive a récupérer chaque champs saisie en affichant $_REQUEST['le_champs_que_je_veux'] dans ma page. Mon problème c'est comment le réaffecter au bon champs dans le formulaire avec un checked=checked.

    Avec un input hidden je ne pourrai pas identifié chaque champs car il sera transmis même si la case n'est pas coché non?

    Merci pour vos réponse

  6. #6
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    normal que $_REQUEST te donne les bonnes valeurs... mais perso, je conseille plutot l'utilisation de $_POST ou $_GET

    sinon... comme je te l'ai dit tu ajoute un input hidden de ce type entre tes balises form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="form_submited" value="<?php echo $i; ?>" />
    tu récupèreras alors la valeur de ton formulaire (de 0 à $nombreDoublonPageCourante-1)

    tu pourras le sauvegarder de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // obligé d'utiliser les sessions :x
    session_start();
    $_SESSION[$_POST['form_submited']]['uneVariable'] = $_POST['uneVariable'];
    ensuite à l'affiche, il faut que tu affiches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="uneVariable" value="<?php echo $_SESSION[$i]['uneVariable']; ?>" />

  7. #7
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Je dois surement être très bête mais je ne vois pas en quoicela répond à mon problème. OK je récupère la valeur qui a été sélectionné je ne vais pas l'afficher mais la tester avec la valeur existante et si c'est la bonne alors je vais mettre un checked="checked".
    Mais par exemple si le cheval 1 et 3 sont dans le même formulaire, et si je sélectionne la race du cheval 1 et que le cheval 3 a la même mais je veux cocher celle du cheval 1, j'ai rien pour identifier que c'est la race du cheval 1 que je vais conservé en cas d'erreur dans la saisie du formulaire

  8. #8
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    As-tu testé avant de dire non.... bon j'vais encore devoir toute une partie code pour prouver que ça marche... pffff -_-

    EDIT : vala un bout de code, bon j'ai pas tout fait non pu pcq c'est pas à moi de le faire, j'ai également remplacé le contenu de $chevaux que je n'avais pas...
    et donc ça marche pour les checkboxes premiere colonnes...

    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
    <?php 
    session_start();
    if (isset($_POST) && !empty($_POST)) {
    	foreach($_POST AS $k => $v) {
    		$_SESSION[$_POST['form_number']][$k] = $v;
    	}
    	echo "<pre>";
    	print_r($_SESSION);
    	echo "</pre>";
    }
    $nombreDoublonPageCourante = 5;
    for($i=0;$i<$nombreDoublonPageCourante;$i++){
    	//$chevaux=dsdeboub_chargerChevaux($doublons[$i]);
    	$chevaux = array(
    					array('id' => 1, 'id_race_naissance' => 2, 'race_naissance' => 'pur-sang'),
    					array('id' => 2, 'id_race_naissance' => 1, 'race_naissance' => 'pur-sang arabe'),
    					array('id' => 3, 'id_race_naissance' => 5, 'race_naissance' => 'dddddd'),
    					array('id' => 4, 'id_race_naissance' => 3, 'race_naissance' => 'aaaaa'),
    				);
    	?>
    	<form name="form" method="post" action="<?php print(htmlentities($_SERVER['PHP_SELF'])); ?>">
    		<table>
    			<caption><?php print(htmlentities('#'.($i+1)));?></caption>
    			<tr>
    				<th>X*</th>
    				<th>ID*</th>
    				<th>Race de naissance*</th>
    				<th>Mere*</th>
    				<th>Pere*</th>
    				<th>Sexe*</th>
    			</tr>
    			<?php foreach($chevaux as $cheval){ ?>
    				<tr>
    					<td>
    						<input type=checkbox name="id_chevaux_selectionnes[]" value="<?php print($cheval['id']);?>"
    						<?php
    						if ($_SESSION[$i]['id_chevaux_selectionnes'][0] == $cheval['id']) 
    							echo ' checked="checked"';
    						?>
    						>
    					</td>
    					<td>
    						<input type=radio name="id" value="<?php print($cheval['id']);?>">
    						<?php print("#".$cheval['id']);?>
    					</td>
    					<td>
    						<input type=radio name="race_naissance" value="<?php print($cheval['id_race_naissance']);?>">
    						<?php if($cheval['race_naissance']){print($cheval['race_naissance']);}else{print("--");}?>
    					</td>
    					<td>
    						<input type=radio name="mere" value="<?php print($cheval['id_cheval_mere']);?>">
    						<?php if($cheval['mere']){print($cheval['mere']);}else{print("--");}?>
    					</td>
    					<td>
    						<input type=radio name="pere" value="<?php print($cheval['id_cheval_pere']);?>">
    						<?php if($cheval['pere']){print($cheval['pere']);}else{print("--");}?>
    					</td>
    					<td>
    						<input type=radio name="sexe" value="<?php print($cheval['id_sexe']);?>">
    						<?php if($cheval['sexe']){print($cheval['sexe']);}else{print("--");}?>
    					</td>
    				</tr><?php }?>						
    				/* Bouttons d'action */
    				<tr>
    					<td class="action" colspan="3">
    						<input rel="dedoub_fusionner" name="fusionner" type="submit" value="Fusionner"/>
    					</td>
    					<td class="action" colspan="20">
    						<input rel="dedoub_voirFiche" name="voirFiche" type="submit" value="Voir la fiche"/>
    					</td>
    				</tr>
    		</table>
    		<p>
    			<input name="action" type="hidden" value=""/>
    			<input name="form_number" type="hidden" value="<?php echo $i; ?>"/>
    		</p>
    	</form>
    	<br/>
    <?php } ?>

  9. #9
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Oui j'ai tester avec l'id du cheval aucun souci vu qu'il est unique, mais avec l'exemple que je t'ai donné càd la race, il se peut que des chevaux ai la même (dans le cas des doublons c'est quasiment tout le temps) si j'ai 3 chevaux dans mon formulaire et que je sélectionne la race du premier, je valide le formulaire en y mettant une erreur. Le radio bouton coché après contrôle est celui du 3eme car c'est le dernier qui à la même valeur que celui que j'avais sélectionné. Certes c'est la même valeur mais c'est pas ce que je voulais.


    Je suis tout a fais d'accord, je l'ai fais pour l'id ca a marcher comme je te l'ai dis mais dans le cas ou un attribut est le même pour plusieurs chevaux sélectionnés c'est toujours le derniers qui sera coché.

  10. #10
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    plus tu parles, moins je comprends...

    donne exactement le contenu de ta variable $chevaux qui te donne du fil à retordre, et j'pourrai peut-être mieux comprendre ton problème...

  11. #11
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    Alors $chevaux c'est un tableau qui contient plusieurs $cheval c'est pour cela que je fais un foreach(). Maintenant $cheval contient :

    Un id, un id_race_naissance, un id race, l'id de sa mere, de son pere, du sexe, de la robe, du niveau, son nom, et après plein de champs texte qui ne sont pas unique au total 20 attributs mais l'important n'est pas la variable cheval, c'est comment rendre unique chaque champs pour pouvoir réaffecter les champs saisie est les radio bouton coché.

    Je viens d'avoir une petite idée, tu peux peut être me dire si c'est réalisable. J'utilise un peu de JQuery dans mes formulaires et je me disais pourquoi pas initialiser un champs hidden pour chaque attribut qui contiendrait l'id de cheval en quand la case est coché. Après le contrôle de saisie si il y a une erreur je fais ce test pour chaque champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($_REQUEST['id_cheval_race'] == $cheval['id']{
               Je check!
    }
    Ca sera peut être lourd mais ca peut le faire je pense

  12. #12
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Citation Envoyé par Nico87 Voir le message
    Alors $chevaux c'est un tableau qui contient plusieurs $cheval c'est pour cela que je fais un foreach(). Maintenant $cheval contient :

    Un id, un id_race_naissance, un id race, l'id de sa mere, de son pere, du sexe, de la robe, du niveau, son nom, et après plein de champs texte qui ne sont pas unique au total 20 attributs mais l'important n'est pas la variable cheval, c'est comment rendre unique chaque champs pour pouvoir réaffecter les champs saisie est les radio bouton coché.
    mais je sais bien tout ça.... je demandais justement que tu me donnes les valeurs qui te posent problème.... un bête print_r me suffirait

    et ton problème réglé par javascript j'trouve ça bof, ça reviendra au même...
    puis de toute facon, ta structure de formulaire est mauvaise... tu devrais la changer plutot que de te casser la tete a savoir comment la récupérer
    (et je parle même pas d'avoir plusieurs formulaires) mais.... AJOUTE DES INDICES ! ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php 
    $j = 0;
    foreach($chevaux as $cheval){ 
    // exemple avec un seul input
    ?>
    	<tr>
    		<td>
    			<input type=checkbox name="id_chevaux_selectionnes[<?php echo $j; ?>]" value="OK">
    		</td>
    	</tr>
    <?php $j++; }?>

  13. #13
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 63
    Points : 48
    Points
    48
    Par défaut
    oué je sais que c'est vraiment un formulaire à la noix, j'ai même eu beaucoup de mal à l'élaborer il est très long et très complexe je ne t'ai pas tout montrer car tu aurais même pas cherché a comprendre je pense et surtout je ne peut pas te filer des infos confidentiels (je suis en stage!!). Je te remercie de tes propositions, elles m'ont permis de m'éclairer un peu plus et de faire jaillir de nouvelles idées, je pense que je résoudrais mon problème par le javascript.
    Encore merci

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/06/2014, 15h53
  2. [MySQL] Mysql conserver les données après un retour de page
    Par fazpedro dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 31/08/2011, 08h56
  3. Conserver les données d'un tableau après fermeture d'un classeur
    Par steph6499 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 19/02/2011, 10h41
  4. Réponses: 4
    Dernier message: 02/12/2009, 11h27
  5. Réponses: 8
    Dernier message: 19/05/2005, 16h03

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