Enregistrement des options dans une base sql

Eléphant du PHP | 70 Messages

10 févr. 2012, 09:37

Bonsoir les internautes

Je reviens à nouveau vers vous car je suis face à un soucis. Je mis en place une table "annonce", une table "options" et une table "option_vehicule". Je souhaite via un formulaire attribuer des options pour les vehicules de mes annonces. Je récupère bien l'id du vehicule, j'ai bien les case à cocher avec les options mais je sais pas comme faire pour que quand je coche plusieurs option elles s'ajoutent dans ma table.

Pouvez-vous me mettre sur une piste ?

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,
  `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`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=40 ;
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`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

ma 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`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;
et voici mon code php du formulaire
<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';

								// récuperation du dernier id
			
								$requ_option = ("SELECT * FROM options ORDER BY id_option ASC");
								$option = mysql_query($requ_option);
									while ($row_option = mysql_fetch_array($option))
										{
										
										echo '<input type="hidden" name="'.$_SESSION['last_id'].'" id="last_id" />';
										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>
			<div id="bouton_form"><input class="bouton_submit" name="envoyer" type="submit" value="Etape suivante -> Ajout des photos" /></div>
			</form>

ViPHP
xTG
ViPHP | 7331 Messages

10 févr. 2012, 11:41

Déjà un souci avec ton input hidden, car tu vas avoir plusieurs fois le même input avec le même nom...

Ensuite je te conseille de modifier le nom des checkbox pour une notation tableau.
<input type="checkbox" name="monTableau[0]" />
<input type="checkbox" name="monTableau[1]" />
<input type="checkbox" name="monTableau[2]" />
Ainsi avec mon exemple à la réception tu as un array dont les index sont les id des options si on suit ta notation.
Donc suffit de le parcourir :
$monTableau = (isSet($_POST['monTableau'])) ? $_POST['monTableau'] : array();
foreach($monTableau as $id_option => $valeur){
  // traitement de l'option
}

Eléphant du PHP | 70 Messages

10 févr. 2012, 12:08

Merci pour ta reponse. Donc si j'ai bien compris la solution que te me propose, j'ajoute ma requete d'insertion SQL avec comme valeur $valeur dans ma requete ? et il y aura donc autant de boucle que de checkbox ?


$monTableau = (isSet($_POST['monTableau'])) ? $_POST['monTableau'] : array();
foreach($monTableau as $id_option => $valeur){
// traitement de l'option
}

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

10 févr. 2012, 12:27

salut,

il faut que tu utilise la notation tableau pour nommer tes checkbox avec la notation tableau exemple <input type="checkbox" anme="options[]" value=" ..."/>

et tu met en value la clef primaire de l'option concernée.

après tu récupère un tableau dans $_POST['options']

a partir de la tu peux en faire ce que tu veux, comme par exemple utiliser implode => $txt = "'" . implode("','",$_POST['options']) . "'";

en fonction de ce que tu souhaite en faire :)


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

ViPHP
xTG
ViPHP | 7331 Messages

10 févr. 2012, 12:37

Merci pour ta reponse. Donc si j'ai bien compris la solution que te me propose, j'ajoute ma requete d'insertion SQL avec comme valeur $valeur dans ma requete ? et il y aura donc autant de boucle que de checkbox ?


$monTableau = (isSet($_POST['monTableau'])) ? $_POST['monTableau'] : array();
foreach($monTableau as $id_option => $valeur){
// traitement de l'option
}
Non justement, le but de la notation tableau c'est qu'au final tu auras une boucle pour traiter toutes les checkbox. ;)

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

10 févr. 2012, 12:39

t'a pas mis le value et pas indiqué que les chiffres c'était les indexs :mrgreen:

perso je pense que ma méthode est plus simple, bon c'est que mon avis, perso j'aime pas avoir des données "significatives" en index :)

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

Eléphant du PHP | 70 Messages

10 févr. 2012, 15:40

merci pour vos réponses, Je vais donc faire par étape.

la page de mon formulaire est elle bonne pour la suite ?
<?php

	// On démarre la session 
	// session_start();

	//connection à la base de données
	require_once '../_inc/_connexion.php';
	
	// affichage des options
	$requ_option = ("SELECT * FROM options ORDER BY id_option ASC");
	$option = mysql_query($requ_option);
	
	
	
	
?>
<!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
							
									while ($row_option = mysql_fetch_array($option))
										{
										echo '<div id="options"><input type="checkbox" name="'.$row_option['id_option'].'" value="'.$row_option['id_option'].'"/><p title="'.$row_option['description_option'].'">'.$row_option['titre_option'].'</p></div>';
										}
							?><input type="hidden" name="<?php echo $_SESSION['last_id'] ; ?>" id="last_id" />
							</div>
					</div>
					
				</fieldset>
			<div id="bouton_form"><input class="bouton_submit" name="envoyer" type="submit" value="Etape suivante -> Ajout des photos" /></div>
			</form>	
		</div>
			
        
</body>
</html>