Pages :
Bonjour à tous!

Je sollicite votre aide car je suis bloqué sur l'envoi de données php vers ma bdd...au stade actuel, j'affiche un table avec une boucle de données et je souhaite modifier chaque id_etat et id_groupe de chaque ligne.
En clair mon tableau boucle sur des personnes s'étant inscrites au préalable et le but et d'attribuer à chacun un groupe et de les enregistrer.
J'ai donc 2 champs groupe et enregistrement...voici le code :


        <!-- Main content -->
        <section class="content">
          <div class="row">
            <div class="col-xs-12">
              <div class="box">
                <div class="box-header">
                
                <h3 class="box-title">DataTable With Fu Features</h3>      

      <?php 
      $host = "";
      $user = "";
      $pass = "";
      $bdd = "";
       // connexion
         $cnx = mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
         $db = mysql_select_db("$bdd") or die("Impossible de se connecter");
            if (mysql_connect ($host,$user,$pass)) 
            {
               echo 'Connexion réussie'; echo '<br>';
            }
            else 
            {
               echo 'Connexion impossible...'.mysql_error(); echo '<br>';
            } 
            
            $requete2="SELECT id_eta,etat FROM `ny6dh_man_etat`";
            $result2=mysql_query($requete2);
            while ($ligne=mysql_fetch_array($result2))
            {
               $chaine .= '<OPTION  NAME= "id_etat" VALUE="'.$ligne["id_eta"].'">'.$ligne["etat"].'</OPTION>';
            }

            $requete2="SELECT id_grp,groupe FROM `ny6dh_man_groupe`";
            $result2=mysql_query($requete2);
            while ($ligne=mysql_fetch_array($result2))
            {
               $chaine2 .= '<OPTION NAME= "id_groupe" VALUE="'.$ligne["id_grp"].'">'.$ligne["groupe"].'</OPTION>';
            }
      ?>
                              
                </div><!-- /.box-header -->
                <div class="box-body">
                  <table id="example1" class="table table-bordered table-striped">
 <thead>
                      <tr>
                        <th>Genre</th>
                        <th>Nom</th>
                        <th>Prénom</th>
                        <th>Enregistré</th>
                        <th>Groupe</th>                        
                      </tr>
                    </thead> <tbody>                 
                   
                   <?php

$sql = "SELECT id,id_etat,genre,nom,prenom,id_eta,etat,age,tel1,ville,mod_souhaite1,id_grp,groupe,id_groupe 
FROM `ny6dh_man_eleve` A, `ny6dh_man_groupe` B , `ny6dh_man_etat` C 
WHERE A.id_etat = 0 
AND A.mod_souhaite1 = 1 
AND B.id_grp = A.id_groupe
AND A.id_etat = C.id_eta";

$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
    
$id = $row["id"];

echo " <tr><td>". $row["genre"]."</td>
 			<td>". $row["nom"]."</td>
 			<td>". $row["prenom"]."</td>
 			<td><form method='post' action='traitement.php'><select name='".$id."' onChange='this.form.submit()'  class='form-control'>". $chaine."</select></td>  			
 			<td><select name='".$row["id"]."' onChange='this.form.submit()'  class='form-control'>".$chaine2."</select></form></td>
 			</tr> ";                   


    }
} else {
    echo "0 results";
}
$conn->close();
?>
                    </tbody>
                    <tfoot>
                      <tr>
                        <th>Genre</th>
                        <th>Nom</th>
                        <th>Prénom</th>
                        <th>Enregistré</th>
                        <th>Groupe</th>
                      </tr>
                    </tfoot>
                  </table>
                </div><!-- /.box-body -->
              </div><!-- /.box -->


Et pour le fichier traitement.php :


<?php
// on se connecte à notre base
$base = mysql_connect ('', '', '');
mysql_select_db ('', $base) ;

	// lancement de la requête
	$sql = 'INSERT INTO ny6dh_man_eleve values (".$_POST[" id_etat "].") WHERE id=".$_POST[" id "]."';

	// on exécute la requête (mysql_query) et on affiche un message au cas où la requête ne se passait pas bien (or die)
	mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());

	// on ferme la connexion à la base
	mysql_close();

?>


En fouillant un peut j'étais tombé sur ce bout de code onChange='this.form.submit() car je n'arrivais pas à ajouter un bouton valider mais cette méthode est beaucoup trop lourde donc si vous pouvez m'aider à :
_ ajouter un bouton submit pour l'intégralité du tableau
_ pouvoir mettre à jour mes données

D'avance merci
Modifié par Owenn (11 Oct 2015 - 10:51)
Bonsoir,

Je sais pas si j'ai compris ta question. Mais, d'après ce que j'ai compris, tu cherches à récupérer les valeurs de tes deux selects (etat et groupe).
Le problème c'est qu'il y a une confusion dans ton code.
Tu met un name à <option value=""></option> . Or, le name doit ce situer dans ton select. De cette façon :

<select name="id_etat">
 <option value="'.$ligne["id_eta"].'">'.$ligne["etat"].'</option>
 <option value=""></option>
</select>


Et dans ton post tu récupères à ce moment-là $_POST['id_etat'] .

Là de ce que je vois, tu écris :
<OPTION  NAME= "id_etat" VALUE="'.$ligne["id_eta"].'">'.$ligne["etat"].'</OPTION>


Or, il n'y pas de name dans le option, seulement une value . C'est pour ça que lorsque tu fais ton insertion ça ne fonctionne pas.

Donc il te faut modifier dans ton code les deux select id_etat et id_groupe en conséquence. Et ajouter simplement un boutton submit
<input type="submit" name="envoie" value="Envoyer">


Et contrôler le submit :

if(isset($_POST['envoie']){
// tu met ton traitement sur les données que tu reçois de ton formulaire
}else{
 echo 'erreur';
}

Accessoirement lorsque tu butes sur un problème comme ça, tu peux t'aider du var_dump, qui te permet de voir ou tu en est, et ce que tu fais au juste.

Par exemple dans ton traitement au tout début tu peux ajouter :
var_dump($_POST);

Et là tu vas très vite voir ce que tu reçois et ce que tu ne reçoit pas, c'est une bonne piste pour te dépanner.

Deuxième point, tu nous as envoyé un code avec mysql - seul problème, il est devenu obsolète. Aujourd'hui on utilise PDO. Si tu débute, je te conseille vivement de te tourner vers PDO, pour apprendre les bonnes bases dès le début. Même si ça peut sembler plus compliquer, tu verras qu'en réalité c'est toujours la même chose.

Link : ce lien te permettra d'y voir plus clair avec PDO : http://forum.wdmedia-hebergement.net/viewtopic.php?id=1451 . Il y a d'autres site de cours bien entendu mais là, tu es vraiment dans du concret.
Modifié par J_B (11 Oct 2015 - 23:32)
Merci pour cette réponse...par contre pour "obsolète " dois je obligatoirement tout changer ou le code fonctionnera quand même ?
Pour ce qui est du name incrusté dans le select et le option, pour moi je dois récupérer l'id de la ligne et l'id état...mais là avec cette écriture comment récupére t on l'id?
Par ailleurs à quel endroit placer le bouton select car j'ai testé plusieurs endroits mais sans succès....merci
D'après les recherches, le pdo est plus ergonomique que le mysql mais cela m'arrangerais de régler cette histoire d'envoi de données et ensuite mettre à jour mon mode de connexion à la BDD.

Donc par rapport à la proposition reçu, j'ai du mal à comprendre:
_ Où récupére t on l'id de la ligne
_ à quel endroit exact mettre le bouton valider ?

Mercii
Enlève les name de tes options, tu n'en a pas besoin.
Tu recupère les valeurs de tes select grace au name de la balise select. Comme je te l'ai expliquer dans mon précédent message. Si tu ne comprend pas, met ce code sur une page vierge et observe

<html>
	<body>
<?php
	if(isset($_POST['envoyer'])){
		var_dump($_POST);
		echo 'Value de ton select : '.$_POST['select'];
	}
?>
		<form action="" method="POST">
			<select name="select">
				<option value="1">Ma value 1</option>
				<option value="2">Ma value 2</option>
				<option value="3">Ma value 3</option>
			</select>
			<input type="submit" name="envoyer" value="Envoyer">
		</form>
	</body>
</html>


Pour ton input tu dois le mettre juste avant la fermeture de ton form :

<td><input type="submit" name="envoyer" value="Enregistrer"></td></form>

Modifié par J_B (12 Oct 2015 - 14:19)
Merci pour cet exemple !
Par contre je but toujours sur le "comment récupérer l'id " car dans l'exemple on récupère l'array mais mon id est propre à ma table
Je crois que je viens de percuter.
Tu as trois id :
id => celui de la personne dans ta table
id_etat => etat relatif à la personne
id_groupe => groupe auquel appartient la personne

Depuis le début je pensais que tu voulais récupérer id_etat et id_groupe puisque tu parlais de ces deux-là. Mais là je me demande si en fait il ne s'agit pas du premier id.
Si c'est ça, tu peux rajouter un <input type="hidden" name="id"> dans ton form et passer ton id dedans. Et tu le récupère avec $_POST['id'] ;

Sinon, désolée mais va falloir m'éclairer.
Oui désolé c'est vrai que je ne suis pas clair...donc effectivement j'ai un id pour la personne, un id etat et un id groupe.

Donc mon but est de pouvoir changer pour chaque ligne, ayant un id issu de ma table:
_ l'état (Enregistré ou non): id_etat
_ le groupe: id_grp
Par contre pour la partie: <input type="hidden" name="id">

L'id est donc une variable? Ne dois je pas l'écrire de la sorte?('..') et la déclarer?
Bon,

J'ai repris une partie de ton code, mis tes requete en PDO, il faudra quand même que tu fasses la connexion en PDO, tu as des modèles partout :


//Ici tes deux requetes pour aller chercher les etats et groupes dans ta bdd
$etat = $DB->query("SELECT id_eta, etat FROM ny6dh_man_etat")->fetchAll();
$groupe = $DB->query("SELECT id_grp, groupe FROM ny6dh_man_groupe")->fetchAll();

//on initialises les variables qui vont contenir les data de etat et groupe
$option_etat = $option_groupe = '';
foreach($etat as $value){
	$option_etat .= '<option value="'.$value['id_eta'].'">'.$value['etat'].'</option>';
}

foreach($groupe as $value){
	$option_groupe .= '<option value="'.$value['id_group'].'">1-'.$value['groupe'].'</option>';
}


Ensuite pour ton tableau, je reprend pas la partie HTML, je te laisse le soin de l'ajouter.
Je pars du principe que ta requete est bonne.
En PDO donc on a :


		<table id="example1" class="table table-bordered table-striped">
			<thead>
				<tr>
					<th>Enregistré</th>
					<th>Groupe</th>				              
				</tr>
			</thead>
			<tbody>
<?php
$data = $DB->query("SELECT ....")->fetchAll();

//on créer le tableau - 
foreach($data as $value){
       $idPersonne  = $data['id'];
       echo ' <tr>
			<form method="POST" action="traitement.php">
			<td>				
				<select name="etat" class="form-control">'. $option_etat.'</select>
			</td>  			
 			<td>
				<select name="groupe" class="form-control">'.$option_groupe.'</select>
			</td>
			<td>
				<input type="hidden" name="Personne" value="'.$idPersonne.'">
				<input type="submit" name="Envoyer" value="Valider">
			</td>
			
 			</form>
		</tr>
		'; 
}
?>
			</tbody>
	</table>
</div> 

Ici attention à bien respecter l'emplacement de tes balises <form> .
Soit tu fais un formulaire par ligne (ce que j'ai fait ici), soit tu fais un formulaire pour le tableau complet mais dans cas chaque submit doit avoir un nom différent généré avec ton id, ou un count.

Enfin dans ton fichier traitement.php tu met ça, tu récupères les trois id. A toi de jouer pour la suite du traitement.

if(isset($_POST['Envoyer'])){
	var_dump($_POST);
	$etat = $_POST['etat'];
	$groupe= $_POST['groupe'];
	$personne= $_POST['Personne'];
}


Voilà, j'ai testé chez moi ça fonctionne très bien. Te reste plus qu'à implémenter tout ça au bon endroit.
PS : j'ai pris la liberté de modifier tes noms de variable pour éviter les confusions et faire en sorte que ce soit beaucoup plus parlant.
Modifié par J_B (16 Oct 2015 - 16:47)
Bonjour merci de ton aide !!!!
Par contre si j'ai bien compris (je n'ai pas encore pu coder)

_ je dois changer ma connexion pour ce format :
<?php       
$pdo = new PDO('mysql:host=localhost;dbname=votre_base', 'utilisateur', 'mot_de_passe');       
?>


Par contre pour dbname il ne manque pas une quote après le = ? Et pour la fermeture de la connexion ?

_ lorsque j'affiche mon tableau, je dois également déclarer mes variables pour les champs non,prenom,...sous la forme $idPersonne = $data['id']; ?

_ dans mon fichier traitement.php, est-ce que la syntaxe est correcte si je mets à la suite de ton code:
$sql = 'UPDATE ny6dh_man_eleve values ("'.$value['id_group'].'", "'.$value['id_eta'].'") WHERE id= "'.$idPersonne.'" ';


Je suis sûr qu'il y a un pb de quote
Modifié par Owenn (13 Oct 2015 - 17:06)
Owenn a écrit :
Bonjour merci de ton aide !!!!
Par contre si j'ai bien compris (je n'ai pas encore pu coder)

_ je dois changer ma connexion pour ce format :
&lt;?php       
$pdo = new PDO('mysql:host=localhost;dbname=votre_base', 'utilisateur', 'mot_de_passe');       
?&gt;


Tout a fais !

Par contre pour dbname il ne manque pas une quote après le = ? non Et pour la fermeture de la connexion ?C'est le principe de PDO, tu cloture pas la connexion, mais la requête closeCursor();

_ dans mon fichier traitement.php, est-ce que la syntaxe est correcte si je mets à la suite de ton code:
$sql = 'UPDATE ny6dh_man_eleve values ("'.$value['id_group'].'", "'.$value['id_eta'].'") WHERE id= "'.$idPersonne.'" ';


Je suis sûr qu'il y a un pb de quote

je reprend le message de Safina sur un autre sujet concernant les quotes, le principe reste le même seul le contenu est différent dans l'exemple


$r = "<input type='checkbox' class='checkbox' id='$id' name='$id'>";// OK
$r = "<input type='checkbox' class='checkbox' id='".$id."' name='".$id."'>";// OK
$r = '<input type="checkbox" class="checkbox" id="'.$id.'" name="'.$id.'">';// OK - Best practice
$r = '<input type="checkbox" class="checkbox" id="$id" name="$id">';// ERROR $id n'est pas interprété
$r = <<<XXX
<input type="checkbox" class="checkbox" id="$id" name="$id">
XXX;// OK
$r = "<input type='checkbox' class='checkbox' id='{$id}' name='{$id}'>";//OK


Modifié par JENCAL (13 Oct 2015 - 17:36)
_ lorsque j'affiche mon tableau, je dois également déclarer mes variables pour les champs non,prenom,...sous la forme $idPersonne = $data['id']; ?

=> Non, tu peux directement ecrire $data['nom'], $data['prenom'] et même $data['id']. C'est juste pour lisibilité du code et l'écriture. C'est plus facile de trimbaler $idPersonne que $data['id'].
Merci JENCAL !
Par contre pour la dernière question mon update ne devrait il pas être plutôt de la forme

$sql = 'UPDATE ny6dh_man_eleve values ("'$etat'", "'$groupe'") WHERE id= "'$idPersonne'" ';

au lieu de

$sql = 'UPDATE ny6dh_man_eleve values ("'.$value['id_group'].'", "'.$value['id_eta'].'") WHERE id= "'.$idPersonne.'" ';


??
Oui effectivement dans ta requête tu récupère les info envoyé en post. Donc les variables que je t'avais mentionnées qui sont bien $etat, $groupe et $idPersonne.
Donc......je me suis jeté à l'eau et....plouf! page vide
J'ai tout contrôlé mais n'y vois rien de suspect, j'ai tout respecté (selon moi) à la lettre, voici le code en entier :


              <div class="box">
                <div class="box-header">
                
                <h3 class="box-title">DataTable With Fu Features</h3>    


<?php       
$DB = new PDO('mysql:host=[b]xxxxxx[/b];dbname=[b]xxxx[/b]', '[b]xxx[/b]', '[b]xxx[/b]');       


//Ici tes deux requetes pour aller chercher les etats et groupes dans ta bdd
$etat = $DB->query("SELECT id_eta,etat FROM `ny6dh_man_etat`")->fetchAll();
$groupe = $DB->query("SELECT id_grp,groupe FROM `ny6dh_man_groupe`")->fetchAll();

//on initialises les variables qui vont contenir les data de etat et groupe
$option_etat = $option_groupe = '';
foreach($etat as $value){
	$option_etat .= '<option value="'.$value['id_eta'].'">'.$value['etat'].'</option>';
}

foreach($groupe as $value){
	$option_groupe .= '<option value="'.$value['id_group'].'">1-'.$value['groupe'].'</option>';
}
?>

                              
                </div><!-- /.box-header -->
                <div class="box-body">
                  <table id="example1" class="table table-bordered table-striped">
 <thead>
                      <tr>
                        <th>Genre</th>
                        <th>Nom</th>
                        <th>Prénom</th>
                        <th>Enregistré</th>
                        <th>Groupe</th>                        
                      </tr>
                    </thead> <tbody>  

                 
<?php
$data = query("SELECT id,id_etat,genre,nom,prenom,id_eta,etat,age,tel1,ville,mod_souhaite1,id_grp,groupe,id_groupe 
FROM `ny6dh_man_eleve` A, `ny6dh_man_groupe` B , `ny6dh_man_etat` C 
WHERE A.id_etat = 0 
AND A.mod_souhaite1 = 1 
AND B.id_grp = A.id_groupe
AND A.id_etat = C.id_eta")->fetchAll();

//on créer le tableau - 
foreach($data as $value){
       $idPersonne  = $data['id'];
       echo " <tr>
			<form method="POST" action="traitement.php">
			<td>'. $data['nom'].'</td>
			<td>'. $data['prenom'].'</td>
			<td>				
				<select name="etat" class="form-control">'. $option_etat.'</select>
			</td>  			
 			<td>
				<select name="groupe" class="form-control">'.$option_groupe.'</select>
			</td>
			<td>
				<input type="hidden" name="Personne" value="'.$idPersonne.'">
				<input type="submit" name="Envoyer" value="Valider">
			</td>
			
 			</form>
		</tr>
		"; 
}
closeCursor();
?>

                  </tbody>
                    <tfoot>
                      <tr>
                        <th>Genre</th>
                        <th>Nom</th>
                        <th>Prénom</th>
                        <th>Enregistré</th>
                        <th>Groupe</th>
                      </tr>
                    </tfoot>
                  </table>
                </div><!-- /.box-body -->
              </div><!-- /.box -->
Tu as un problème de quote sur ton echo, entouré de simple quote et pas double. :

Voici ton echo remis tel que je te l'avais écris plus haut:

 echo ' <tr>
			<form method="POST" action="traitement.php">
			<td>'. $data['nom'].'</td>
			<td>'. $data['prenom'].'</td>
			<td>				
				<select name="etat" class="form-control">'. $option_etat.'</select>
			</td>  			
 			<td>
				<select name="groupe" class="form-control">'.$option_groupe.'</select>
			</td>
			<td>
				<input type="hidden" name="Personne" value="'.$idPersonne.'">
				<input type="submit" name="Envoyer" value="Valider">
			</td>
			
 			</form>
		</tr>
		'; 

Modifié par J_B (13 Oct 2015 - 21:52)
Bonjour...merci, effectivement j'ai fait cette modif je ne sais vraiment pas pourquoi...par contre là maintenant l'affichage s'arrête à l'en-tête du tableau donc ça doit être un pb au niveau du PHP mais où ?telle est la question
Oui autant pour moi c'est pas $data mais $value ..

 
$idPersonne  = $value['id'];
echo ' <tr>
			<form method="POST" action="traitement.php">
			<td>'. $value['nom'].'</td>
			<td>'. $value['prenom'].'</td>
			<td>				
				<select name="etat" class="form-control">'. $option_etat.'</select>
			</td>  			
 			<td>
				<select name="groupe" class="form-control">'.$option_groupe.'</select>
			</td>
			<td>
				<input type="hidden" name="Personne" value="'.$idPersonne.'">
				<input type="submit" name="Envoyer" value="Valider">
			</td>
			
 			</form>
		</tr>
		'; 
Pages :