Page 1 sur 1

Insert dans une table avec un While

Posté : 31 mars 2009, 18:50
par remy42
Le sujet peut parraitre compliquer mais je ne savais pas comment l'expliquer :)

Alors en fait je suis toujours sur mon projet d'intranet de gestion d'absence.

Pour expliquer brievement j'ai une base avec des tables : CLASSES, ELEVES, ABSENCES

J'ai une page : ajoutabsence.php

dedans il y a un une liste avec les "classes", ont choisis la classe on valide et la un tableau contenant tous les eleves de classe apparait

				<?php 
					// Si nom de classe n'est pas vide alors....
					if (isset ($_POST["nom_classe"]))
						{ 
						$affichage_eleves = "SELECT eleves.* from classe , eleves where classe.numclasse=eleves.classe_numclasse and classe.numclasse=".$_REQUEST['nom_classe'];  
						$resultaffich_eleves = mysql_query($affichage_eleves); 
				
							while ($ligne = mysql_fetch_array($resultaffich_eleves))  
							{ 
								echo '<tr>';
								echo '<td bgcolor="#CCCCCC">'.$ligne["nomeleve"].'</td>';
								echo '<td bgcolor="#CCCCCC">'.$ligne["prenomeleve"].'</td>';
								echo '<td bgcolor="#CCCCCC">'.$ligne["anneenaissance"].'</td>';
								// Mise en place d'une Quatrieme colonne "checkbox" pour cocher les absents.
																
								// TEST DU 31 03 09 ajout justification
								echo "<td><select name='booljustif'><option value='oui'>Oui</option><option value='non'>Non</option></select>";   
                                echo "<td><input type='text' value=''  name='justification' size='10'></td>";
                                echo "<td><input type='checkbox' name='check_numeleve_abs[]' value='".$ligne['numeleve']."'></td>";

								// FIN TEST 31 03 09 ajout justification
								
								echo '</tr>'."\n";
	  						} 
						
						}  
						//.... Sinon 
						else {echo "Veuillez choisir votre classe";}
				?>
Au debut il y avait 4 colonnes : nom , prénom , annenaissance , cocher si absent
Ca marchait nikel. J'ai voulu rajouter deux colone "JUSTIFIE ( oui ou non )" et la JUSTIFICATION ( le motif)

Cependant quand je valide et j'insere mes données dans la base ça me garde que la derniere valeur du tableau pour "justification" et "Motif" du tableau.

Voici le code de la page ajoutabsences2.php qui gere l'insertion

<?php
	echo $eleveabsent;
			echo $valabs;
			echo $booljustif;
			echo $justification;
			
			
			
			
			foreach ($eleveabsent as $valabs)
			{
			// REQUETE SQL : Permettant d'inserer l'absence dans la base avec les données récolter auparavant
	$sql = "INSERT  INTO absences (dateabs,heuredebut,heurefin,booljustif,justification,numeleve,classe_numclasse)
            VALUES ('$datedujour', '$heuredebut', '$heurefin','$booljustif','$justification','$valabs', '$nom_classe_tampon') " ;
		
			// Exécution de la requęte SQL:
	$requete = mysql_query($sql) or die( mysql_error() ) ;
			}
  // Affichage des résultats, pour savoir si l'insertion a marchée:
		if($requete)
			{
			echo("L'insertion a été correctement effectuée") ;
			}
				else
				{
				echo("L'insertion ŕ échouée") ;
				}
			
		}
	
		
?> 
Un peu long mais j'espere que c'est clair :)

Merci d'avance pour vos réponse car je n'arrive pas a trouver d'ou ca vient meme si je pense que c'est un probleme de boucle qui se fait mal.

Posté : 31 mars 2009, 18:58
par Ryle
Si tu ne mets pas de crochets dans le nom des champs de ton formulaire, ils ne sont pas considérés comme des tableaux, et la dernière valeur viendra écraser toute les autres :
- name='justification[]' au lieu de name='justification' , idem pour booljustif :)

Posté : 31 mars 2009, 19:08
par remy42
Merci pour l'info ca m'a pas sauter au yeux. Je viens d'essayer cependant il y a toujours un problème :)

Au dessus de mon FOREACH j'ai mis 3 echo des variables principales

echo $eleveabsent;
echo $booljustif;
echo $justification;
Les trois me retourne comme valeur: Array

Dans ma base pour booljustif j'ai "Arr" normal j'ai limiter a trois caractere (oui ou non)
Et dans le champ justification j'ai : Array

J'ai vu que mon
echo $eleveabsent; 
au dessus de FOREACH me retourne array et une fois passer dans le Foreach $eleveabsent as $valabs et bien $valabs contient bien la valeur de la clé primaire de $eleveabsent.

Je pense que c'est pour cela que ca marche pas car le foreach s'applique que sur 1 seul champ non ??


Merci en tout cas pour ton aide

Posté : 31 mars 2009, 21:21
par thehawk
* a ta place je n'opererer pas de cette façon mais plutot :
for ($i=0 ; $i<count($eleveabsent) -1 ; $i++)
{
echo "Je m'appel ".$eleveabsent[$i]." ma justification est ".$justification[$i]."<br>";

}
normalment ca devrait te mettre sur la voie

* en sachant notament qu'avec foreach cela aurait marché en faisant :
foreach ($eleveabsent as $key => $value)
{
echo "Je m'appel ".$eleveabsent[$key]." ma justification est ".$justification[$key]."<br>"; // a la place de $eleveabsent[$key] , $value aurait marché
}

Voila mon avis :)

Possible que cela ne correspondent pas (notamment au niveau des noms de variables) , en tout cas cela peut te mettre sur la une voie

Bye Hawk

Posté : 31 mars 2009, 21:55
par remy42
Encore un petit probleme. Je pense que ce n'est pas très grave sinon en gros ca marche merci beaucoup.

Lorsque j'insert mes absences si le premier eleve n'est pas cocher dans mon tableau comme "absent" alors ca decale tout lors de mes insertions dans ma base.

Voici l'interface pour vous aider
Image

Dans ce cas la ca devrait inserer deux ligne dans ma table absences sous forme de :

richioud florent 1986 non "vide"
angenieux loic 1986 oui "permis"

Et pourtant ca insere en decaler :

richioud florent 986 oui malade
angenieux loic 1986 non

En regardant le screenshot on voit que c'est decaler. Pourquoi je n'arrive pas a comprendre.

VOici mon while ( mon tableau ) :
while ($ligne = mysql_fetch_array($resultaffich_eleves))  
							{ 
								echo '<tr>';
								echo '<td bgcolor="#CCCCCC">'.$ligne["nomeleve"].'</td>';
								echo '<td bgcolor="#CCCCCC">'.$ligne["prenomeleve"].'</td>';
								echo '<td bgcolor="#CCCCCC">'.$ligne["anneenaissance"].'</td>';
								// Mise en place d'une Quatrieme colonne "checkbox" pour cocher les absents.
																
								// Modification DU 31 03 09 ajout justification
								echo "<td><select name='booljustif[]'><option value='oui'>Oui</option><option value='non'>Non</option></select>";   
                                echo "<td><input type='text' value=''  name='justification[]' size='10'></td>";
                                echo "<td><input type='checkbox' name='check_numeleve_abs[]' value='".$ligne['numeleve']."'></td>";
								// FIN Modification 31 03 09 ajout justification
								
								echo '</tr>'."\n";
	  						} 

Voici le bout de code pour ceux que ca pourrait aidé au niveau de la requete.
foreach ($eleveabsent as $key => $value)
			{
			// REQUETE SQL : Permettant d'inserer l'absence dans la base avec les données récolter auparavant
	$sql = "INSERT  INTO absences (dateabs,heuredebut,heurefin,booljustif,justification,numeleve,classe_numclasse)
            VALUES ('$datedujour', '$heuredebut', '$heurefin','$booljustif[$key]','$justification[$key]','$value', '$nom_classe_tampon') " ;

Il y a surment mieux niveau optimisation mais la je vais faire le fonctionnel et apres je retoucherai tout ca :)
[/php]

Posté : 02 avr. 2009, 14:17
par texghor
Merci d'avoir exposé une partie de ta solution cela m'a servi et eviter de crée un sujet inutilement.
Je le souligne car beaucoup lorsqu'il ont la solution ne revienne pas sur le forum.

A bientôt

Posté : 06 avr. 2009, 19:54
par remy42
Bah de rien si ce peut servir.

Personne n'as d'idée car j'ai tjrs de probleme de decalage lors de l'insertion

Merci d'avance

Posté : 06 avr. 2009, 21:21
par thehawk
Tu appel quoi décaler ?

Posté : 07 avr. 2009, 01:31
par Nours312
en règle général pour ce genre de table, je force les parametres :


echo "<td><select name='booljustif[]'><option value='oui'>Oui</option><option value='non'>Non</option></select>";
echo "<td><input type='text' value='' name='justification[]' size='10'></td>";
echo "<td><input type='checkbox' name='check_numeleve_abs[]' value='".$ligne['numeleve']."'></td>";


Soit en mettant : justification[$id_eleve] // ou id row, ou ce que tu veux du moment que les id soit les memes pour tout la ligne ...

Soit : "'justification_'.$id_row.'"

Ainsi, je n'est jamais de problème avec une variable Vide qui n'est pas uploadée et "décalesé les cles de toutes les variables ...

@+

Posté : 07 avr. 2009, 07:33
par thehawk
A okay je vois le décalé ... dur hier soir :)


Je plussoie Nours , pour récuperer tes variables tu peux proceder ainsi :
foreach ($_POST as $key => $value)

{
list($action , $id) = explode ("_" , $key);

switch ($action) {
case "justification" :
// Traitement 
break;
// ETC
default :
...
break;
}
}
ceci est un exemple ;)

Posté : 10 avr. 2009, 23:16
par remy42
Merci pour votre aide

J'ai essayer la 1 ere methode en faisant cela
echo "<td><select name='booljustif[$numeleve]'><option value='oui'>Oui</option><option value='non'>Non</option></select>";   
                                echo "<td><input type='text' value=''  name='justification[$numeleve]' size='10'></td>";
                                echo "<td><input type='checkbox' name='check_numeleve_abs[]' value='".$ligne['numeleve']."'></td>";
Sans succès

La deuxieme méthode j'ai pas trop compris le principe avec le switch $action etc
Je n'arrive pas a l'appliquer dans mon cas :S

Posté : 14 avr. 2009, 21:44
par remy42
Aidez moi svp je suis dans le caca :)

Il faut que je valide cette insertion avant de pouvoir me projeter.

Posté : 16 avr. 2009, 20:16
par fraktz87
Et si tu tentait deux boucles independantes ?