Problème bouton radio et SQL

Eléphant du PHP | 70 Messages

20 févr. 2012, 16:01

Bonjour à tous.

Je rencontre des difficultés pour mettre en place un système d'option( via bouton radio )pour les annonces de mes véhicules. Voici comment je procède, dans un premier temps j'ai un formulaire d'ajout du véhicule( marque, modèle, année, couleur, description, km....) ensuite apres validation du formulaire j'arrive sur une page qui récapitule l'annonce. Une fois la validation de l'annonce celle-ci s'ajoute à ma table " annonce ". Jusque là aucun soucis.

Dans la 2eme partie de l'ajout d'une annonce, je récupère le dernier " id " de ma table annonce pour faire le choix des options du véhicule. J'ai donc un nouveau formulaire avec des boutons radio de toutes les options dispo.

J'aimerai cocher les bouton radio des options dispo de la table " options " dans le véhicule et les mettre dans une nouvelle table " option_vehicule ".

exemple:
vehicule 1 option 3
vehicule 1 option 2
vehicuel 1 option 5
vehicule 2 option 3

voici ma page du formulaire pour le choix des options:
<?php

	// On démarre la session 
	session_start();
	
	if (isset($_SESSION['modele']))
		{
		$ajout_modele = $_SESSION['modele'];
		$marque = $_SESSION['marque'];
		$etat = $_SESSION['etat'];
		$couleur = $_SESSION['couleur'];
		$description = $_SESSION['description'];
		$km = $_SESSION['km'];
		$date = $_SESSION['date'];
		$motorisation = $_SESSION['motorisation'];
		$nb_main = $_SESSION['nb_main'];
		$prix = $_SESSION['prix'];
		}
	elseif (isset($_SESSION['ajout_modele']))
		{
		$ajout_modele = $_SESSION['ajout_modele'];
		$marque = $_SESSION['marque'];
		$etat = $_SESSION['etat'];
		$couleur = $_SESSION['couleur'];
		$description = $_SESSION['description'];
		$km = $_SESSION['km'];
		$date = $_SESSION['date'];
		$motorisation = $_SESSION['motorisation'];
		$nb_main = $_SESSION['nb_main'];
		$prix = $_SESSION['prix'];
		}
		
	if (empty($_SESSION['marque']) & empty($_SESSION['etat']) & empty($_SESSION['couleur']) & empty($_SESSION['logo']) & empty($_SESSION['description']) & empty($_SESSION['km']) & empty($_SESSION['date']) & empty($_SESSION['motorisation']) & empty($_SESSION['nb_main']) & empty($_SESSION['prix']))
				{
				$resultat = "Erreur d'ajout de l'annonce";
				}
			else 
				{
				//connection à la base de données
				require_once '../_inc/_connexion.php';
			
				$requ_ajout = ("INSERT INTO annonce (
							`id_annonce` ,
							`id_type_annonce` ,
							`id_marque_annonce` ,
							`id_modele` ,
							`couleur_annonce` ,
							`description_annonce` ,
							`motorisation_annonce` ,
							`date_annonce` ,
							`proprietaire_annonce` ,
							`km_annonce` ,
							`prix_annonce`)
							VALUES (
							NULL ,  '$etat',  '$marque',  '$ajout_modele', '$couleur', '$description',  '$motorisation',  '$date',  '$nb_main',  '$km', '$prix'
							
							)");
				mysql_query($requ_ajout) or die('Erreur SQL !'.$requ_ajout.'<br>'.mysql_error()); 
			
			
				$recup_dernier = ("SELECT id_annonce FROM  `annonce` ORDER BY  `annonce`.`id_annonce` DESC LIMIT 1");
				$resultat_last_id = mysql_query($recup_dernier);
				$last_id = mysql_fetch_array($resultat_last_id);
			
				$_SESSION['last_id'] = $last_id['id_annonce'];
				$resultat = "annonce ajouter";
				}
			
		
		
	
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="keywords" content="greg-auto, voitures neuves, voitures d'occasion, import automobile" />
<meta name="description" content="Bienvenue sur le site Greg-auto" />

<link href="admin.css" rel="stylesheet" type="text/css" />

<title>Administraton-Greg-auto</title>
</head>

<body>
	<div id="logo"><a href="index.php" border="0"><img src="../images/greg_auto.png" border="0" width="473" height="163"></a></div>
		<?php include("_menu.php") ;?>
		<div id="sous_menu_annonce">
			<ul>
				<li><a href="_gestion_annonce.php">Listes des annonces</a></li>
				<li><a href="_ajout_annonce.php">Ajout d'une annonce</a></li>
				<li><a href="_editeur_pdf.php">Impression d'une fiche PDF</a></li>
			</ul>
		</div>
		<div id="cadre_centre">
			<form id="ajout_annonce1" name="ajout_annonce" method="post" action="traitement_option.php">
				<fieldset class="ajout_auto">
					<legend>Etape 5 - Choix des options</legend>
							<div id="contenu_option">
							<?php
								//connection à la base de données
								require_once '../_inc/_connexion.php';

								// affichage de toutes les options dispo
			
								$requ_option = ("SELECT * FROM options ORDER BY id_option ASC");
								$option = mysql_query($requ_option);
									while ($row_option = mysql_fetch_array($option))
										{
										echo '<div id="options"><input type="checkbox" name="'.$row_option['id_option'].'" id="option '.$row_option['id_option'].'" /><p title="'.$row_option['description_option'].'">'.$row_option['titre_option'].'</p></div>';
										}
							?>
							</div>
					</div>
					
				</fieldset>
				<input type="hidden" name="'.$_SESSION['last_id'].'" id="last_id" />
			<div id="bouton_form"><input class="bouton_submit" name="envoyer" type="submit" value="Etape suivante -> Ajout des photos" /></div>
			</form>	
		</div>
			
        
</body>
</html>

Pouvez vous me mettre sur une piste ? J'aimerai que les options cocher s'ajoute directement dans la table "option_vehicule".

Je ne trouve pas la méthode pour faire la requête sql en fonction des options cocher...

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 16:06

Qu'est ce qui te pose souci ? C'est la même chose que ce que tu fais actuellement avec l'annonce.
Où bloques-tu ?

Par contre au niveau html un attribut name ne doit pas être un numérique, ce doit être une chaîne de caractères.
Enfin tu as un énorme problème avec ton script d'ajout d'annonce... On rafraichit la page et on insère un doublon. ;)

Eléphant du PHP | 70 Messages

20 févr. 2012, 16:32

Qu'est ce qui te pose souci ? C'est la même chose que ce que tu fais actuellement avec l'annonce.
Où bloques-tu ?

Par contre au niveau html un attribut name ne doit pas être un numérique, ce doit être une chaîne de caractères.
Enfin tu as un énorme problème avec ton script d'ajout d'annonce... On rafraichit la page et on insère un doublon. ;)

Un énorme problème sur le script d'ajout ?? pourtant il tourne à merveille...
Mon blocage c'est la facon la requete sql qui va ajouter les options dans la table .... car si il y a plusieurs options de cocher il faut donc plusieurs requete ?

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 16:36

Cela dépend de ce que tu veux faire.
C'est un ajout ou une modification ?
Un n-uplet ou plusieurs ?

Concernant le gros problème, rafraichis la page et tu pourras constater que tu as deux fois la même annonce.
Car pour que ta requête d'insertion soit lancée il faut juste que des données soient en session.
Et après la requête ta session a toujours ces données.
Donc on rafraichit la page et on retourne au même point sauf qu'on a déjà le n-uplet dan la table, donc de nouveau un ajout => doublon d'annonce.

Eléphant du PHP | 70 Messages

20 févr. 2012, 16:45

oui exacte pour les doublons... je vais faire de l'ordre :?

pour revenir à mon plus gros soucis, je souhaite juste que quand je coche une option il y est une requête (ou plusieurs si il y a plusieurs case de cocher) qui ajout dans ma table option_vehicule. Car lors de l'ajout de l'annonce dans la premier temps il y a uniquement les infos du vehicule sans les options. C'est pourquoi je recupere le dernier id de la table annonce pour faire un ajout des options de celui-ci.

table option_vehicule:
CREATE TABLE IF NOT EXISTS `option_vehicule` (
  `id_option_vehicule` int(11) NOT NULL AUTO_INCREMENT,
  `vehicule_id` int(11) NOT NULL,
  `option_id` int(11) NOT NULL,
  PRIMARY KEY (`id_option_vehicule`),
  KEY `vehicule_id` (`vehicule_id`)
)
table annonce:
CREATE TABLE IF NOT EXISTS `annonce` (
  `id_annonce` int(11) NOT NULL AUTO_INCREMENT,
  `id_type_annonce` int(11) NOT NULL,
  `id_marque_annonce` int(11) NOT NULL,
  `id_modele` int(11) NOT NULL,
  `couleur_annonce` varchar(10) NOT NULL,
  `description_annonce` text NOT NULL,
  `motorisation_annonce` int(11) NOT NULL,
  `date_annonce` date NOT NULL,
  `proprietaire_annonce` int(11) NOT NULL,
  `km_annonce` varchar(255) NOT NULL,
  `prix_annonce` varchar(255) NOT NULL,
  PRIMARY KEY (`id_annonce`),
  KEY `type_annonce` (`id_type_annonce`)
)
table options:
CREATE TABLE IF NOT EXISTS `options` (
  `id_option` int(11) NOT NULL AUTO_INCREMENT,
  `titre_option` varchar(200) NOT NULL,
  `description_option` text NOT NULL,
  PRIMARY KEY (`id_option`)
)

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 17:28

Tu peux utiliser une notation tableau pour les options.

Exemple :
foreach($mesOptionsDeMaTable as $option){
  echo $option['titre'] . ' : <input type="checkbox" name="option[' . $option['id'] . ']" /><br />';
}
Cela renverra un tableau dont l'index sera l'id de l'option et tu auras en valeur la chaîne checked et aucun index pour les checkbox non cochée si je me souviens bien.
Donc avec ça tu n'as plus qu'à refaire une boucle avec une requête INSERT dedans utilisant l'id de l'option et l'id de ton véhicule.

Eléphant du PHP | 70 Messages

20 févr. 2012, 18:14

c'est encore tres flou... mon formulaire est donc bon ? le code que tu me proposes il sera nécessaire pour le traitement uniquement ?

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 18:32

Non tu n'as pas de notation tableau dans ton formulaire (cf l'attribut name).

Eléphant du PHP | 70 Messages

20 févr. 2012, 18:41

Alors je suis perdu. Je comprends pas ma méthode que tu me propose.

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 18:55

Notation tableau :
<input type="text" name="text[0]" value="1" />
<input type="text" name="text[1] value="2" />
Résultat récupéré ($_POST['text']) :
Array(
0 => 1,
1 => 2
)

Eléphant du PHP | 70 Messages

20 févr. 2012, 19:07

Donc pour revenir un peu en arrière,

J'ai ma boucle qui affiche toutes les options
foreach($mesOptionsDeMaTable as $option){
  echo $option['titre'] . ' : <input type="checkbox" name="option[' . $option['id'] . ']" /><br />';
}
ensuite pour la traitement je récupère à valeur ( sous forme d'un tableau avec toutes les cases cocher) de $_POST que j'ajoute à ma requête INSERT ?

ViPHP
xTG
ViPHP | 7331 Messages

20 févr. 2012, 21:51

Oui tu boucles sur la variable $_POST['option'] qui est un array et dans ta boucle tu mets ta requête INSERT.
A chaque itération de la boucle tu auras une insertion.

Eléphant du PHP | 70 Messages

20 févr. 2012, 22:49

Ok. J'ai compris le principe, j'ai autre petite question, à quoi correspond la variable $MesOptionDeMaTable ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 févr. 2012, 07:58

Cette variable est la pour l'exemple, elle indique que tu doit utiliser les valeurs issu de ta requête SQL. (donc final il y a des chances que tu utilise un while plutôt qu'un foreach mais c'est la même chose.

Petit nuance sur le code html, si tu ne veux pas t'emmerder passe la valeur de l'id en value de la Checkbox et non en index du tableau ceci pour éviter d'avoir un tableau indexé par les valeurs mais sans données.
De toute façon les Checkbox non cochée ne sont pas envoyée.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 70 Messages

21 févr. 2012, 20:58

me voici de retour pour la suite des aventures des cases à cocher...

je pense que mon formulaire doit être bon maintenant, j'aimerai juste avoir confirmation.
<form id="ajout_annonce1" name="ajout_annonce" method="post" action="traitement_option.php">
				<fieldset class="ajout_auto">
					<legend>Etape 5 - Choix des options</legend>
							<div id="contenu_option">
							<?php
								//connection à la base de données
								require_once '../_inc/_connexion.php';

								// affichage de toutes les options dispo
			
								$requ_option = ("SELECT * FROM options ORDER BY id_option ASC");
								$option = mysql_query($requ_option);
									while ($row_option = mysql_fetch_array($option))
									{
									echo $row_option['titre_option'] . ' : <input type="checkbox" name="option[' . $row_option['id_option'] . ']" /><br />';
									}
							?>
							</div>
					</div>
					
				</fieldset>
				<input type="hidden" name="<?php echo $_SESSION['last_id']; ?>" id="last_id" />
			<div id="bouton_form"><input class="bouton_submit" name="envoyer" type="submit" value="Etape suivante -> Ajout des photos" /></div>
			</form>