Affichage enregistrements et update

WRInaute discret
Salut les gars,

Voici mon problème. J'ai une page qui sert à afficher des enregistrements de ma bdd dans un formulaire html, et une autre page qui sert à faire un UPDATE de ces données.
La première page commence avec une liste déroulante html qui me permet de savoir ce qu'il faut afficher. En fonction de ce choix, je préremplis mon formulaire html. En dessous de cette première page j'ai un bouton qui me permet d'enregistrer les modifications. Ce bouton renvoi vers ma deuxième pahe qui est en gros une reuqete SQL d'UPDATE.

Lorsque je sélectionne une OPTION dans ma liste déroulante, l'affichage est impecable. Mais lorsque je clique sur le bouton "Enregistrer les modifications", il m'actualise la page et c'est LA qu'il y a un problème. il prend en compte les mofication dans le premier champ ANNEE mais pas dans le champ COUPLE MOIS (ex: Janvier/Fevrier).




Ma page d'affichage des données grâce à la liste déroulante :

Code:
<?php
include_once 'fonctions.php';
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
          <head>
          <meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
		  <link rel="stylesheet" type="text/css" href="styles_club.css" />
          </head>
          <body>
<form method="post">
    <select name="mon_champ">
        <option>Janvier/Fevrier</option>
        <option>Fevrier/Mars</option>
        <option>Mars/Avril</option>
    </select>
    <input type="submit" value="OK"/>
</form>
	  
<?php

if (isset($_POST['mon_champ'])){

$mon_champ=$_POST['mon_champ'];

}
else
{
$mon_champ="Janvier/Fevrier";
}

		 
//connexion BDD 
connexion_DB('bd_club');

// REQUETE SQL 
$res2 = mysql_query('SELECT * FROM activites WHERE couple_mois="'.$mon_champ.'"');

print '<form method="POST" action=check3.php>';

//boucle 

$cpt=0;
while($row2 = mysql_fetch_array($res2))
{
$cpt++;

$annee=$row2['annee'];
$couple_mois=$row2['couple_mois'];

//affichage enregistrements
print "<input type='hidden' name='cpt' size='1' value='$cpt'></input>";// pour pouvoir récupérer la valeur de cpt pour savoir le nbr d'itérations.
print "<input type='text' name= 'annee".$cpt."' size='5' value='$annee'></input>";
print "<input type='text' name= 'couple_mois".$cpt."' size='10' value='$couple_mois'></input>";



echo "<br />";
 }
echo "<br />";
print '<div align="center"><input type="submit" name="envoie" VALUE="Enregistrer les modifications"></div>';
print '</form>';
echo $cpt;

mysql_close();
?>
		  
		  </body>
		  
		  
		  </html>


Ma page de mise à jour :

Code:
<?php
include_once 'fonctions.php';

connexion_DB('bd_club');

if (isset($_POST['annee'])&&($_POST['couple_mois'])&&($_POST['cpt'])){

$annee=$_POST['annee'];
$couple_mois=$_POST['couple_mois'];

}



$essai=$_POST['cpt'];
echo $essai;

for($i=1; $i<$essai+1;$i++){

$VarDynAnnee='annee'.$i;
$VarDynCouple='couple_mois'.$i;


$sql = "UPDATE activites SET annee = '".$_POST[$VarDynAnnee]."',couple_mois = '".$_POST[$VarDynCouple]."'WHERE ID_ACTIV = '$i'"; 
 

 
echo "<br/>".$sql;

$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

}
		
?>



[/img]

[Edit HawkEye: titre modifié --> en minuscules]
 
WRInaute impliqué
hx.jonathan a dit:
Code:
if (isset($_POST['annee'])&&($_POST['couple_mois'])&&($_POST['cpt'])){

$annee=$_POST['annee'];
$couple_mois=$_POST['couple_mois'];

}
Dans ton formulaire, il n'y a aucun champ ayant comme nom "annee" et "couple_mois". Tu leur rajoutes tout le temps le $cpt après le nom:
hx.jonathan a dit:
Code:
print "<input type='text' name= 'annee".$cpt."' size='5' value='$annee'></input>";
print "<input type='text' name= 'couple_mois".$cpt."' size='10' value='$couple_mois'></input>";
 
WRInaute discret
Je mets $cpt car de cette manière je peux récupérer toutes les occurences de la boucle While.

Est-ce que je me trompe ??

Que me conseilles-tu ?
 
WRInaute impliqué
Ben tu fais comme tu veux, mais n'essaye pas de récupérer $_POST['annee'] dans ton script alors, puisque cette variable n'existera jamais.
 
WRInaute discret
Salut,

Ouais je crois que je vais faire comme tu me dis. Car là je commence à m'arracher les cheveux. Je suis pas du tou un expert en php donc j'ai besoin d'un bon coup de main.

Tu proposes donc que je fasse ceci :

Code:
$cpt=0;
while($row2 = mysql_fetch_array($res2))
{
$cpt++;
$ID_ACTIV=$row2['ID_ACTIV'];
$annee=$row2['annee'];


//affichage enregistrements
print "<input type='hidden' name='cpt' size='1' value='$cpt'></input>";// pour pouvoir récupérer la valeur de cpt pour savoir le nbr d'itérations.
print "<input type='hidden' name='idact[$cpt]' size='1' value='$ID_ACTIV'></input>";
print "<input type='text' name= 'annee[$cpt]' size='5' value='$annee'></input>";

C'est bien ça ?
 
WRInaute occasionnel
Exactement, du coup, tu as deux tableaux de données qui sont beaucoup plus faciles à gérer qu'un ensemble de variables à formes similaires...

edit:

par contre, j'ai vu que tu avais mis l'incrémentation du compteur avant donc ça veut dire que la numérotation ne commencera pas à 0 mais à 1

http://lv2.php.net/manual/fr/ref.array.php, ça peut toujours aider pour les tableaux...
 
WRInaute discret
Voilà je l'ai mis après.

Code:
$cpt=0;
while($row = mysql_fetch_array($res2))
{

$ID_ACTIV=$row['ID_ACTIV'];
$annee=$row['annee'];


//affichage enregistrements
print "<input type='hidden' name='cpt' size='1' value='$cpt'></input>";// pour pouvoir récupérer la valeur de cpt pour savoir le nbr d'itérations.
print "<input type='text' name='idact[$cpt]' size='1' value='$ID_ACTIV'></input>";
print "<input type='text' name= 'annee[$cpt]' size='5' value='$annee'></input>";
$cpt++;

echo "<br />";
 }
echo "<br />";
print '<div align="center"><input type="submit" name="envoie" VALUE="Enregistrer les modifications"></div>';
print '</form>';
echo $cpt;

mysql_close();

Ensuite comment puis-je exploiter ces infos tableau dans la page de mise à jour ?
 
WRInaute occasionnel
tu as d'une part un variable $_POST['annee'] ($_POST['annee'][0], ..., $_POST['annee'][n]).

que tu peux explorer en faisant une boucle :

$i=0;

while (isset($_POST['annee'][$i])) ou la boucle for avec pour limite $_POST['cpt']
{
faire l'UPDATE, tu peux de même récupérer dans $_POST['idact'][$i], la valeur qui correspond...
}
Code:
print "<input type='hidden' name='cpt' size='1' value='$cpt'></input>";// pour pouvoir récupérer la valeur de cpt pour savoir le nbr d'itérations.

mets-le après ton while dans la première page....

et à la réflexion la boucle for semble la mieux...
 
WRInaute discret
Voilà ce que j'ai fais :

page affichage :

Code:
connexion_DB('bd_club');


if (isset($_POST['annee'])){

$annee=$_POST['annee'];

echo $annee;
}


$cpt=$_POST['cpt'];


for($i=1; $i<$cpt;$i++){



$sql = "UPDATE activites SET annee = '"$"','"$"'WHERE ID_ACTIV = '$i'"; 


 
echo "<br/>".$sql;


}

Pour la page de mise à jour:

Code:
connexion_DB('bd_club');


if (isset($_POST['annee'])){

$annee=$_POST['annee'];

echo $annee;
}


$cpt=$_POST['cpt'];


for($i=1; $i<$cpt;$i++){



$sql = "UPDATE activites SET annee = '"$"','"$"'WHERE ID_ACTIV = '$i'"; 


 
echo "<br/>".$sql;


}

Qu'en penses-tu ?

Pour la requête UPDATE je ne sais pas trop.
Peux-tu vérifier les deux pages STP.

Merci pour ton aide. J'ai enfin l'impression de progresser.

John
 
WRInaute occasionnel
:D

Ca dépend de quel fuseau horaire on parle...

Cependant, je crois qu'il est bon que j'éclaircisse un point car, si je ne me trompe pas tu débutes en php...

La première page de formulaire était bonne, juste en mettant le total du compteur hors de la boucle et les variables $_POST n'existent pas sur la première page puisque c'est la validation du formulaire html qui les crée. Toutes les valeurs que tu souhaites récupérer doivent être des "input" du formulaire.

Ton shéma doit être celui ci :

Formulaire sur la première page comme tu l'avais fait précédement...

Tu envoies les infos au serveur avec le bouton submit de ton formulaire et tu lui demande un nouvelle page.

Dans cette nouvelle page, tu peux utiliser les données qui ont été postées par l'utilisateur à la page précédente.

Le script de ta deuxième page doit ressembler à ça :

Code:
connexion_DB('bd_club');


for ($i=0;$i<$_POST['cpt'];$i++)
{

$sql = "UPDATE activites SET annee = '".$_POST['annee'][$i]."' WHERE ID_ACTIV = '$i'";
}

Seulement, je ne comprends pas vraiment le shéma de ta base donc mon aide au niveau SQL n'est sans doute pas terrible.

Essaye de poster la shéma de ta base et de définir ta problématique avec une phrase simple.

style : "J'ai des clubs de foot qui ont joué certaines années, je veux faire un formulaire qui mette à jour les années durant lesquelles ils ont joué"...

Au début, tu parlais de couples de mois, tu as abandonné?
 
WRInaute discret
Ok je suis de retour.

Merci pour tes infos.

1) Je dois mettre le cpt++ dans la boucle quand même, non ? Je vois pas comment le compteur peut s'incrémenter alors ?

2)Voici le script de ma deuxième page :

Code:
<?php
include_once 'fonctions.php';

connexion_DB('bd_club');


if (isset($_POST['annee'])){

$annee=$_POST['annee'];

}

for($i=1; $i<$cpt=$_POST['cpt'];$i++){



$sql = "UPDATE activites SET annee = '".$_POST['annee'][$i]."' WHERE ID_ACTIV = '$i'"; 


 
echo "<br/>".$sql;


}

//header("Location:http://127.0.0.1/absence/index.php?page=04");

?>

Je constate qu'il n'enregistre pas mes modifications !! Pourtant voici le résultat de la requête :

Code:
UPDATE activites SET annee = '2008' WHERE ID_ACTIV = '1'
UPDATE activites SET annee = '2004' WHERE ID_ACTIV = '2'
UPDATE activites SET annee = '2008' WHERE ID_ACTIV = '3'
UPDATE activites SET annee = '2008' WHERE ID_ACTIV = '4'
UPDATE activites SET annee = '2008' WHERE ID_ACTIV = '5'
UPDATE activites SET annee = '2008' WHERE ID_ACTIV = '6'
UPDATE activites SET annee = '2007' WHERE ID_ACTIV = '7'


3) Je dois faire un site pour un club d'activités. J'ai juste une table avec:

Code:
ID_ACTIV 	CLE PRIMAIRE 	 
annee   	 
mois 	
couple_mois 	
num_jour 	
nom_jour 	
resume 
details 	 
autre
date_modif

BUT: qu'ils puissent afficher les activités qui sont organisées tous les mois par le club et mettre à jour ces activités. REM: les activités se font du 15 au 15 et non du 1 au 31 de chaque mois.

Pour ce qu'il y a à faire, je pensais faire une seule table.

Voilà tu sais tout :D
 
WRInaute occasionnel
J'étais en week end...

Pour l'observation 1) Il faut que tu mettes $ctp++; dans ta boucle

2)tu es connecté à la base mais tu ne lui ordonnes pas de faire ce que tu lui veux! Il faut que tu fasses un query avec ta requête (tu trouveras l'explication sur php.net)

3)Je pense que tu n'as jamais étudier les bases de données donc je vais te donner un conseil là dessus.

le mieux c'est de faire une table mois et une table activité que tu vas lier par la suite. De cette façon, tu notes quand commence les periodes d'activité (on va même dire que si ça passe par la suite sur une periode de 15 jours, tu n'auras rien à changer) et tu peux considérer qu'une activité peut être répeter sur un autre mois ou qu'il y a plusieurs activités chaque mois.

table tbl_mois (un nom avec un suffixe style tbl te permet de ne pas confondre les tables avec les champs):

id_mois (clef primaire)
date_debut (stocké en format int, temps unix)
date_fin (pareil)

tbl_activite:

id_activite (clef primaire)
resume
details
autre


tbl_acti_mois :

id_mois,id_activite
date_modif

exemple :

l'activité vélo se passe au mois de mars/avril 2007 et au mois de mai/juin 2008

tbl_activite
1
vélo
on fait du vélo
pensez à prendre votre selle

tbl_mois
1
(temps unix du 15 mars 2007)
(temps unix du 15 avril 2007)

2
(temps unix du 15 mai 2008)
(temps unix du 15 juin 2008)

tbl_acti_mois
1,1
(temps unix de la date de modif)

1,2
(temps unix de la date de modif)

http://www.php.net

doit te permettre de trouver plus ou moins tout ce que tu veux pour le php...

je t'avouerai que je gère beaucoup moins bien le SQL!

Bon courage
 
Discussions similaires
Haut