Bonjour à tous,

j'aimerais insérer dans ma base de données la valeur de plusieurs checkbox, or avec mon code actuel bien sûr il n'y en a qu'une qui s'enregistre (je sais que c'est car à chaque foreach la valeur précédente est effacée):


foreach ($_POST['matieres'] as $element)
	{
	foreach ($_POST['niveau'] as $element2)
	{
$requete=$bdd->prepare('UPDATE membres SET matieres= :matieres, niveau= :niveau, experience= :experience WHERE id= :id');
	
$requete->execute(array(
		'matieres'=>$element,
		'niveau'=>$element2,
	        'experience'=>$_POST['experience'],
		'id'=>$_SESSION['id']
		));
	}				
	}					


Quelqu'un aurait-il une solution? Merci et bonne journée!
Modifié par maud01 (25 Mar 2015 - 11:16)
Salut

il y a une solution simple pour les posts des checkbox récupérées en php

créé un array avec le name du champs

en gros au lieu de name='macheckbox' mettre name='macheckbox[]'

à la réception le php va automatiquement créer l'array macheckbox avec tout ceux cochés Smiley cligne
Merci, c'est une solution que j'ai vue sur d'autres forums mais il me semble que c'est déjà ce que j'ai fait:


<input type="checkbox" name="matieres[]" value="maths"/> <label for = "maths"> Mathématiques </label> </br>		
	<input type="checkbox" name="matieres[]" value="anglais"/> <label for="anglais">Anglais</label></br>
	<input type="checkbox" name="matieres[]" value="histoire"/> <label for= "histoire"> Histoire </label>
OK pour matières et niveau tu le trouve comment ? La dans ton cas tel que tu sauves tu déterminé que pour une matière il peut y avoir plusieurs niveaux.
Est c bien ça ou non ?
En fait après réflexion j'ai retiré les box niveau, je peux m'en passer et ça me complique la tache. En revanche pour matière, je n'ai toujours qu'une matière qui s'enregistre.
Salut juste une réflextion du comment préparer sa requête lorsque l'on a un tas d'éléments inputs dans le formulaire.

1) Il faut faut surtout pas faire des boucles inutiles pour une mise à jours qui provient d'un post.
2)L'idée ici est de splitter $_POST['matieres'] car je m'étonne que tu n'écrase pas tes premières données entrées dans la base et qu'au final tu obtiens la dernière valeur, ce qui pour moi est normal au vu du code.
Un simple implode avec séparateur "," pour que tu puisse les exploités en faisant le contraire lors de leur selection en base explode pour obtenir un tableau de ses matières lors de l'affichage des données.


$matieres = Array();
foreach ($_POST['matieres'] as $element => $key)
{	
        if(!$element[$key]) //si le checkbox est checké on alimente notre tableau pour le future UPDATE
	$matieres[$key] = $element[$key];
}
foreach ($_POST['niveau'] as $element2)
{

}	
$requete=$bdd->prepare('UPDATE membres SET matieres= :matieres, niveau= :niveau, experience= :experience WHERE id= :id');
	
$requete->execute(array(
		'matieres'=>implode(",", $matieres[$key]),
		'niveau'=>$element2,
	        'experience'=>$_POST['experience'],
		'id'=>$_SESSION['id']
		));


J'ai pas testé mais l'idée est la.
Bonne chance
Modifié par headmax (26 Mar 2015 - 09:51)
Merci, en effet je pense que la piste est très prometteuse. Malheureusement quand je la teste, les valeurs cochées ne rentrent pas dans la base de données et le champ expérience n'est plus enregistré. Je ne parviens pas à savoir pourquoi:

J'en suis donc à:

$matieres = Array();
		
foreach ($_POST['matieres'] as $element => $key)
{	
if(!$element[$key]) //si le checkbox est checké on alimente notre tableau pour le future UPDATE
$matieres[$key] = $element[$key];
}
		
$requete=$bdd->prepare('UPDATE membres SET matieres= :matieres, experience= :experience WHERE id= :id');
			
	$requete->execute(array(
	'matieres'=>implode(",", $matieres[$key]),
	  'experience'=>$_POST['experience'],
	'id'=>$_SESSION['id']
	));
Peux tu me données les erreurs sauf le domaine que tu masque SVP.

Pour le champs expérience peux tu me copier-coller ton formulaire en masquant les domaines.

Erreur de ma part j'ai omis d'enlever l'index...


$matieres = Array();
		
foreach ($_POST['matieres'] as $element => $key)
{	
if(!$element[$key]) //si le checkbox est checké on alimente notre tableau pour le future UPDATE
$matieres[$key] = $element[$key];
}
		
$requete=$bdd->prepare('UPDATE membres SET matieres= :matieres, experience= :experience WHERE id= :id');
	//ici on passe un tableau entier $matieres
       //j'ai mit des quotes car l'implode var créer une chaine a partir d'un tableau (il coupe / splitter)
	$requete->execute(array(
	'matieres'=>"'" . implode(",", $matieres) . "'",
	  'experience'=>$_POST['experience'],
	'id'=>$_SESSION['id']
	));

Modifié par headmax (26 Mar 2015 - 13:12)
C'est bon le champ expérience est bien enregistré dans la base de donnée.

Mais à la place des matières dans la base de données s'affichent des virgules entre guillemets: ',,'
Ok je pense que le problème vient au dessus au niveau de l'affectation de la variable $matière essaye ça :


$matieres = Array();
$i = 0;		
foreach ($_POST['matieres'] as $element)
{	
if(!$element) //si le checkbox est checké on alimente notre tableau pour le future UPDATE
     $matieres[$i] = $element;
    $i++;
}
		
$requete=$bdd->prepare('UPDATE membres SET matieres= :matieres, experience= :experience WHERE id= :id');
	//ici on passe un tableau entier $matieres
       //j'ai mit des quotes car l'implode var créer une chaine a partir d'un tableau (il coupe / splitter)
	$requete->execute(array(
	'matieres'=>"'" . implode(",", $matieres) . "'",
	  'experience'=>$_POST['experience'],
	'id'=>$_SESSION['id']
	));

Modifié par headmax (26 Mar 2015 - 18:15)
(Un énorme merci pour ta persévérance)

Désormais dans ma base de données dans le champ matières: "
;) désolé de mettre un peu mélangé, c'est pas facile (sans visu).
Pas le choix il faut que tu debug est tu me dise ce que tu obtiens


$matieres = Array();
$i = 0;		
foreach ($_POST['matieres'] as $element)
{	
if(!$element) //si le checkbox est checké on alimente notre tableau pour le future UPDATE
     $matieres[$i] = $element;
    $i++;
}
//DEBUG ICI
//VAR_DUMP pour afficher les données du tableau $matieres
//Regarde s'il contient bien les données du formulaire
var_dump($matieres);
exit(); //ici on arrete le programme avec la requete donc il ne fera pas d'update et s'arretera
	
$requete=$bdd->prepare('UPDATE membres SET matieres= :matieres, experience= :experience WHERE id= :id');
	//ici on passe un tableau entier $matieres
       //j'ai mit des quotes car l'implode var créer une chaine a partir d'un tableau (il coupe / splitter)
	$requete->execute(array(
	'matieres'=>"'" . implode(",", $matieres) . "'",
	  'experience'=>$_POST['experience'],
	'id'=>$_SESSION['id']
	));



//exemple ici au lieu de $rows ton tableau proviendra de ta requete SQL
$rows = array();
$rows['matiere'] = 'matierea, math, economie, geographie';
$matiere_tableau = explode(',',$rows['matiere']);
foreach($matiere_tableau as $matiere){
	echo $matiere;
}


Donc je pense que tu as compris le principe, bonne chance pour la suite.
Modifié par headmax (27 Mar 2015 - 09:40)