Page 1 sur 1

Formulaire : plusieurs select générés et vérification

Posté : 30 déc. 2011, 15:00
par Andes
Salut à tous,

alors voilà, j'ai un problème sur un futur site, lequel proposent de réserver des "services" une fois sélectionner proposent également des options plus ou moins différentes selon le service.
Mon problème se pose sur le process de réservation/demande, après avoir choisit son service, je souhaiterai que l'internaute puisse cocher les options (qui vont avec le service sélectionné et qui sont donc générées après une requete sql) et puisse choisir également une quantité pour chaque option. Alors mon gros problème est que pour le moment je ne vois pas comment récupérer la quantité voulue pour chaque option.

Je vous montre mon code :


formulaire :
<input type="checkbox" name="options[]" value="<?php echo $donnees['id_option']; ?>"
 />
Nombre de personne 
<select name="nbrepersonne'">
  	  <option value="0">0</option>
	  <option value="1">1</option>
	  <option value="2">2</option>
	  <option value="3">3</option>
	  <option value="4">4</option>
</select>

controle :
$reponse = mysql_query('SELECT * FROM option WHERE  id_service ="'.$id_service.'" ');

while ($donnees = mysql_fetch_array($reponse)) // boucle pour tester chaque option que propose le service 

{

$options = $_POST["options"]; // $option est le nom de l'array envoyé dans le formulaire sous forme name="options[id_option]"



$id_option = $donnees['id_option']; 



if (in_array($id_option, $options)) {

echo "l'option est cochée";

}



}



Si une âme charitable pouvait juste m'indiquer ne serait-ce que une infime direction je serais aux anges. Je suis preneur de n'importe quelle solution et dans n'importe quelle language, je m'adapterai.

Merci d'avance

Andes.

Re: Formulaire : plusieurs select générés et vérification

Posté : 30 déc. 2011, 15:49
par moogli
salut,


il faut que tu nomme aussi tes options avec la notation tableau, ensuite tu boucle sur le champ des checkboxs (options[]) et tu regarde pour chaque checkbox s'il existe un champ de choix associé si oui tu le traite :)


@+

Re: Formulaire : plusieurs select générés et vérification

Posté : 30 déc. 2011, 17:23
par Andes
salut,


il faut que tu nomme aussi tes options avec la notation tableau, ensuite tu boucle sur le champ des checkboxs (options[]) et tu regarde pour chaque checkbox s'il existe un champ de choix associé si oui tu le traite :)


@+
Salut moogli,

tout d'abord merci de ta réponse rapide :) Quand tu me dis tu nommes aussi tes options, est-ce que tu veux dire que je dois faire ca :
<select name="nbrepersonne'">
          <option value="0" name="selection[]">0</option>
          <option value="1" name="selection[]">1</option>
</select>
C'est possible de donner un name aux options ?
Si oui, sur l'exemple ci-dessus, comment passer dans le formulaire l'id de l'option en rapport avec ce select ? Si tu m'as déjà répondu en me demandant de vérifier "si il existe un champ de choix associé ", pourrais-tu être plus explicite sur le terme de champ de choix associé, j'ai peur de ne pas comprendre :/

Merci encore, et désolé pour les questions si elles paraissent stupides :/

Re: Formulaire : plusieurs select générés et vérification

Posté : 30 déc. 2011, 17:38
par xTG
Non plutôt ainsi :
<input type="checkbox" name="options[]" value="<?php echo $donnees['id_option']; ?>"
 />
Nombre de personne
<select name="optionsValues[]'">
          <option value="0">0</option>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
</select>
Ainsi tu as une correspondance entre les index de $_POST['options'] et $_POST['optionsValues']. :)

Re: Formulaire : plusieurs select générés et vérification

Posté : 31 déc. 2011, 13:42
par Andes
Non plutôt ainsi :
<input type="checkbox" name="options[]" value="<?php echo $donnees['id_option']; ?>"
 />
Nombre de personne
<select name="optionsValues[]'">
          <option value="0">0</option>
          <option value="1">1</option>
          <option value="2">2</option>
          <option value="3">3</option>
          <option value="4">4</option>
</select>
Oui j'avais pensé à faire cela mais je ne vois pas comment récupérer la "value" dans un in_array.. Après je suis assez limité dans mes connaissances php :/ Notamment quand tu me dis :
Ainsi tu as une correspondance entre les index de $_POST['options'] et $_POST['optionsValues']. :)
Que veux-tu dire par correspondance ?
En fait je vois pas vraiment comment récupérer la value du select pour chaque option par rapport à mon code de traitement ci-dessous, pour la checkbox je fais passer l'id de l'option donc ce n'est pas un soucis, or là je suis perdu :/
$reponse = mysql_query('SELECT * FROM option WHERE  id_service ="'.$id_service.'" ');

while ($donnees = mysql_fetch_array($reponse)) // boucle pour tester chaque option que propose le service 

{
$options = $_POST["options"]; // $option est le nom de l'array envoyé dans le formulaire sous forme name="options[id_option]"

$id_option = $donnees['id_option']; 

if (in_array($id_option, $options)) {

echo "l'option est cochée";
echo "nombre d'option selectionné :".$ici_variable_selection_option ;  // comment définir cette variable et l'extraire de optionsValues[] pour cette option ?

}

}
Désolé d'être un boulet, c'est peut-être flagrant, juste devant moi, mais j'avoue que je ne trouve pas la solution, et puis les fêtes ça aide pas :lol:

Merci d'avance :oops:

Re: Formulaire : plusieurs select générés et vérification

Posté : 31 déc. 2011, 15:58
par moogli
ta requête SQL c'est pour vérifier que l'option choisie est une option "valide" (présente dans la table ?).
si oui tu n'y prend pas bien. LA ce que tu fait c'est un Rennes Vannes en passant par Lille, Strasbourg, Marseille et bordeaux :)
la route la plus courte c'est de modifier la condition dans le where de la requête SQL.

tu peux, par exemple utiliser une requête préparée avec PDO (ou l'extension mysql peux importe)
pour un $sql = 'select SELECT count(*) as nb FROM option WHERE id_service ='.$id_service.' and id_option = ?');

tu utilise un foreach pour parcourir $_POST['options'] et vérifier qu'il existe bien un choix pour cette option (avec in_array par exemple mais sur $_POST['optionsValues']) et ensuite vérifier que cette que cette option existe bien dans la base.


PDO c'est quoi
Faire des requêtes préparées avec l'extension mysql par Stealth35

ce code pourrait aller
<?php
$pdo = new PDO('mysql:host=localhost;dbname=latienne','ton user','ton mot de passe de ton user');
$prepare = $pdo->prepare('select SELECT count(*) as nb FROM option WHERE  id_service ='.$id_service.' and id_option = ?');
foreach ($_POST['options'] as $opt){
	if (in_array($opt,$_POST['optionsvalues'])){
		// ok, on vérifie que cette option soit valide dans la table
		$prepare->bindValue(1, $_POST['optionsValues']['opt'], PDO::PARAM_INT);
		$prepare->execute();
		$ret = $prepare->fetch(PDO::FETCH_OBJ);
		if ($ret !== 0 {
			// la c'est bon
			echo 'l\'option '.$opt.' est cochée';
		}
		else {
			// la valeur de l'option choisie n'existe pas !
		}
	}
	else {
		// erreur l'options choisie n'a pas de valeur associée c'pas bien ;)
	}
}
echo "nombre d'option selectionné :".count($_POST['options']);
?>
il nécessite que tu passe en "value" des optionsValues l'id_option idem pour la valeur dans options.

bon après c'est la structure de tes tables, je suppose que le "$id_service" est géré avant et que j'ai bien compris ce que tu souhaite :mrgreen:


@+

Re: Formulaire : plusieurs select générés et vérification

Posté : 31 déc. 2011, 16:17
par xTG
Ainsi tu as une correspondance entre les index de $_POST['options'] et $_POST['optionsValues']. :)
Que veux-tu dire par corr
Je veux dire qu'on a la relation suivante :
foreach($_POST['options'] as $index => $option)
  echo "option $option, valeur {$_POST['optionValues'][$index]}";

Re: Formulaire : plusieurs select générés et vérification

Posté : 02 janv. 2012, 13:38
par Andes
<?php
$pdo = new PDO('mysql:host=localhost;dbname=latienne','ton user','ton mot de passe de ton user');
$prepare = $pdo->prepare('select SELECT count(*) as nb FROM option WHERE  id_service ='.$id_service.' and id_option = ?');
foreach ($_POST['options'] as $opt){
	if (in_array($opt,$_POST['optionsvalues'])){
		// ok, on vérifie que cette option soit valide dans la table
		$prepare->bindValue(1, $_POST['optionsValues']['opt'], PDO::PARAM_INT);
		$prepare->execute();
		$ret = $prepare->fetch(PDO::FETCH_OBJ);
		if ($ret !== 0 {
			// la c'est bon
			echo 'l\'option '.$opt.' est cochée';
		}
		else {
			// la valeur de l'option choisie n'existe pas !
		}
	}
	else {
		// erreur l'options choisie n'a pas de valeur associée c'pas bien ;)
	}
}
echo "nombre d'option selectionné :".count($_POST['options']);
?>
il nécessite que tu passe en "value" des optionsValues l'id_option idem pour la valeur dans options.

bon après c'est la structure de tes tables, je suppose que le "$id_service" est géré avant et que j'ai bien compris ce que tu souhaite :mrgreen:


@+
Merci de ta réponse et du temps que t'as passé à écrire le code, cependant je n'arrive pas à faire passer le select, j'ai ton petit message (erreur l'options choisie n'a pas de valeur associée c'pas bien) qui s'affiche, je pense que ca vient du fait que je n'ai pas compris t'as phrase "il nécessite que tu passe en "value" des optionsValues l'id_option idem pour la valeur dans options.". Je ne vois pas ce que tu veux me dire par là... :/
Je veux dire qu'on a la relation suivante :
foreach($_POST['options'] as $index => $option)
  echo "option $option, valeur {$_POST['optionValues'][$index]}";
Merci pour ta réponse, avec ton code, cela fonctionne correctement, mon seul soucis est que si je ne coche que la 2e checkbox (et donc pas la première) et que je choisi par exemple pour sélection 3. Dans la page de vérif il me prend comme sélection : "0", ce chiffre correspondant au select censé être lié à la première checkbox :/ Je sais pas si j'ai été clair...
En tout cas, cela marche correctement si je coche le premier select, etc. Les sélections correspondent bien, il y'a un problème de décalage dès que je saute un checkbox.

Un in_array pourrait-il faire l'affaire ?


Merci à vous 2.

ps : merci pour la lecture :) On en apprend tous les jours :)