Page 1 sur 1

Mise à jour de données via un formulaire

Posté : 01 sept. 2009, 16:54
par Mikkle
Bonjour,

Le contexte :
Je créé une application me permettant d'enregistrer des missions dont l'objectif est d'analyser des fréquences. Pour une mission, il y a donc une ou plusieurs fréquences.
Lorsque je veux modifier les fréquences saisies, je les récupère dans la base de données avant d'effectuer les modifications. Voici le code utilisé pour cela :
<?php
require_once ('Connect.inc.php');

$menu="mission";

//Récupération des champs
if (isset($_POST['datedebut'])) $DateDebut=$_POST['datedebut'];
else $DateDebut="";

if (isset($_POST['datefin'])) $DateFin=$_POST['datefin'];
else $DateFin="";

if (isset($_POST['misnum'])) $MisNum=$_POST['misnum'];
else $MisNum="";

if (isset($_POST['operator'])) $Operator=$_POST['operator'];
else $Operator="";

if (isset($_POST['SD'])) $SD=$_POST['SD'];
else $SD="";

if (isset($_POST['tmis'])) $TMis=$_POST['tmis'];
else $TMis="";

$id = $_POST['id_mis'];

$sql_mis = "UPDATE mission SET num_mis='$MisNum', date_deb='$DateDebut', date_fin='$DateFin', type='$TMis', operateur='$Operator', sd='$SD' WHERE id_mis='$id'";
mysql_query($sql_mis) or die('Erreur SQL !'.$sql_mis.'<br>'.mysql_error());

$req = "INSERT INTO depot (var) VALUES ('$id')";
mysql_query($req) or die('Erreur SQL !'.$req.'<br>'.mysql_error());

$sql = "SELECT id_frq,frq_deb,frq_fin,frq_fixe,pas,filtre,modulation FROM frequences INNER JOIN depot ON frequences.id_mis = depot.var";
$qid = mysql_query($sql);

if (!$qid) die('Erreur SQL !'.mysql_error());

?>
<html>
<head>
</head>
<body>
<?php require_once "head.inc.php"; ?>
<center>
<h2>Modification des fréquences analysées</h2>
<form method="POST" action="maj_frq.php">
<?php
while($rows = mysql_fetch_object($qid))
{
?>
<table border="0" cellspacing="10" cellpadding="10">
<tr>
<td>
		<input type="text" name="id1" value="<?php echo $rows->id_frq ?>">
</td>
<td>
		<input type="text" name="fde1" value="<?php echo $rows->frq_deb ?>">
</td>
<td>
		<input type="text" name="ffi1" value="<?php echo $rows->frq_fin ?>">
</td>
<td>
		<input type="text" name="ffx1" value="<?php echo $rows->frq_fixe ?>">
</td>
<td>
		<select name="pas1">
		<?php
		$pas = $rows->pas;
		switch($pas)
		{
			case 5:?>
			<option selected value="5">5</option>
			<option value="10">10</option>
			<option value="12,5">12,5</option>
			<option value="25">25</option>
			<option value="50">50</option>
			<option value="100">100</option>
			<?php break;
			case 10:?>
			<option value="5">5</option>
			<option selected value="10">10</option>
			<option value="12,5">12,5</option>
			<option value="25">25</option>
			<option value="50">50</option>
			<option value="100">100</option>
			<?php break;
			case '12,5':?>
			<option value="5">5</option>
			<option value="10">10</option>
			<option selected value="12,5">12,5</option>
			<option value="25">25</option>
			<option value="50">50</option>
			<option value="100">100</option>
			<?php break;
			case 25:?>
			<option value="5">5</option>
			<option value="10">10</option>
			<option value="12,5">12,5</option>
			<option selected value="25">25</option>
			<option value="50">50</option>
			<option value="100">100</option>
			<?php break;
			case 50:?>
			<option value="5">5</option>
			<option value="10">10</option>
			<option value="12,5">12,5</option>
			<option value="25">25</option>
			<option selected value="50">50</option>
			<option value="100">100</option>
			<?php break;
			case 100:?>
			<option value="5">5</option>
			<option value="10">10</option>
			<option value="12,5">12,5</option>
			<option value="25">25</option>
			<option value="50">50</option>
			<option selected value="100">100</option>
			<?php break; } ?>
		</select>
		</td>
		<td>
		<select name="filtre1">
		<?php 
		$fl = $rows->filtre;
		switch($fl)
		{
			case 4:?>
			<option selected value="4">4</option>
			<option value="8">8</option>
			<option value="30">30</option>
			<option value="300">300</option>
			<?php break;
			case 8:?>
			<option value="4">4</option>
			<option selected value="8">8</option>
			<option value="30">30</option>
			<option value="300">300</option>
			<?php break;
			case 30:?>
			<option value="4">4</option>
			<option value="8">8</option>
			<option selected value="30">30</option>
			<option value="300">300</option>
			<?php break;
			case 300:?>
			<option value="4">4</option>
			<option value="8">8</option>
			<option value="30">30</option>
			<option selected value="300">300</option>
			<?php break; } ?>
		</select>
		</td>
		<td>
		<select name="modu1">
		<?php
		$mod = $rows->modulation;
		switch($mod)
		{
			case A3:?>
			<option selected value="A3">A3</option>
			<option value="F3">F3</option>
			<option value="G3">G3</option>
			<?php break;
			case F3:?>
			<option value="A3">A3</option>
			<option selected value="F3">F3</option>
			<option value="G3">G3</option>
			<?php break;
			case G3:?>
			<option value="A3">A3</option>
			<option value="F3">F3</option>
			<option selected value="G3">G3</option>
			<?php break; } ?>
		</select>
		</td>
		<?php } ?>
</tr>
</table>
<BR>
<table align="center">
	<tr>
	<td>
	<input type="submit" name="Valider" value="Valider">
	</td>
	<td></td>
	<td>
	<input type="reset" name="Annuler" value="Annuler">
	</td>
	</tr>
</table>
</form>
</center>
<?php require_once "footer.inc.php"; ?>
</body>
</html>
J'obtiens donc un formulaire dont le nombre de "champs" reste proportionnel au nombre de fréquences à afficher.

Le problème:
Comment mettre à jour des données qui se trouvent dans des champs de même nom pour chaque ligne. Je m'explique : si j'ai 3 fréquences à afficher, le premier champ de la première ligne s'appellera par exemple "fde1" et contiendra la fréquence "frq1". Le premier champ de la deuxième ligne s'appellera (automatiquement) "fde1" et contiendra la fréquence "frq2". Le premier champ de la troisième ligne s'appellera (automatiquement) "fde1" et contiendra la fréquence "frq3".
Je ne sais pas comment récupérer les fréquences obtenus car seul la dernière ligne saisie est prise en compte dans le traitement du formulaire (voir ci-dessous) :
<?php
require_once ('Connect.inc.php');

$menu="mission";

$id1=$_POST['id1'];
$fde1=$_POST['fde1'];
$ffi1=$_POST['ffi1'];
$ffx1=$_POST['ffx1'];
$pas1=$_POST['pas1'];
$fl1=$_POST['filtre1'];
$modu1=$_POST['modu1'];

$sql_mis = "UPDATE frequences SET frq_deb='$fde1', frq_fin='$ffi1', frq_fixe='$ffx1', pas='$pas1', filtre='$fl1', modulation='$modu1' WHERE id_frq='$id1'";
mysql_query($sql_mis) or die('Erreur SQL !'.$sql_mis.'<br>'.mysql_error());

$del = "DELETE FROM depot";
mysql_query($del) or die('Erreur SQL !'.$del.'<br>'.mysql_error());


?>
Merci d'avance pour votre aide car je suis vraiment bloqué.

Re: Mise à jour de données via un formulaire

Posté : 01 sept. 2009, 17:36
par Cobaye
Modération :
Afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

Re: Mise à jour de données via un formulaire

Posté : 01 sept. 2009, 18:17
par dunbar
Etant donner que ta requete UPDATE est en dehors de toute boucle c'est normal qu'il n'enregistre que la dernière valeur :wink:
Montre la structure des ta table stp

Re: Mise à jour de données via un formulaire

Posté : 02 sept. 2009, 09:54
par Mikkle
Bonjour,

Je ne sais pas comment extraire la structure de ma base pour l'afficher dans le message. Cependant, il me semble que ma description du problème manque de clarté.
En effet, la boucle while sert uniquement à lister les fréquences rattachées au numéro de mission. La modification intervient à postériori. C'est donc pour cela que la requête UPDATE ne doit pas être insérée dans la boucle.
Je ne vois pas comment distinguer des "cellules" d'un formulaire ayant un nom identique.
Peut-être faut il utiliser une boucle avec for pour les renommer mais je ne sais pas faire.

Merci pour ton message.

Re: Mise à jour de données via un formulaire

Posté : 02 sept. 2009, 12:12
par Babounet
Bonjour,

Il est impossible de récupérer le contenus de plusieurs champs différents si ceux-ci ont le même nom!

Tu es donc obligé de rendre tes champs uniques, par exemple en insérant l'ID de la fréquence dans la valeur de l'attribut name de ton champ.

Côté serveur tu devras boucler sur chacune de tes fréquences existantes pour les mettre à jour si elles ont été modifiées et sur les fréquences nouvellement créées pour les insérer dans ta base.

Pour la structure de ta table (qui serait en effet bienvenue) fait un export en SQL de ta table en passant par phpmyadmin.

Re: Mise à jour de données via un formulaire

Posté : 03 sept. 2009, 04:18
par AB
Alors toujours pas résolu ?

Pour illustrer ce qu'a dit Babounet tu pourrais donc les distinguer comme ceci

Code : Tout sélectionner

<input type="text" name="fde1[$rows->id_frq]" value="<?php echo $rows->frq_deb ?>">
ainsi tu obtiendras un tableau contenant les différentes valeurs.
Pour contrôler son contenu en phase de développement tu peux écrire dans ton code php :
if (isset($_POST['fde1']))
{
echo '<pre>';
print_r($_POST['fde1']);
echo '</pre>';
}
Parfois on laisse le tableau s'incrémenter automatiquement (name="fde1[]") mais dans ton cas mettre l'id de fréquence comme index est certainement plus adapté.