Données perdues - formulaire

Eléphant du PHP | 55 Messages

26 nov. 2007, 12:04

Bonjour,
J’arrive sur un prog php avec un identifiant passé par la methode Get.
Avec cet identifiant, je fais une interrogation en table et récupère 3 informations :
Un nom, une version et une info 1 ou 0.
if (!empty ($_GET['id']))
{
	$requete= "SELECT * FROM matable WHERE T_id = '" . $_GET['id'] . "'";
	if ($resultat = mysqli_query($link, $requete))
	{
		$ligne = mysqli_fetch_array($resultat);
		$id_fiche =  $_GET['id'];
		$_POST['version'] = htmlentities($ligne['T_version']);
		$_POST['nom'] = htmlentities($ligne['T_nom']);
		if ($ligne['T_valide'] == 1)
		{
			$_POST['valide'] = 'checked';
		}
	}
}
Avec ces trois informations, je renseigne un formulaire comme ceci:
<form name="form" action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" enctype="multipart/form-data">
		Version <?php echo (!empty($_POST['version'])) ? $_POST['version'] : ''; ?>
		<p></p>
		Nom <input type="text" name="nom" value="<?php echo (!empty($_POST['nom'])) ? $_POST['nom'] : '';?>"/>
		<p></p>
		Valide <input type="checkbox" name="valide" <?php echo (!empty($_POST['valide'])) ? $_POST['valide'] : '';?>>
		<p></p>
		<input type="hidden" name="id_fiche" value= <?php echo $id_fiche ?>>
		<INPUT TYPE="SUBMIT" VALUE="Valider" name="Envoi">
	</form>
Jusque là ca marche bien.

Dans ce formulaire, l’information ‘version’ apparaît mais ne peut etre modifiée. Je n’ai donc pas mis de balise « type = … » pour cette info.
Lorsque je valide mon formulaire, je vérifie que le nom est bien renseigné. Si ce n’est pas le cas, alors j’affiche un message d’erreur.
En cas d’erreur, je souhaite réafficher les informations (normal) et c’est là ou ca cloche car mon information ‘version’ n’apparaît plus ni l’information ‘valide’ si elle était à 1 !?

Comment faire pour garder les informations ? Je pensais qu’une fois les variables renseignées au début à la réception du Get resteraient renseignées mais à priori non … ?

Merci pour vos lumières.[/php][/code]

d0m
Mammouth du PHP | 1141 Messages

26 nov. 2007, 12:24

Après validation du formulaire, tu ne trouveras dans le tableau $_POST que les champs du formulaire.

la valeur de version n'est pas mis dans un champ donc elle ne peut pas figurer dans la variable $_POST

Pour les cases à cocher, si tu veux qu'une case soit cochée d'origine il faut ajouter l'attribut CHECKED
<?php echo (!empty($_POST['valide'])) ? ' CHECHED' : '';?>>

Eléphant du PHP | 55 Messages

26 nov. 2007, 12:52

Pour la case à cocher, c'est bien ce que je fais. En fonction de la donnée que je récupère dans la table, si elle est à "1" je renseigne ma variable $_POST['valide'] = 'checked' (au moment du Get).

Pour l'information "version", je comprends. Mais comment faire alors si je veux juste afficher une information issue de table sans vouloir pouvoir la modifier et surtout la voir toujours affichée si je dois réafficher le formulaire (en cas d'erreur par exemple) ?

Merci de ta réponse

d0m
Mammouth du PHP | 1141 Messages

26 nov. 2007, 14:51

Pour la version, rien ne t'empeche d'ajouter un champ HIDDEN
<INPUT TYPE="HIDDEN" NAME="version" VALUE="<?php echo $_POST['$version'];?>">
tout d'abord il faut bien s'y prendre en différenciant les 2 cas:
- arrivée sur la page => chargement des valeurs depuis la base
- validation du formulaire => chargement des valeurs depuis les champs du formulaire.
//arrivée sur la page
if (!empty ($_GET['id']))
{
    $requete= "SELECT * FROM matable WHERE T_id = '" . $_GET['id'] . "'";
    if ($resultat = mysqli_query($link, $requete))
    {
        $ligne = mysqli_fetch_array($resultat);
        $id_fiche =  $_GET['id'];
        $_POST['version'] = htmlentities($ligne['T_version']);
        $_POST['nom'] = htmlentities($ligne['T_nom']);
        if ($ligne['T_valide'] == 1)
        {
            $_POST['valide'] = 'checked';
        }
    }
}
//le formulaire a été validé
if(isset($_POST['Envoi'])){
  //vérification
  .....
}
Ensuite dans le cas où le formulaire a été validé, $_POST['valide'] aura une valeur arbitraire parce que tu ne l'as pas précisé. Et donc dans ton formulaire, la case ne sera pas coché car la chaine 'checked' ne sera pas affichée.

Tu peux soit donner à la case la valeur
soit faire un test dans le cas ou le formulaire a été validé :
if(isset($_POST['valide']) && ($_POST['valide']==1) ){
  $_POST['valide'] = 'checked';
}

Eléphant du PHP | 55 Messages

26 nov. 2007, 15:29

Merci beaucoup cela résout mon pb ;)