8768 sujets

Développement web côté serveur, CMS

Bonjour,

J’ai un formulaire de checkbox qui est envoyé par mail lors de la validation. Jusque là aucun problème.

Côté formulaire :

<?php
session_start();
?><!DOCTYPE html>
<html xml:lang="fr" lang="fr">
<body>
<label>Quel(s) sport(s) pratiquez-vous ?</label><br/>
<input type="checkbox" name="sport[]" value="course" /><label class="checkbox"> Course à pied</label><br />
<input type="checkbox" name="sport[]" value="velo" /><label class="checkbox"> Vélo</label><br />
<input type="checkbox" name="sport[]" value="natation" /><label class="checkbox"> Natation</label>
<button type="submit">Envoyer</button>
</body>
</html>


Côté php :

$sport ='';
	for ($i=0;$i<count($_POST['sport']);$i++)
	{
	$sport .= $_POST['sport'][$i].' - ';
	}


Mais je n’arrive pas à conserver le choix des checkbox comme on pourrait le faire avec une session pour des input=texte. Je pensais utiliser quelque chose comme ça :


<?php
session_start();
$_SESSION['choix']=implode(',',$_POST['sport']);
?>



<input type="checkbox" name="sport[]" value="course" <?php if(strpos($_SESSION['choix'],"1") !== false) echo checked ; ?>/><label class="checkbox"> Course à pied</label>


Merci d’avance pour votre aide…
salut,
ou plus simplement en utilisant directement la superglobale $_POST

<input type="checkbox" name="sport[]" value="course" <?php if(isset($_POST['sport'])) echo checked ; ?>/><label class="checkbox"> Course à pied</label>
Modérateur
erreur de manip (utilisation du bouton history back et soumission du formulaire une nouvelle fois) Smiley ohwell
Modifié par niuxe (03 Apr 2016 - 09:47)
Modérateur
Zelalsan a écrit :
salut,
ou plus simplement en utilisant directement la superglobale $_POST

<input type="checkbox" name="sport[]" value="course" <?php if(isset($_POST['sport'])) echo checked ; ?>/><label class="checkbox"> Course à pied</label>


Salut,

Ton code est faux. La variable est surement définit mais elle n'a pas obligatoirement cette valeur (checkbox, radio, select, etc.). Là, ça retournera array. Smiley cligne
En corrigeant ton bout de script, ça devrait faire ceci :

*code fait de tête :

<input type="checkbox" name="sport[]" value="course" <?php if(isset($_POST['sport']) && in_array('course',$_POST['sport'])) echo checked ; ?>/><label class="checkbox"> Course à pied</label>


@cede : L'utilisation des sessions, pourquoi pas. Mais seulement si tu fais un va et vient entre les pages. Si tu es sur la même page, je ne vois pas l'intérêt - ça ne résoudra pas ton problème Smiley cligne Au passage, le code html que je lis est tout simplement : beurk, peut mieux faire
Modifié par niuxe (03 Apr 2016 - 10:01)
Merci de vos réponses.
Pour l’instant, j‘ai modifié mon formulaire pour utiliser des input type=radio (choix unique). Le résultat est concluant : la valeur est bien mémorisée.


<label>Souhaitez-vous pratiquer ? *</label><br/>
<input required type="radio" name="sport" value="Course a pied" <?= isset($_SESSION['inputs']['sport']) && $_SESSION['inputs']['sport'] == 'Course a pied' ? checked : ''; ?>/><label class="radio"> Course à pied</label><br />
<input required type="radio" name="sport" value="Velo" <?= isset($_SESSION['inputs']['sport']) && $_SESSION['inputs']['sport'] == 'Velo' ? checked : ''; ?>/><label class="radio"> Vélo</label><br />
…


- Encore merci, je testerai vos solutions prochainement dans un second formulaire.
- Je me sers des sessions, car je fais des allers-retours entre la page html et la page php, afin de vérifier les champs du formulaire et retourner les erreurs éventuelles.
- @niuxe, je comprends pas trop ta remarque sur un petit morceau de mon code ! j’essaie dans l’ensemble, à mon niveau, de coder simplement et proprement. Peux-tu développer ? toutes remarques constructives sont bonnes à prendre.

Cordialement.
@niuxe> oui Smiley biggrin j'ai répondu trop vite et j'avais pas vu les crochets.

L'utilisation des sessions dans ce cas est totalement inutile et le fait de passer d'une page à une autre ne change rien. Les valeurs seront toujours accessibles dans les superglobales $_GET, $_POST ou $_REQUEST.
Modérateur
cede a écrit :
Merci de vos réponses.
Pour l’instant, j‘ai modifié mon formulaire pour utiliser des input type=radio (choix unique). Le résultat est concluant : la valeur est bien mémorisée.


<label>Souhaitez-vous pratiquer ? *</label><br/>
<input required type="radio" name="sport" value="Course a pied" <?= isset($_SESSION['inputs']['sport']) && $_SESSION['inputs']['sport'] == 'Course a pied' ? checked : ''; ?>/><label class="radio"> Course à pied</label><br />
<input required type="radio" name="sport" value="Velo" <?= isset($_SESSION['inputs']['sport']) && $_SESSION['inputs']['sport'] == 'Velo' ? checked : ''; ?>/><label class="radio"> Vélo</label><br />
…


- Encore merci, je testerai vos solutions prochainement dans un second formulaire.
- Je me sers des sessions, car je fais des allers-retours entre la page html et la page php, afin de vérifier les champs du formulaire et retourner les erreurs éventuelles.
- @niuxe, je comprends pas trop ta remarque sur un petit morceau de mon code ! j’essaie dans l’ensemble, à mon niveau, de coder simplement et proprement. Peux-tu développer ? toutes remarques constructives sont bonnes à prendre.

Cordialement.

Avant de passer à l'étape suivante, l'html doit être propre. Là, pour le coup, ça ne va pas du tout :

- les <br>, bof bof.... Cet élément est de type inline. De ce fait, il n' est en aucun cas un element de structure. Mieux vaut préconiser le <div>, <p>, <li>, etc.

- Ensuite, je ne vois pas le lien entre <label> et <input>. Donc, d'un point de vue accessibilité, ce n'est pas du tout bon.

- De tout évidence ce formulaire est de type post et non get (RESTFUL). Je ne vois pas l'élément <form> avec les attributs qui vont biens. Si tu veux faire plus mieux et si nécessaire, utilise <fieldset> avec la <legend>.

D'ailleurs, je ne savais pas qu'on pouvait soumettre un form (sans JS) sans <form>. Smiley lol

Zelalsan a écrit :
@niuxe&gt; oui Smiley biggrin j'ai répondu trop vite et j'avais pas vu les crochets


Même sans les crochets. MAis pas de souci. Je me doute bien que c'était une erreur d'inattention. On est pas toujours au mieux de sa forme Smiley cligne En ce moment, je marche au radar.

Zelalsan a écrit :
L'utilisation des sessions dans ce cas est totalement inutile et le fait de passer d'une page à une autre ne change rien. Les valeurs seront toujours accessibles dans les superglobales $_GET, $_POST ou $_REQUEST.


Si tu changes d'url, les sessions sont appropriées (ça me rappel un formulaires à 8 étapes... ou le form contact que je viens de me taper). Dans le cas de cede, il vaut mieux être dans le même fichier afin de rester simple et avoir un script maintenable facilement. Au passage, $_REQUEST est à oublier pour des raisons de sécurités. request accepte tout et c'est là le danger.
Modifié par niuxe (04 Apr 2016 - 01:12)
Sans les crochets un simple issset, en passant par le nom, suffit à savoir si la case a été cochée ou pas dans la mesure où l'input ne contiendra qu'une seule entrée et non de type array Smiley cligne .

Encore une fois, même si la page change, les sessions n'ont rien à faire ici étant donné que l'on peut récupérer via les superglobales (à aucun moment il n'est fait référence à plusieurs étapes dans la question initiale Smiley cligne ).

Je n'ai pas vraiment compris ce dont il s'agit concernant $_REQUEST. Il n'est pas mois sûr que les autres superglobales récupérant des donnée utilisateurs Smiley cligne Quelle que soit la façon dont les données seront récupérées, il faudra de toute façon faire attention.
$_REQUEST n'accepte pas tout (je ne comprends pas trop d'ailleurs ce que tu veux dire par là) mais est une "combinaison" de $_GET, $_POST et $_COOKIE. Le risque étant la collision de noms et une manipulation des données via les $_GET et $_COOKIE mais ça sera les mêmes problématiques que si tu les utilisais séparément Smiley cligne
Modérateur
Zelalsan a écrit :
Sans les crochets un simple issset, en passant par le nom, suffit à savoir si la case a été cochée ou pas dans la mesure où l'input ne contiendra qu'une seule entrée et non de type array Smiley cligne .

Encore une fois, même si la page change, les sessions n'ont rien à faire ici étant donné que l'on peut récupérer via les superglobales (à aucun moment il n'est fait référence à plusieurs étapes dans la question initiale Smiley cligne ).

Je n'ai pas vraiment compris ce dont il s'agit concernant $_REQUEST. Il n'est pas mois sûr que les autres superglobales récupérant des donnée utilisateurs Smiley cligne Quelle que soit la façon dont les données seront récupérées, il faudra de toute façon faire attention.
$_REQUEST n'accepte pas tout (je ne comprends pas trop d'ailleurs ce que tu veux dire par là) mais est une "combinaison" de $_GET, $_POST et $_COOKIE. Le risque étant la collision de noms et une manipulation des données via les $_GET et $_COOKIE mais ça sera les mêmes problématiques que si tu les utilisais séparément Smiley cligne


1- $_REQUEST est à proscrire ! Le problème de REQUEST, c'est que ca contient GET, POST, COOKIE et SERVER (pour $_SERVER, c'est à vérifier), tout ça en même temps ! La première règle de sécurité est que tu ne dois pas faire confiance aux données entrantes et de bétonner le plus possible en étant le plus précis possible !
ex : Si t'as une variable GET qui s'appelle "admin" et qui vaut 0 et si tu mets un COOKIE qui s'appelle "admin" et qui vaut 1, alors $_REQUEST['admin'] vaudra 1 aussi.
En gros l'utilisateur donne les valeurs qu'il veut aux variables, d'où le gros trou de sécurité ! c'est un exemple parmi tant d'autres.

2. Quel est l'intérêt des sessions ?
php a écrit :
Les sessions sont un moyen simple de stocker des données individuelles pour chaque utilisateur en utilisant un identifiant de session unique. Elles peuvent être utilisées pour faire persister des informations entre plusieurs pages.

Donc ton $_post n'aura plus de valeur à la 3e étape par exemple de ton formulaire ! Je te rappelle que le protocole HTTP ne mémorise rien (d'où l'intérêt des sessions pour contrecarrer ce problème)

3. isset()
php a écrit :
isset — Détermine si une variable est définie et est différente de NULL .

Dans ton exemple, la variable est bien définit mais ne vaut pas obligatoirement la valeur attendue ! Ton exemple est celui d'un input type texte, number, email, range, textarea, etc. Mais en aucun cas un radio, checkbox ou select (un champ avec une valeur définit à l'avance) !
Modifié par niuxe (04 Apr 2016 - 13:57)
Modérateur
Zelalsan a écrit :
C'est une blague Smiley biggrin ?


Sécurité PHP 5 et MySQL
Damien Seguy, Philippe Gamache a écrit :

Les tableaux superglobaux $_GET , $_POST , $_REQUEST et $_COOKIE sont couramment identifiés comme des points d’entrée pour les injections HTML


http://www.expreg.com/fred_article.php?art=require_include (au passage, c'est un excellent site !)

register global (je sais, il n'est plus actif. Mais $_REQUEST n'est pas une forme de globalisation ?)
Modifié par niuxe (04 Apr 2016 - 21:38)
Smiley biggrin Bon je vais quand même répondre mais j'annonce tout de suite, il n'y a rien de méchant ni de prétentieux Smiley smile .

Je ne vois pas trop ce que vient faire ton exemple là dedans. Tu aurais pu le faire avec un $_GET ou $_POST ça n'aurait rien changé à la dangerosité d'un tel code Smiley cligne . Le problème n'est pas dû à $_REQUEST mais à celui qui code Smiley cligne . Si on suit ton raisonnement, on ne devrait pas non plus utiliser PDO au risque d'avoir des injections...

1 - Là tu es entrain de reprendre en gros ce qu j'ai dit. Encore une fois, c'est à celui qui code de prendre les précautions nécessaires. $_GET et $_COOKIE sont tout aussi dangereux dans ce cas Smiley cligne

2 - Smiley biggrin J'ai une vague idée de ce que sont les sessions Smiley smile . Dans cet exemple, au risque de me répéter, elles ne sont d'aucune utilité.

3 - J'ai lu aussi 2-3 trucs sur isset Smiley biggrin et je répète que cela suffit à savoir, en utilisant le nom de l'input, si celui-ci est coché ou pas

<form action="ton_fichier.php" method=post>
	<input type="checkbox" name="foo">
	<input type="submit" name="bar">
</form>

<?php
if (isset($_POST['bar'])) {
	echo isset($_POST['foo']) ? 'Coché !' : 'Pas coché  [decu]';
}
Modérateur
Zelalsan a écrit :
Smiley biggrin Bon je vais quand même répondre mais j'annonce tout de suite, il n'y a rien de méchant ni de prétentieux Smiley smile .

Pas de souci. C'est un échange de point de vu et de pratique Smiley cligne


Zelalsan a écrit :

Je ne vois pas trop ce que vient faire ton exemple là dedans. Tu aurais pu le faire avec un $_GET ou $_POST ça n'aurait rien changé à la dangerosité d'un tel code Smiley cligne . Le problème n'est pas dû à $_REQUEST mais à celui qui code Smiley cligne .

Oui et non. En passant par get ou post, tu commences à filtrer et en plus tu suis la logique restful si je ne m'abuse. Le principe est de filtrer à mort les données entrantes afin que les données soient intègres.

Zelalsan a écrit :
Si on suit ton raisonnement, on ne devrait pas non plus utiliser PDO au risque d'avoir des injections...


Oui et non. Si tu ne prépares pas tes requêtes, oui ! À l'époque, ne pas utiliser mysql_real_escape_string et autres filtres, c'était le même problème.
Zelalsan a écrit :

1 - Là tu es entrain de reprendre en gros ce qu j'ai dit. Encore une fois, c'est à celui qui code de prendre les précautions nécessaires. $_GET et $_COOKIE sont tout aussi dangereux dans ce cas Smiley cligne

+1 et c'est là qu'il faut bétonner le plus. Filtrer les données entrantes. Smiley cligne

Zelalsan a écrit :

2 - Smiley biggrin J'ai une vague idée de ce que sont les sessions Smiley smile . Dans cet exemple, au risque de me répéter, elles ne sont d'aucune utilité.

Oui, dans le cas de Cede, il y a de grandes chances qu'il n'en a pas besoin. Smiley smile

Zelalsan a écrit :

3 - J'ai lu aussi 2-3 trucs sur isset Smiley biggrin et je répète que cela suffit à savoir, en utilisant le nom de l'input, si celui-ci est coché ou pas

&lt;form action="ton_fichier.php" method=post&gt;
	&lt;input type="checkbox" name="foo"&gt;
	&lt;input type="submit" name="bar"&gt;
&lt;/form&gt;

&lt;?php
if (isset($_POST['bar'])) {
	echo isset($_POST['foo']) ? 'Coché !' : 'Pas coché  [decu]';
}


Script faux puisque ce sont DES checkbox (le cas de cede) doivent être un tableau. Donc ton exemple est erroné. Ton exemple est vrai seulement dans le cas où le user accepte les conditions générales de ventes par exemple. Smiley cligne

- Maintenant, rajoute 3 checkbox dans ton script avec le name qui va bien (donc en mode tableau)
- coche une checkbox
- soumet le formulaire
- si tu écris ce que tu as écris plus haut, (if isset($_POST[mes_choix]) echo 'checked' -> les 3 checkbox seront cochés

Je n'ai pas essayé mais je suis quasi certains du résultat. Smiley cligne . Pour verifier, si c'est bien coché, il faut tester aussi la valeur : (if isset($_POST[mes_choix] && in_array('valeur attendue', $_POST[mes_choix])) Smiley cligne
Modifié par niuxe (04 Apr 2016 - 22:03)
Bon Smiley biggrin je pense pouvoir répondre une dernière fois et après, je suis sûr, on sera d'accord Smiley smile

Faut bien relire hein Smiley cligne
Zelalsan a écrit :
Sans les crochets ...

Je ne sais pas trop comment te répondre Smiley smile . Ce que tu dis est très basique donc cela va de soit que si la vérification se fait ainsi, c'est que ça implique qu'il n'y ait qu'une seule valeur Smiley biggrin . Ça coule de source Smiley cligne