checkbox

Eléphanteau du PHP | 11 Messages

03 févr. 2010, 01:35

Bonjour,
Je débute en php (3 mois et des poussières et beaucoup de lectures) et je m'amuse en apprenant, et vice-versa. Logique et ludique, ; si j'avais su…!

Voici mon problème : j'ai fait un formulaire en une page (php et html) et pour chacun des champs j'ai créé un message d'erreur tout en conservant l'information dans les champs pour que l'utilisateur n'aie pas à remplir à nouveau le formulaire suite à un message…
Bon ! Tous les messages d'erreurs fonctionnent pour les 2 types de champs qui y sont assujettis.
La conservation de l'information fonctionne très bien avec le type text et les informations sont conservées avec ce code :
Titre : <input type="text" name="titre" value="<?php echo $_POST["titre"]; ?>"/><br/>
<font color="red"><?php echo "$erreur1"; ?></font>
Par contre, je n'arrive pas à conserver 1) les cases cochées des checkbox 2) ni l'image sélectionnée si un message avertit qu'un champ text n'est pas complet, par exemple. Les checkbox se désélectionnement et tout comme le fichier image.

Pour les checkbox, j'ai bien essayé 5 ou 6 codes que j'ai trouvés au fil de lectures ou de recherches sur le web (
<?php  if($_POST['essai'] == true ) { echo 'checked="checked"';}?>
foreach ($_REQUEST['genres'] as $id_genres) { echo 'checked="checked"';}
foreach($_POST['genres'] as $name => $value ) { echo 'checked="checked"';}
<?php if (get_option('genres')) echo "checked='checked'"; ?>
 …et autres variantes…
que j'ai imbriqués dans…

echo "$genr <input type='checkbox' name='genres' value='$id_genres' id='id_genres'/> ||";

) pour conserver les checkbox cochées ; rien à faire (des fois, en sélectionnant un seul checkbox, tous s'autosélectionnaient…)
Je dois préciser que mes checkbox sont générées et affichées dynamiquement à partir d'une table ; voici le code utilisé pour la partie checkbox

CHECKBOX ==========>
<?php
// trouve et affiche les genres disponibles
	$sql = f_requete("
		SELECT * FROM genres
		ORDER BY genres
		");
	echo "<hr width='400px' align='left'>";	
	echo "Genre(s) :<br/>";
	echo '<table border="0" width="460px" ><tr><td>';
	while ($ram = mysql_fetch_object($sql))
	
{
	$genr = $ram->genres;
	$id_genres = $ram->id_genres;
	echo "$genr <input type='checkbox' name='genres' value='$id_genres' id='id_genres'/> ||";
}
	echo'</td></tr></table>';
echo "<font color='red'>--------------> METTRE EN 2 COLONNES.<br/><br></font>";
	echo "<font color='red'> $erreur6</font>";
	echo "<hr width='400px' align='left'>";		
?>

FORMULAIRE AU COMPLET ======================>

<html>
<head>
</head>
<body>

<form enctype="multipart/form-data" method="post" action="<?php $_SERVER["PHP_SELF"]; ?>">
<input type="hidden" name="ajouter" value="oui"/>

Titre : <input type="text" name="titre" value="<?php echo $_POST["titre"]; ?>"/><br/>
<font color="red"><?php echo "$erreur1"; ?></font>
Image : <input type='hidden' name='max_file_size' value='2000000'/><br/>
    <input type='file' size='40' name='image'/>
Description : <textarea name="description"><?php echo $_POST["description"]; ?></textarea><br/>
<font color="red"><?php echo "$erreur2"; ?></font>

<!-- inclusion du calendrier javascript dans le champ date -->
Date : <input onclick="ds_sh(this);" name="date" readonly="readonly" style="cursor: text" value="<?php echo $_POST["date"]; ?>"/><br />
<font color="red"><?php echo "$erreur3"; ?></font>

Heure : <input type="text" name="heure" value="<?php echo $_POST["heure"]; ?>"/><br/>
<font color="red"><?php echo "$erreur4"; ?></font>
Prix : <input type="text" name="prix" value="<?php echo $_POST["prix"]; ?>"/><br/>
<font color="red"><?php echo "$erreur5"; ?></font>

<?php
// trouve et affiche les genres disponibles
	$sql = f_requete("
		SELECT * FROM genres
		ORDER BY genres
		");
	echo "<hr width='400px' align='left'>";	
	echo "Genre(s) :<br/>";
	echo '<table border="0" width="460px" ><tr><td>';
	while ($ram = mysql_fetch_object($sql))
	
{
	$genr = $ram->genres;
	$id_genres = $ram->id_genres;
	echo "$genr <input type='checkbox' name='genres' value='$id_genres' id='id_genres'/> ||";
}
	echo'</td></tr></table>';
echo "<font color='red'>--------------> METTRE EN 2 COLONNES.<br/><br></font>";
	echo "<font color='red'> $erreur6</font>";
	echo "<hr width='400px' align='left'>";		
?>

Ajouté par : <?php echo $inscritpar; ?><br/>

<input type="submit" name="Action" value="Ajouter"/>
</form>
</body>
</html>
FIN =====================>

Merci de m'aider à trouver (ou m'orienter vers) une solution, à ce problème qui me fait tourner en rond depuis beaucoup trop d'heures, pour conserver 1) les checkbox cochées et 2) l'image/fichier sélectionnée
PS il n'y a pas de message d'erreur pour l'image ; elle est facultative.
PSS j'espère que ma question/problème respecte les règles de l'art ; c'est la première fois que j'interviens dans ce type de forum.

ViPHP
ViPHP | 5462 Messages

03 févr. 2010, 01:42

met la balise
autour de ton code dans ton sujet on verra mieux comme ca, et precise un peu plus ton sujet :wink:

Eléphanteau du PHP | 11 Messages

03 févr. 2010, 02:51

Je veux que mes checkbox restent cochées si le formulaire affiche un message d'erreur du genre (vous n'avez pas inscrit de titre).
Les champs input-text conservent l'information avec echo $_POST[]
ex.:
<input type="text" name="titre" value="<?php echo $_POST["titre"]; ?>"/>
Comment fait-on avec les checkbox qui sont affichées dynamiquement à partir d'une table ?
Voici la ligne de code pour mes checkbox :
echo "$genr <input type='checkbox' name='genres' value='$id_genres' id='id_genres'/> || ";
Pour me rendre la chose plus facile avec les ' simples et les " doubles, j'ai sorti ma ligne du php et l'ai isolée comme suit :
echo $genr; ?>
	<input type='checkbox' name='genres' value='$id_genres' id='id_genres'/> || ;
	<?php
Puis j'ai essayé différentes variantes comme
1)
<input type='checkbox' name='genres' value='$id_genres' <?php  if($_POST['genres'] == true ) { echo 'checked="checked"';}?>/> || ;
= En cliquant sur une seule checkbox, toutes s'autosélectionnent et en cliquant sur Submit elle restent toutes cochées en cas de message d'erreur.
2)
<input type='checkbox' name='genres' value='$id_genres'<?php  if($_POST['genres'] == 1 ) { echo "selected='selected'" ;} ?>/> || ;
= Ce code ne conserve pas la checkbox cochée
3)
<input type='checkbox' name='genres' value='$id_genres' <?php  foreach($_POST['genres'] as $name => $value ) { echo 'checked="checked"';} ?>/> || ;
= Ce code ne conserve pas la checkbox cochée
4)
<input type='checkbox' name='genres' value='$id_genres' <?php  foreach ($_REQUEST['genres'] as $id_genres) { echo 'checked="checked"';} ?>/> || ;
= Ce code ne conserve pas la checkbox cochée
5)
<input type='checkbox' name='genres' value='$id_genres' <?php  if($_POST['genres'] == true ) { echo "checked='checked'";}?>/> || ;
Ce code a un comportement semblable à 1) à la différence. On coche une seule case, les autres restent intactes, mais en cliquant sur Submit, elles s'autosélectionnent toutes !
Et ainsi de suite…

Je sens la solution proche mais je tourne en rond !

ViPHP
AB
ViPHP | 5818 Messages

03 févr. 2010, 04:10

Ce que veux dire stealth35 c'est que lorsque tu postes ça serait bien d'encadrer ton code avec les balises de formatage qui sont disponibles juste au dessus du formulaire de saisie.
echo 'La coloration syntaxique rend le message plus lisible';
Bon sinon tu as plusieurs checkbox et ils ont tous le même nom. Donc on ne peut pas les différencier (et php non plus), ce qui explique tes problèmes.

A savoir aussi qu'un checkbox ne renvoie une valeur dans le tableau $_POST que si elle a été cochée.

Pour différencier tes chekbox tu peux les écrire sous forme de tableau dans tes input soit
<input type = "checkbox" name = "genres[]"   ...
Ensuite la variable $_POST['genres'] que tu récupéreras sera donc un tableau. En haut dans ta partie php écris pour visualiser :
if (isset($_POST['genres']))
{
echo '<pre>';
print_r($_POST['genres']);
echo '</pre>';
}
avec ça tu devrais comprendre.

Eléphanteau du PHP | 11 Messages

03 févr. 2010, 05:15

Je tourne toujours en rond :
voici le code reformulé mais ça ne fonctionne toujours pas ; les checkbox cochées ne conservent pas leur valeur lors du réaffichage de la page :
<input type='checkbox' name='genres[]' value='$id_genres' <?php  if (isset($_POST['genres'])) { echo($_POST['genres']); } ?>/>

ViPHP
ViPHP | 5462 Messages

03 févr. 2010, 10:56

c'est normale si une checkbox n'est pas cocher alors elle renvoi rien, c'est comme un champ text si tu met rien dedans ca appariai pas dans le $_POST, a toi te faire tes tests apres.

Pourquoi echo($_POST['genres']) ? dans ton HTML ca rend rien ca, c'est cocher si y'a l'attribut "checked"

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

03 févr. 2010, 14:35

Modération :
Afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

ViPHP
AB
ViPHP | 5818 Messages

03 févr. 2010, 17:10

Tu avais essayé dans une page séparée pour voir le contenu de ton $_POST ?
Quand il y a un pb il faut décomposer et isoler les parties du code pour mieux comprendre.
Donc dans une page séparée testes ceci :
<?php
echo '<pre>';
echo '$_POST = '; print_r($_POST);
echo '</pre>';
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
</head>
<body>
<div>
<form action="#" method="post" >
<p>
<input type="text" name = "exemple" />

M
<input type="checkbox" name="genres[]" value="masculin" <?php if (isset($_POST['genres']) && is_array($_POST['genres']) && in_array('masculin',$_POST['genres'])) echo 'checked="checked"'?> />
F
<input type="checkbox" name="genres[]" value="féminin" <?php if (isset($_POST['genres']) && is_array($_POST['genres']) && in_array('féminin',$_POST['genres'])) echo 'checked="checked"';?> />

<input type = "submit" value = "OK" />
</p>
</form>
</div>
</body>
Etudies le contenu de $_POST en fonction de ce que tu rentre dans le formulaire après avoir appuyé sur OK

ViPHP
AB
ViPHP | 5818 Messages

03 févr. 2010, 17:16

c'est normale si une checkbox n'est pas cocher alors elle renvoi rien, c'est comme un champ text si tu met rien dedans ca appariai pas dans le $_POST, a toi te faire tes tests apres.
Ah non c'est pas pareil ! Dans l'exemple que je montre juste au-dessus, lorsqu'on clique sur OK, $_POST['exemple'] existe toujours alors que $_POST['genres'] n'existe pas si aucune checkbox est cochée et son contenu varie suivant le nombre de case cochées.

ViPHP
ViPHP | 5462 Messages

03 févr. 2010, 17:38

c'est normale si une checkbox n'est pas cocher alors elle renvoi rien, c'est comme un champ text si tu met rien dedans ca appariai pas dans le $_POST, a toi te faire tes tests apres.
Ah non c'est pas pareil ! Dans l'exemple que je montre juste au-dessus, lorsqu'on clique sur OK, $_POST['exemple'] existe toujours alors que $_POST['genres'] n'existe pas si aucune checkbox est cochée et son contenu varie suivant le nombre de case cochées.
ouai t'as raison #-o

Eléphanteau du PHP | 11 Messages

04 févr. 2010, 01:52

Rebonjour (soir),
ÇA FONCTIONNE !
MERCI pour votre aide.

1) Une autre question ? Lors d'une rafraîchissement de page, peut-on conserver, comme on le fait avec les valeurs des checkbox et des type='text' , un fichier ou une image (en mémoire) ?
Image : <input type='hidden' name='max_file_size' value='2000000'/>
   		<input type='file' size='40' name='image'/><br/>
2) Je laisse le code si ça peut être utile…
J'ai adapté le code de AB pour un affichage dynamique tiré d'une table (désolé pour les nombreuses transitions html et php ; j'ai toujours quelques difficultés avec les guillemets et les primes).
<?php
// trouve et affiche les genres disponibles
	$sql = f_requete("
		SELECT * FROM genres
		ORDER BY genres
		");
	echo "<hr width='400px' align='left'>";	
	echo "Genre(s) :<br/>";
	echo '<table border="0" width="460px" ><tr><td>';

	while ($ram = mysql_fetch_object($sql))	
{
	$genr = $ram->genres;
	$id_genres = $ram->id_genres;
	echo $genr ?>
	
<input type="checkbox" name="genres[]" value="<?php echo $id_genres ?>"
<?php if (isset($_POST['genres']) && is_array($_POST['genres']) && in_array($id_genres,$_POST['genres'])) echo 'checked="checked"'?>
	/> ||
	
	<?php
}

	echo'</td></tr></table>';
	echo "<font color='red'> $erreur6</font>";
	echo "<hr width='400px' align='left'>";		
?>
PS Ne pas oublier le echo dans
value="<?php echo $id_genres ?>"

ViPHP
AB
ViPHP | 5818 Messages

04 févr. 2010, 14:53

Rebonjour (soir),
ÇA FONCTIONNE !
MERCI pour votre aide.

1) Une autre question ? Lors d'une rafraîchissement de page, peut-on conserver, comme on le fait avec les valeurs des checkbox et des type='text' , un fichier ou une image (en mémoire) ?
Image : <input type='hidden' name='max_file_size' value='2000000'/>
   		<input type='file' size='40' name='image'/><br/>
Non, il est impossible d'écrire dynamiquement dans un input de type='file'. C'est conçu ainsi pour des raisons de sécurité sinon il serait éventuellement possible de faire télécharger un fichier non voulu par le visiteur -> piratage des fichiers du visiteur.

N'oublies pas de mettre résolu :wink:

ViPHP
ViPHP | 5462 Messages

04 févr. 2010, 14:54

ouia et puis "file" dépend du navigateur aussi

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

04 févr. 2010, 18:10

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute