Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2010, 22h17   #1
Invité de passage
 
Inscription : mai 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
Par défaut envoi de checkbox dans formulaire php

Bonjour,
j'ai réussi à faire fonctionner une petite base de donnée en PHP qui se rempli au moyen d'un formulaire. Mon formulaire fonctionne parfaitement lorsque j'utilise des input de type "text", mais j'aurai besoin de mettre en plus, à présent, des input de type "checkbox" et c'est là que le problème se manifeste. Si je ne coche pas les cases alors rien ne s'ajoute dans ma base de donnée. Par contre si je coche toutes les cases alors ça fonctionne (et ça ajoute bien le mot "oui" comme je le souhaite dans ma base de donnée). Si quelqu'un pouvait me corriger mon script ce serait vraiment bien car je commence à désespérer, voici le code source de mes 2 pages :

La première page intitulée "index" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<html>
    <head>
        <title>Ma page</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <style type="text/css">
    form
    {
        text-align:center;
    }
    </style>
    <body>
    <form action="formulaire-suite.php" method="post">
        <p>
        Nom Prénom : <input type="text" name="Nom" /><br />
        Cochez la ou les villes visitées :
        Paris :  <input type="checkbox" name="Paris" value="oui"><br />
        Lyon :  <input type="checkbox" name="Lyon" value="oui"><br />
        <input type="submit" value="Envoyer" />
	</p>
    </form>
    </body>
</html>
La seconde page intitulée "formulaire-suite" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=voyage', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(?, ?, ?)');
$req->execute(array($_POST['Nom'], $_POST['Paris'], $_POST['Lyon']));
 
// Redirection du visiteur vers la page d'accueil
header('Location: index.php');
?>
Merci par avance, cordialement, Franck
baraufranck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 22h27   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Avant de desesperer, il faut debuguer et pour debuguer il faut afficher les erreurs dans ton code.

Il faut savoir qu'une checkbox non cochée ne transmet rien par POST
Code :
1
2
3
4
5
 
$check_paris = isset($_POST['Paris']) ? $_POST['Paris'] : '';
$check_lyon = isset($_POST['Lyon']) ? $_POST['Lyon'] : '';
req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(?, ?, ?)');
$req->execute(array($_POST['Nom'], $check_paris, $check_lyon));
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2010, 22h29   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

cela ne marche pas comme cela. Il faut par exemple que tu stockes tes checkbox dans un tableau est qui envoyé à ta page de traitement. Ensuite, tu regardes si la valeur (value) de tes checkbox se trouvent dans ton tableau. Si oui : la valeur est cochée ; si non : elle n'est pas cochée

Code php :
1
2
3
4
5
6
7
8
9
10
 
 <form action="formulaire-suite.php" method="post">
        <p>
        Nom Prénom : <input type="text" name="Nom" /><br />
        Cochez la ou les villes visitées :
        Paris :  <input type="checkbox" name="ville[]" value="Paris"><br />
        Lyon :  <input type="checkbox" name="ville[]" value="Lyon"><br />
        <input type="submit" value="Envoyer" />
	</p>
</form>

Code php :
1
2
3
4
5
6
7
 
if(isset($_POST['ville'])){
	foreach($_POST['ville'] as $ville)
		echo $ville . ' coché !';
}else{
   echo 'Rien n\'est coché !';
}
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 10h41   #4
Invité de passage
 
Inscription : mai 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
Je n'arrive toujours pas à faire fonctionner le script, qu'est ce que je met dans chacune des pages "formulaire-suite" et "index". Je m'y perd un peu.
baraufranck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 10h50   #5
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
C'est simple : dans formulaire-suite tu mets tout ton php

Montre nous tes 2 fichiers stp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 10h58   #6
Invité de passage
 
Inscription : mai 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
Citation:
Envoyé par Madfrix Voir le message
C'est simple : dans formulaire-suite tu mets tout ton php

Montre nous tes 2 fichiers stp

La première page intitulée "index.php" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<html>
    <head>
        <title>Ma page</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <style type="text/css">
    form
    {
        text-align:center;
    }
    </style>
    <body>
<form action="formulaire-suite.php" method="post">
        <p>
        Nom Prénom : <input type="text" name="Nom" /><br />
        Cochez la ou les villes visitées :
        Paris :  <input type="checkbox" name="ville[]" value="Paris"><br />
        Lyon :  <input type="checkbox" name="ville[]" value="Lyon"><br />
        <input type="submit" value="Envoyer" />
	</p>
</form>
    </body>
</html>
La seconde page intitulée "formulaire-suite.php" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=voyage', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
if(isset($_POST['ville'])){
	foreach($_POST['ville'] as $ville)
		echo $ville . ' coché !';
}else{
   echo 'Rien n\'est coché !';
}
 
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(?, ?, ?)');
$req->execute(array($_POST['Nom'], $_POST['Paris'], $_POST['Lyon']));
 
// Redirection du visiteur vers la page d'accueil du fichier clients
header('Location: index.php');
?>
Et j'ai dans ma base de données intitulée "voyage", une table comprenant 3 champs que sont "Nom, Paris, Lyon", et je voudrais que lorsque les cases sont cochées ça inscrive le mot oui dans ma base de donné. Du genre, si je coche Paris alors dans ma bdd, on a le mot oui qui est ajouté par contre si on ne coche pas la case de Paris alors dans ma bdd on a le mot non si possible (ou rien du tout). Merci par avance.
baraufranck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h00   #7
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
tes champs Nom, Paris, Lyon sont de quel type en base ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h02   #8
Invité de passage
 
Inscription : mai 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
Citation:
Envoyé par Madfrix Voir le message
tes champs Nom, Paris, Lyon sont de quel type en base ?
Ils sont de type text (pas varchar...)
baraufranck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h06   #9
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Ca donne quoi si tu fais ca ?

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$Nom = 'nom';
$Paris = 'non coché';
$Lyon= 'non coché';
 
if(isset($_POST['ville']))
	foreach($_POST['ville'] as $ville)
		${$ville} = 'coché';
 
 
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(?, ?, ?)');
$req->execute(array($Nom, $Paris, $Lyon));
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h34   #10
Invité de passage
 
Inscription : mai 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
J'ai suivi ton conseil, j'ai mis les champs "Paris" et "Lyon" en type "tinyint". A présent que faire pour que lorsque je coche la case paris et/ou lyon on voit le n°1, et que lorsque la ou les cases ne sont pas cochées alors on ait 0 dans ma base de donnée. Encore merci pour ton aide, c'est vraiment appréciable. Je bloque sur ce détail qui commence à me désespérer.

La première page intitulée "index.php" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<html>
    <head>
        <title>Ma page</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <style type="text/css">
    form
    {
        text-align:center;
    }
    </style>
    <body>
<form action="formulaire-suite.php" method="post">
        <p>
        Nom Prénom : <input type="text" name="Nom" /><br />
        Cochez la ou les villes visitées :<br />
        Paris :  <input type="checkbox" name="ville[]" value="Paris"><br />
        Lyon :  <input type="checkbox" name="ville[]" value="Lyon"><br />
        <input type="submit" value="Envoyer" />
	</p>
</form>
    </body>
</html>
La seconde page intitulée "formulaire-suite.php" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=voyage', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
$Paris = 'non coché';
$Lyon= 'non coché';
 
if(isset($_POST['ville']))
	foreach($_POST['ville'] as $ville)
		${$ville} = 'coché';
 
 
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(?, ?, ?)');
$req->execute(array($Nom, $Paris, $Lyon));
 
// Redirection du visiteur vers la page d'accueil du fichier clients
header('Location: index.php');
?>
(Rappel : Et j'ai dans ma base de données intitulée "voyage", une table comprenant 3 champs que sont "Nom, Paris, Lyon", et je voudrais que lorsque les cases sont cochées ça inscrive le n°1 dans ma base de donné. Du genre, si je coche Paris alors dans ma bdd, on a le n°1 qui est ajouté, par contre si on ne coche pas la case de Paris alors dans ma bdd on a le n° 0 si possible). Merci par avance.
baraufranck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h39   #11
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
créer un champs de type text pour stocker oui ou non est une aberration. Tu dois créer un champs de type tinyint et stocker 1 ou 0 plutôt.

Ajoutes ceci avant l'insertion en base afin de contrôler les valeurs :

Code php :
1
2
3
4
 
echo "Nom = $Nom <br />";
echo "Paris= $Paris<br />";
echo "Lyon= $Lyon<br />";

Les valeurs sont elles conformes à tes attentes ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 11h57   #12
Invité de passage
 
Inscription : mai 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
Citation:
Envoyé par Madfrix Voir le message
créer un champs de type text pour stocker oui ou non est une aberration. Tu dois créer un champs de type tinyint et stocker 1 ou 0 plutôt.

Ajoutes ceci avant l'insertion en base afin de contrôler les valeurs :

Code php :
1
2
3
4
 
echo "Nom = $Nom <br />";
echo "Paris= $Paris<br />";
echo "Lyon= $Lyon<br />";

Les valeurs sont elles conformes à tes attentes ?
J'ai suivi ton conseil, j'ai mis les champs "Paris" et "Lyon" en type "tinyint". A présent que faire pour que lorsque je coche la case paris et/ou lyon on voit le n°1, et que lorsque la ou les cases ne sont pas cochées alors on ait 0 dans ma base de donnée. Encore merci pour ton aide, c'est vraiment appréciable. Je bloque sur ce détail qui commence à me désespérer.

La première page intitulée "index.php" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<html>
    <head>
        <title>Ma page</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <style type="text/css">
    form
    {
        text-align:center;
    }
    </style>
    <body>
<form action="formulaire-suite.php" method="post">
        <p>
        Nom Prénom : <input type="text" name="Nom" /><br />
        Cochez la ou les villes visitées :<br />
        Paris :  <input type="checkbox" name="ville[]" value="Paris"><br />
        Lyon :  <input type="checkbox" name="ville[]" value="Lyon"><br />
        <input type="submit" value="Envoyer" />
	</p>
</form>
    </body>
</html>
La seconde page intitulée "formulaire-suite.php" :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=voyage', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
$Paris = 'non coché';
$Lyon= 'non coché';
 
if(isset($_POST['ville']))
	foreach($_POST['ville'] as $ville)
		${$ville} = 'coché';
 
 
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(?, ?, ?)');
$req->execute(array($Nom, $Paris, $Lyon));
 
// Redirection du visiteur vers la page d'accueil du fichier clients
header('Location: index.php');
?>
(Rappel : Et j'ai dans ma base de données intitulée "voyage", une table comprenant 3 champs que sont "Nom, Paris, Lyon", et je voudrais que lorsque les cases sont cochées ça inscrive le n°1 dans ma base de donné. Du genre, si je coche Paris alors dans ma bdd, on a le n°1 qui est ajouté, par contre si on ne coche pas la case de Paris alors dans ma bdd on a le n° 0 si possible). Merci par avance.
baraufranck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 12h01   #13
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Que donne ceci en base ?

Code php :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=voyage', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
$Paris = 0;
$Lyon= 0;
 
if(isset($_POST['ville']))
	foreach($_POST['ville'] as $ville)
		${$ville} = 1;
 
$Nom = $_POST['nom']; 
 
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(:nom, :paris, :lyon)');
$req->bindParam(':nom', $Nom);
$req->bindParam(':paris', $Paris, PDO::PARAM_INT);
$req->bindParam(':lyon', $Lyon, PDO::PARAM_INT);
$req->execute();
 
// Redirection du visiteur vers la page d'accueil du fichier clients
header('Location: index.php');
?>

EDIT: le champs nom se récupérère via $_POST['nom'];
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 22h32   #14
Invité de passage
 
Inscription : mai 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
C'est tout bon j'ai fini par trouver la réponse, je remercies les membres de ce forum qui m'ont apportés des idées. Voici la solution du problème pour les prochain qui comme moi seront confrontés à ce genre de problème.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<?php
// Connexion à la base de données
try
{
	$bdd = new PDO('mysql:host=localhost;dbname=voyage', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
 
 
$Paris=isset($_POST['Paris'])?$_POST['Paris']:' ';
$Lyon=isset($_POST['Lyon'])?$_POST['Lyon']:' ';
 
 
// Insertion du message à l'aide d'une requête préparée
$req = $bdd->prepare('INSERT INTO fichier_clients (Nom, Paris, Lyon) VALUES(?, ?, ?)');
$req->execute(array($_POST['Nom'], $Paris, $Lyon));
 
// Redirection du visiteur vers la page d'accueil du fichier clients
header('Location: index.php');
?>
Amicalement
baraufranck est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h25.


 
 
 
 
Partenaires

Hébergement Web