J'ai un problème avec des checkbox dans mon formulaire.
Après de nombreuses recherches sur des forums, j'ai cru comprendre que les checkbox sont souvent problématiques pour les débutants. Spoiler : je ne fais pas exception...
J'ai pu déterminer que c'est mes checkbox qui sont le problème car si je les mets en commentaire le bloc traitant les checkbox, une nouvelle entrée est crée dans ma bdd. (comme dans le code ci dessous)
Formulaire:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
<title>Plus qu'une étape</title>
<link rel="shortcut icon" type="image/x-icon" href="logos/logo.png" />
</head>
<body>
<!-- ************************************************ Haut de page ************************************************ -->
<?php include("enTete.php");?>
<!-- ************************************************* FORMULAIRE *************************************************/ -->
<div id="bloc_page">
<section class="formulaire" id="participation">
<h1><img src="images/formulaire.png" alt="Catégorie contact" class="ico_categorie" />Merci!</h1>
<p>
Vous venez de tenter d'acheter ce produit.</br>
Malheureusement, il n'est pas encore disponible. <strong>La bonne nouvelle</strong> c'est que grâce à votre soutien il pourrait bientôt voir le jour.</br>
Pour être sûr que ce produit soit un jour disponible, je vous prierais de remplir le formulaire ci-dessous.</br>
Ainsi, lorsqu'un nombre suffisant de personnes seront intéressées, je pourrais commencer sa production.
</p>
<form method="post" action="traitement.php">
<fieldset>
<legend>Vos coordonnées</legend>
<div>
<label for="Sexe">M.</label><input type="radio" name="sexe" value="M." id="Sexe"/>
<label for="Sexe">Mme.</label><input type="radio" name="sexe" value="Mme." id="Sexe"/>
<label for="Sexe">Autre</label><input type="radio" name="sexe" value="Autre" id="Sexe"/>
</div>
<div>
<label for="name">Votre nom : </label></br>
<input class="champ" type="text" name="nom" id="name" placeholder="CARRIER" required /><input class="champ" type="text" name="prenom" id="firstname" placeholder="Quentin" required />
</div>
<div>
<label for="birthdate">Votre date de naissance : </label></br>
<input type="date" name="dateNaissance" id="birthdate"/>
</div>
<div>
<label for="mail">Votre adresse mail : </label></br>
<input class="champ" type="mail" name="mail" id="mail" placeholder="votre@adresse.fr" required />
</div>
<div>
Souhaitez vous être informer quand ce produit sera disponible?
<label for="contact">Oui</label><input type="radio" name="contact" value="true" id="contact"/>
<label for="contact">Non</label><input type="radio" name="contact" value="false" id="contact"/>
</div>
<div>
Quel(s) article(s) vous intéresse(nt)?</br>
<input type="checkbox" name="chariotte" id="article1"/><label for="article1">La Chariotte</label></br>
<input type="checkbox" name="fantastique" id="article2"/><label for="article2">La Fantastique</label></br>
<input type="checkbox" name="fantastiques" id="article3"/><label for="article3">Les 4 Fantastiques</label>
</div>
<div>
<label for="message">Vous souhaitez ajouter quelque chose?</label></br>
<textarea class="champ" id="message" name="message" placeholder="tapez votre message ici"></textarea><br/>
</div>
<div>
<input class="bouton" type="submit" value="Envoyer" required />
</div>
</fieldset>
</form>
</section>
<div><a href="#logo"><img id="fleche_haut" src="images/flecheHaut.png" alt="Fleche pour remonter" title="Cliquer pour remonter"/></a></div>
</div>
<!-- ************************************************ Bas de page ************************************************ -->
<?php include("piedDePage.php");?>
</body>
</html>
Traitement:
<?php
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=lachariotteduvrac;charset=utf8', 'root', 'root');
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}
// Si tout va bien, on peut continuer
/**** gestion des variables ****/
if(!isset($_POST["sexe"]))
{
$sexe=NULL;
}
$sexe = htmlspecialchars($_POST["sexe"]);
if(!isset($_POST["nom"]))
{
$nom=NULL;
}
$nom = htmlspecialchars($_POST["nom"]);
if(!isset($_POST["prenom"]))
{
$prenom=NULL;
}
$prenom = htmlspecialchars($_POST["prenom"]);
if(!isset($_POST["dateNaissance"]))
{
$dateDeNaissance=NULL;
}
$dateDeNaissance = htmlspecialchars($_POST["dateNaissance"]);
if(!isset($_POST["mail"]))
{
$_POST["mail"]=NULL;
}
$email = htmlspecialchars($_POST["mail"]);
if(!isset($_POST["contact"]))
{
$_POST["contact"]=NULL;
}
$informe = htmlspecialchars($_POST["contact"]);
/**** problème ci dessous avec chariotte, fantastique et fantastiqueS ****/
/*$verifChariotte = isset($_POST["chariotte"]);// si elle est cochée, la variable $chariotte prendra la valeur true, sinon false
if($verifChariotte)
{
$chariotte="true";
}
else
{
$chariotte="false";
}
$verifFantastique = isset($_POST["fantastique"]);
if($verifFantastique)
{
$fantastique="true";
}
else
{
$fantastique="false";
}
$verifFantastiques = isset($_POST["fantastiques"]);
if($verifFantastiques)
{
$fantastiques="true";
}
else
{
$fantastiques="false";
}
/**** fin du problème, si on commente ce bloc ca fonctionne, les trois variables seront nulles ****/
if(!isset($_POST["message"]))
{
$commentaire=NULL;
}
$commentaire = htmlspecialchars($_POST["message"]);
$req = $bdd->prepare('INSERT INTO `contactachat`(`sexe`, `nom`, `prenom`, `dateDeNaissance`, `email`, `informe`, /*`chariotte`, `fantastique`, `fantastiques`,*/ `commentaire`) VALUES(:sexe, :nom, :prenom, :dateDeNaissance, :email, :informe, /*:chariotte; :fantastique, :fantastiques,*/ :commentaire)');
$req->execute(array(
'sexe' => $sexe,
'nom' => $nom,
'prenom' => $prenom,
'dateDeNaissance' => $dateDeNaissance,
'email' => $email,
'informe' => $informe,
/*'chariotte' => $chariotte,
'fantastique' => $fantastique,
'fantastiques' => $fantastiques,*/
'commentaire' => $commentaire
));
echo 'Vous avez bien transmis le formulaire </br>';
echo "</br>" . $_POST["sexe"] . "</br>";
echo $_POST["nom"] . "</br>";
echo $_POST["prenom"] . "</br>";
echo $_POST["dateNaissance"] . "</br>";
echo $_POST["mail"] . "</br>";
echo $_POST["contact"] . "</br>";
/*echo $chariotte . "</br>";
echo $fantastique . "</br>";
echo $fantastiques . "</br>";*/
echo $_POST["message"] . "</br>";
$req->closeCursor();
?>
Pourquoi mes champs "chariotte", "fantastique" et "fantastiques" ne sont pas remplis?
J'ai aussi découvert un autre petit défaut avec le sexe de mes utilisateurs. Lorsqu'il n'est pas défini mon traitement ne s'exécute pas...
Merci d'avance pour votre aide.
EDIT : voici les entrée de ma BDD:
- Edité par QuentinCarrier 2 décembre 2020 à 11:35:38
<?php
var_dump($_GET);
?>
<form >
<input type="checkbox" id="vehicle1" name="vehicle1" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle2" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle3" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
Je te conseil d'executer ce code dans une autre page php juste pouv voir et comprendre le fonctionnement.
Quand tu as des doutes utilise le var_dump() pour voir tes variables
attention var_dump($_GET) va afficher tout le contenu de tes $_GET mais tu peux faire pareil avec $_POST
Cordialement,
Quillian
Il n'y a pas de question idiote, seulement une réponse idiote
QuentinCarrier, pour que nous puissions t'aider il va falloir faire un peu de remaniement dans ton code, au lieu de faire une succession des bloc if je te propose d'avoir un seul if du type:
et du côté HTML dans donne à tes checkbox la même valeur et tu rajoute [] à la fin de ce nom pour dire ta requête HTTP qu'il s'agit d'un tableau, genre:
<?php
var_dump($_GET);
?>
<form >
<input type="checkbox" id="vehicle1" name="vehicle1" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle2" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle3" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
Je te conseil d'executer ce code dans une autre page php juste pouv voir et comprendre le fonctionnement.
Quand tu as des doutes utilise le var_dump() pour voir tes variables
attention var_dump($_GET) va afficher tout le contenu de tes $_GET mais tu peux faire pareil avec $_POST
Cordialement,
Quillian
Bonjour, comme tu me l'a conseillé j'ai executé ton code pour tenter de comprendre le fonctionnement des checkbox.
Plusieurs checkbox dans un formulaire créée un tableau c'est bien ca? Et le tableau est rempli des cases cochées? Donc pour traiter les checkbox on doit extraire les valeurs du tableau?
J'ai tout de même du mal à comprendre quelque chose dans mon code d'origine : Pourquoi lorsque j'affiche mes variables à la fin elles s'affichent toutes comme je le souhaite, mais celles issues de mes checkbox ne veulent pas s'insérer dans ma bdd?
Je répond ici à EL-jos car on ne peux pas mettre deux messages de suite ou alors il faut attendre 24h
EL-jos a écrit:
QuentinCarrier, pour que nous puissions t'aider il va falloir faire un peu de remaniement dans ton code, au lieu de faire une succession des bloc if je te propose d'avoir un seul if du type:
Bonjour, merci pour ton retour. Je ne suis pas sur de comprendre ce que tu me conseille de faire... Je dois mettre cette ligne au début de mon code de traitement et je vérifie que toutes les variables soient définies? Mais si je fais ca et que l'utilisateur n'a pas coché certaines cases mon programme ne va pas marcher non?
Sinon j'ai changé le nom de mes checkbox qui s'appellent désormais toutes "articles[]".
Pour finir, je ne comprends pas ta dernière ligne : $_POST['fruits'] ?
- Edité par QuentinCarrier 2 décembre 2020 à 11:13:03
Regarde je vais te donner un nouveau code a exécuter pour vraiment voir la différence.
Ancien code :
<?php
var_dump($_GET);
?>
<form >
<input type="checkbox" id="vehicle1" name="vehicle1" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle2" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle3" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
Nouveau code :
<?php
var_dump($_GET);
?>
<form >
<input type="checkbox" id="vehicle1" name="vehicle[]" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle[]" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle[]" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
L'avantage de cela te permet d'avoir un tableau de tes cases a cocher que tu parcourir.
if (in_array("Bike", $vehicle)) {
echo "Got Bike";
}
Et tester comme cela si ta valeur existe dans ton tableau.
Il n'y a pas de question idiote, seulement une réponse idiote
Regarde je vais te donner un nouveau code a exécuter pour vraiment voir la différence.
Ancien code :
<?php
var_dump($_GET);
?>
<form >
<input type="checkbox" id="vehicle1" name="vehicle1" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle2" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle3" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
Nouveau code :
<?php
var_dump($_GET);
?>
<form >
<input type="checkbox" id="vehicle1" name="vehicle[]" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle[]" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle[]" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
L'avantage de cela te permet d'avoir un tableau de tes cases a cocher que tu parcourir.
if (in_array("Bike", $vehicle)) {
echo "Got Bike";
}
Et tester comme cela si ta valeur existe dans ton tableau.
Merci pour ton aide. J'ai essayé ton code mais j'ai un problème...
<form method="GET" action="traitement.php">
<input type="checkbox" id="vehicle1" name="vehicle[]" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle[]" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle[]" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
Car étant donné que nous avons aucune protection ou contrôle j'ai bien des deux erreurs moi aussi.
Dans le cas ou je me rend directement sur ma page : traitement.php
Ou si je ne coche aucune données.
EDIT :
Mon code marche bien !
Je me positionne sur 127.0.0.1/test.php et quand je valide je vais sur test2.php
fichier test.php :
<form method="POST" action="test2.php">
<input type="checkbox" id="vehicle1" name="vehicle[]" value="Bike">
<label for="vehicle1"> I have a bike</label><br>
<input type="checkbox" id="vehicle2" name="vehicle[]" value="Car">
<label for="vehicle2"> I have a car</label><br>
<input type="checkbox" id="vehicle3" name="vehicle[]" value="Boat">
<label for="vehicle3"> I have a boat</label><br><br>
<input type="submit" value="Submit">
</form>
if (in_array("chariotte", $_POST["articles"])) { //on regarde si chariotte est dans le tableau articles
echo "</br>On veux la chariotte</br>";
$chariotte="true";
}
else
{
echo "</br>NON à la chariotte</br>";
$chariotte="false";
}
if (in_array("fantastique", $_POST["articles"])) {
echo "On veux la fantastique</br>";
$fantastique="true";
}
else
{
echo "NON à la fantastique</br>";
$fantastique="false";
}
if (in_array("fantastiques", $_POST["articles"])) {
echo "On veux les 4 fantastiques</br>";
$fantastiques="true";
}
else
{
echo "NON aux 4 fantastiques</br>";
$fantastiques="false";
}
ça me semble pas mal et lorsque j'envoie un nouveau formulaire avec tout de coché j'ai bien mes variables qui passent à "true" :
array(8) { ["sexe"]=> string(2) "M." ["nom"]=> string(7) "CARRIER" ["prenom"]=> string(7) "Quentin" ["dateNaissance"]=> string(10) "1997-06-13" ["mail"]=> string(29) "quentincarrier74570@gmail.com" ["contact"]=> string(4) "true" ["articles"]=> array(3) { [0]=> string(9) "chariotte" [1]=> string(11) "fantastique" [2]=> string(12) "fantastiques" } ["message"]=> string(12) "TEST TOUT OK" } On veux la chariotte On veux la fantastique On veux les 4 fantastiques
Vous avez bien transmis le formulaire
M. CARRIER Quentin 1997-06-13 quentincarrier74570@gmail.com true true true true TEST TOUT OK
On est d'accord que $chariotte, $fantastique et $fantastiques sont à "true" et donc d'après le code ci-dessous mes données devraient s'insérer dans ma table contactachat?
Mais mon problème est toujours présent... mes données ne veulent pas s'insérer dans la table contact achat :/ le seul moyen pour qu'une nouvelle ligne s'insère c'est que je commente mes entrées "chariotte", "fantastique" et "fantastiques" comme ci dessous:
Mes trois champs dans la BDD sont en varchar car je galerais à trouver un moyen pour en faire des booléens donc c'est pour ca que je leurs demande une chaine de caractère parce que j'ai réussi comme ca mais a terme je vais surement les passer en booléens seulement j'aimerais bien qu'ils s'écrivent dans la table avant ^^
Je vais essayer de faire comme tu dis pour avoir des Booléens!
J'ai mis une photo de ma BDD dans mon premier message si tu veux!
Mais là où je suis perdu c'est que ma varible "contact" fonctionne alors que la logique est la même que pour mes trois variables problématiques...
En tout cas merci encore pour l'aide que vous m'apportez!
Pour rappel, pas de htmlspecialschar sur les données entrée en BDD
et plutôt que de dev en aveugle, il faut activé aussi les erreurs PDO (cf signature)
Bonjour, merci pour tes conseils! Mais si je ne met pas htmlspecialschar comme je l'ai fait je le fait où?
Après avoir activé les erreurs, je me retrouve avec celle ci :
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; 'true', 'true', 'Test avec erreurs\r\n')' at line 1 in C:\MAMP\htdocs\V0.5\traitement.php:108 Stack trace: #0 C:\MAMP\htdocs\V0.5\traitement.php(108): PDOStatement->execute(Array) #1 {main} thrown in C:\MAMP\htdocs\V0.5\traitement.php on line 108
Je ne sais pas trop comment aborder cette erreur... toutefois quand je commente mes données issues de mes checkbox cette erreur disparaît.
Je vais essayer de changer mes checkbox en bouton radio puisque le bouton radio au dessus fonctionne sans problème!
Pareil pour les autres. N'utilisez pas les chaînes 'true'/'false' quand le type booléen est fait pour ça !!!
PS : la cast en int c'est pour transformer correctement FALSE en 0 sinon la cast directe de FALSE en string opérée par PDOStatement::execute va donner la chaîne vide.
> the right syntax to use near '; 'true', 'true', 'Test avec erreurs\r\n')'
Tu as mis un ; au lieu d'une , (entre :chariotte et :fantastique) :roll:
Merci c'était effectivement ça l'erreur
Je vais modifier tout ca pour que ce soit propre!! Encore merci pour votre aide a tous
Checkbox et PHP vers BDD
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Il n'y a pas de question idiote, seulement une réponse idiote
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
Il n'y a pas de question idiote, seulement une réponse idiote
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
Il n'y a pas de question idiote, seulement une réponse idiote
Il n'y a pas de question idiote, seulement une réponse idiote
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
Il n'y a pas de question idiote, seulement une réponse idiote
Il n'y a pas de question idiote, seulement une réponse idiote
Il n'y a pas de question idiote, seulement une réponse idiote
Activer les erreurs PDO / (julp) htmlspecialchars / FAQ PHP / Pas d'aide par MP
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli