Afficher les données déjà saisie

Eléphant du PHP | 259 Messages

10 juil. 2007, 12:02

Bonjour,

J'ai une page php qui permet à l'utilisateur de saisir plusieurs informations dans un input il y a 6 input et il porte le meme nom, donc je fait une boucle pour les afficher :
	for ($i=1; $i <= 6 ; $i++) 
	{ 
	?> <input name="info []"  class="boiteFormulaire" size="20"/> <?
	}
	

Ensuite je récupére les données :
	foreach ($_POST['info'] as $cle_info=>$info) 	
	{ 
  	//Effectue une reqête
	}
	

$cle_info correspond au numéro (0 - 1 ..etc) et $info corespond aux donnée saisie

Donc en fait si info[] est vide ou d'autre champ de la page, j'affiche une erreur, et j'aimerais afficher les données déjà saisi par l'utilisateurs pour ne pas tout re saisir.
J'ai essayé de faire avec value mais ça n'a pas marché :
	for ($i=1; $i <= 6 ; $i++) 
	{ 
	?> <input name="info []"  value=" <? $info[$i] ?>"class="boiteFormulaire" size="20"/> <?
	}
	

Comment faire pour afficher les infos déjà saisi ??

Et une autre question, comment vérifier que les 3er input sont bien rempli ? car l'utilisateur doit en remplir 3 minimum.

Merci d'avance pour vos réponses.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2007, 12:07

Il te manque un "=" (ou un "php echo" si on veut faire ca proprement :)) pour afficher ta valeur dans l'attribut value ;)
value="<?php echo $info[$i]; ?>"
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

10 juil. 2007, 12:17

ça ne marche pas non plus..

par ex si je met ds le 1er input 98, dans le second je met point,

il m'affiche ds le 1er input : o et dans le second : i

:?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2007, 13:47

C'est parce que ta variable $info a été écrasé dans ton foreach par la dernière valeur de ton tableau ( $cle_info=>$info ). Utiliser les crochets sur une chaine te retourne les différents caractères de celle-ci :)

Pour éviter cela, c'est $_POST['info'] qu'il te faut utiliser :)
value="<?php echo $_POST['info'][$i]; ?>" 
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

10 juil. 2007, 14:17

ça marche un peu mieux en mettant ça...

Mais ce que je saisi ds le 2eme input il me l'affiche ensuite dans le 1er, et ds le 2eme rien...

je ne vois pas trop pourquoi ça ne marche pas... :!: :?

Edit : C'est bon j'ai compris, car info[] commence à 0 et ma boucle comence à $i=1.
Ce n'est pas possible de faire commencer un tableau a 1 ?

Comment je peux faire.. car je dois lasiser la boucle avec $i = 1;

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2007, 15:02

Tu peux faire commencer un tableau à 1, mais il faut pour cela le transformer en tableau associatif, et c'est se compliquer la vie pour pas grand chose... Que ta boucle aille de 1 à 6 ou qu'elle aille de 0 à 5, tu auras toujours le même nombre d'itération, mais tu commenceras avec le bon index de ton tableau :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

10 juil. 2007, 15:41

Merci pour ta réponse. :wink:

J'ai un deuxiéme petit probléme.. c'est la même chose mais cette fois-ci c'est pour cocher les checkbox cocher par l'utilisateur.

Voici mon code :
			
$resultat=mysql_query("select nom_pays from pays");

while ($data=mysql_fetch_array($resultat)) 
{ 
for ($i=0; isset($_POST['pays'][$i]); $i++) 
{   
if( ($data["nom_pays"]) == ($_POST['pays'][$i]) )
{
echo'<INPUT type="checkbox" name="pays[]" checked value="'.$data["nom_pays"].'">'.$data["nom_pays"].' ';     
}
}	
echo'<INPUT type="checkbox" name="pays[]" value="'.$data["nom_pays"].'">'.$data["nom_pays"].'';     

Donc ça affiche bien la liste des pays, si j'en choisi un par exemple france, ensuite je valide le formulaire, donc s'il manque une info dans le formulaire, je réaffiche le formulaire avec les info saisi, donc là il m'affiche bien tous les pays avec masi avec France en double (un cocher et un non).

Je ne vois pas trop où est la petite erreur...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2007, 16:01

C'est parce qu'il te manque un else pour faire l'une ou l'autre.. en fait si la condition est vrai il execute le if, mais dans tous les cas il affiche le 2nd :)

Par contre ça c'est un peu moyen comme test : for ($i=0; isset($_POST['pays'][$i]); $i++)
Si les pays 0 et 3 sont cochés, tu vas arrêter ta boucle au 1 qui ne sera pas défini... Je te suggère d'utiliser la fonction in_array() pour vérifier si l'élément a été coché ou pas :
while ($data=mysql_fetch_array($resultat))  {  

  if ( in_array($data["nom_pays"], $_POST['pays'] ) { 
    echo'<INPUT type="checkbox" name="pays[]" checked value="'.$data["nom_pays"].'">'.$data["nom_pays"].' ';
  }
  else {
    echo'<INPUT type="checkbox" name="pays[]" value="'.$data["nom_pays"].'">'.$data["nom_pays"].' ';
  } 
}     
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

10 juil. 2007, 16:36

ça marche mais il me met cette erreur :

Warning: in_array() [function.in-array]: Wrong datatype for second argument in /home/cadocity/www/page.php on line ...

La ligne :
if (in_array($data["nom_pays"], $_POST['pays']))
Pourtant le code fonctionne bien !!
Modifié en dernier par angebleu17 le 10 juil. 2007, 16:54, modifié 2 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2007, 16:50

ca voudrait dire que $_POST['pays'] n'est pas un tableau ? fait un print_r($_POST['pays']) pour voir ce qu'il contient... avais-tu bien une case de cochée ? il y a peut être un test à rajouter (un simple isSet($_POST['pays']) pour ne pas faire le test si aucune case n'est cochée.. :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

10 juil. 2007, 16:59

oui merci avec le isset($_POST['pays']) ça marche !! :wink:

Maintenant j'ai le même probléme pour l'affichage des données choisi par l'utilisateur mais pour les listes déroulantes..

voici mon code :

for ($i=0; $i <= 5 ; $i++) 
{
$resultat=mysql_query("select nom from ma_table");

echo'<center><select class="texte_titre" name="'tab'[]" size=1>';

echo'<option selected="selected"> - Choisissez - </option>';
		
while ($data=mysql_fetch_array($resultat)) 
{   
  if (in_array($data["nom"], $_POST['tab']))
  {  
    echo'<option selected="selected"> '.$data["nom"].' </option>';
  } 
  else 
  { 
    echo' <option value="'.$data["nom"].'">'.$data["nom"].'</option>';
  }  
} 
} // fin for
En fait cela affiche 5 listes déroulantes.
Donc avec ce code lorsque je choisi un élément dans une des listes, cela affiche le même élément dans toutes les autres..

Et en mettant $_POST[tab][$i] au lieu de $_POST['tab'] ça affiche toujours - Choisissez -

Je tourne en rond..

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 juil. 2007, 17:16

Déjà il y a une petite erreur ici : name="'tab'[]" les apostrophes sont en trop ;)

Pour le reste, cela devrait être exactement le même principe que pour tes cases à cocher et ce que tu as fait me semble bon.. en revanche tu dois avoir un problème à cause de ta boucle.
En effet, si les 5 select sont identiques, tu vas retrouver les mêmes valeurs possible dans les 5, du coup si un élément a été selectionné, le in_array retournera vrai pour les 5 select, qui selectionneront tous la même valeur.


Contrairement à la case à cocher, la valeur du select (quant il est simple) est toujours envoyée, donc ton tableau $_POST['tab'] contiendra toujours 5 valeurs, même si celle-ci sont vides (ou en l'occurence ici égales à " - Choisissez - ", valeur par défaut)

Tu peux donc pour chaque liste tester la valeur associée $_POST['tab'][0] pour la première, $_POST['tab'][1] pour la seconde ... bref, $_POST['tab'][$i] pour la liste $i :)
...
while ($data=mysql_fetch_array($resultat)) {    
  if ($data["nom"] == $_POST['tab'][$i]) {   
    echo'<option selected="selected"> '.$data["nom"].' </option>'; 
  }  
  else  {  
    echo' <option>'.$data["nom"].'</option>'; 
  }   
}
...
Petit rappel, si l'attribut value de l'option n'est pas spécifié, c'est le libellé qui est utilisé :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

11 juil. 2007, 09:38

Merci pour ta réponse, ça marche nickel..

En fait il fallait juste que je reprenne la méthode que j'avais faite pour les cases à cocher avant le in_array !

Merci :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 juil. 2007, 09:39

Modération :
angebleu17, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer