[résolu]Créer un tableau modifiable

Eléphanteau du PHP | 49 Messages

18 janv. 2011, 14:29

Bonjour,
Je débute complètement en php (j'ai démarré hier et lu un max de sites s'y rapportant) et j'essaye de faire un tableau que l'on peut modifier à la volée.
J'entends par là qu'on a une base mySQL avec des identifiants et des CA, que cette base est affichée sur le site en php (jusque là ça va) et qu'ensuite l'utilisateur peut modifier une valeur du tableau (seulement la case CA, l'id ne changera jamais) en cliquant dessus et en entrant une nouvelle valeur.

J'ai fait un premier essai pour me familiariser avec les commandes: le tableau s'affiche et l'utilisateur entre l'id du CA qu'il veut modifier et la nouvelle valeur. Il peut ensuite confirmer ou annuler son changement. A la confirmation la table est mise à jour sur l'instant.
<html>
	<head>
		<title> Test formulaire gauche</title>
	</head>
	<body>	
		<link rel="STYLESHEET" type="text/css" media="all" href="style.css"/>
	
		<div id="global">
		
			<div id="header"> 		
			<?php
				//On créé une fonction de connection à la base
				function connecttest_CA(){
					$base = mysql_connect ('localhost', 'root', '');  
					mysql_select_db ('test_ca', $base) ;
				}		
			?>
			</div>
	
	<!-- Menu fixe gauche (édition des règles de gestion) ##WIP## -->
			<div id="gauche">
				<h1>Edition</h1> 
				<p class="menu">Règles gestion</p>
				<!-- On créé un formulaire permettant d'éditer la table-->
				<form name="update" method="post" action="index.php?formulaire">
					<!-- L'utilisateur doit choisir quel ID il veut changer -->
					Entrez l'ID que vous voulez modifier : <input type="entier" name="id_CA" value=""/><br/>
					<!-- L'utilisateur entre le nouveau CA -->
					Entrez le CA corrigé correspondant : <input type="entier" name="CA" value=""/><br/>
					<!-- L'utilisateur peut confirmer ou annuler sa modification -->
					<input type="submit" name="valider" value="Valider"/>
					<input type="submit" name="reset" value="Reset"/>
				</form>
				<?php
					//Une fois que l'utilisateur a entré une modification, elle est récapitulée devant lui
					//et le changement a lieu immediatement
					if(isset($_POST['valider']))
					{
						$id_CA=floatval($_POST['id_CA']);
						//Les modifications s'affichent
						echo '<strong>Vous avez choisi de modifier : </strong><br />';
						echo '&#160&#160id: ';
						echo $id_CA;
						echo '<br/>';
						echo '&#160&#160Nouveau CA: ';
						$CA=floatval($_POST['CA']);
						echo $CA;
						echo '<br/>';
						//On se connecte à la base
						connecttest_CA();
						//On selectionne la table
						$sql = 'SELECT * FROM tableCA';
						$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
						//On sélectionne le CA correspondant à l'ID entrée et on l'update avec la valeur entrée
						$req = "UPDATE tableca SET CA='$CA' WHERE id_CA='$id_CA'";
						mysql_query($req) or die ('Erreur sur : '.$requete.'<br/>'.mysql_error());
						mysql_close ();
					}
				?>
			</div>
	<!-- Fin Menu fixe gauche -->

	<!-- Page_Principale -->
			<div id="page_principale">
				<br />
				<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableCA';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<table border=1 width=300 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td><center><strong>id</strong></center></td>';
					echo '<td><center><strong>CA</strong></center></td></tr>';
					while ($data = mysql_fetch_array($req)) { 
						echo '<tr><td>'.$data['id_CA'].'</td>'; 
						echo '<td align=right>'.$data['CA'].'</td></tr>';  
					}  
					echo '</table>';
					//On libère la mémoire mobilisée pour cette requête dans sql
					//$data de PHP lui est toujours accessible !
					mysql_free_result ($req);											
					//On ferme sql
					mysql_close ();
				?>
			</div>
	<!-- Fin Page_Principale -->
		</div>
	</body>
</html>
Cela fonctionne parfaitement, mais ce n'est pas le sujet. L'idée c'est d'avoir le tableau (qui peut faire des milliers de lignes) et de cliquer sur une seule case (ou sur une colonne "modifier" mais dans la ligne du sujet à modifier) pour pouvoir modifier le CA choisi.

J'ai tenté une deuxième approche, avec une seconde page form.php qui transformerait une case en formulaire permettant de modifier le CA.
INDEX:
<html>
	<head>
		<title>Test mod tableau clic</title>
	</head>
	<body>	
		<link rel="STYLESHEET" type="text/css" media="all" href="style.css"/>
	
		<div id="global">
		
			<div id="header"> 		
			<?php
				//On créé une fonction de connection à la base
				function connecttest_CA(){
					$base = mysql_connect ('localhost', 'root', '');  
					mysql_select_db ('test_ca', $base) ;
				}		
			?>
			</div>
	
	<!-- Menu fixe gauche (édition des règles de gestion) ##WIP## -->
			<div id="gauche">
				<h1>Edition</h1> 
				<p class="menu">Règles gestion</p>
				<form name="update" method="post" action="form.php">
					<p class="menu"><input type="submit" name="modifier" value="Modifier"/></p>
				</form>
				<!-- On créé un formulaire permettant d'éditer la table-->
			</div>
	<!-- Fin Menu fixe gauche -->

	<!-- Page_Principale -->
			<div id="page_principale">
				<br />
				<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableCA';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					$i=0; //on initialise l'index 
					while ($data = mysql_fetch_array($req)) { 
						echo '<tr><td align=center>'.$data['id_CA'].'</td>'; 
						echo '<td align=right>'.$data['CA'].'</td>';  
						$i++;// on incrémente l'index
					}
					echo '</table>';
					//On libère la mémoire mobilisée pour cette requête dans sql
					//$data de PHP lui est toujours accessible !
					mysql_free_result ($req);											
					//On ferme sql
					mysql_close ();
				?>
			</div>
	<!-- Fin Page_Principale -->
		</div>
	</body>
</html>
FORMULAIRE:
<html>
	<head>
		<title>Test mod tableau clic</title>
	</head>
	<body>	
		<link rel="STYLESHEET" type="text/css" media="all" href="style.css"/>
	
		<div id="global">
		
			<div id="header"> 		
			<?php
				//On créé une fonction de connection à la base
				function connecttest_CA(){
					$base = mysql_connect ('localhost', 'root', '');  
					mysql_select_db ('test_ca', $base) ;
				}		
			?>
			</div>
	
	<!-- Menu fixe gauche (édition des règles de gestion) ##WIP## -->
			<div id="gauche">
				<h1>Edition</h1> 
				<p class="menu">Règles gestion</p>
				<!-- On créé un formulaire permettant d'éditer la table-->
				<form name="update" method="post" action="index2.php">
					<p class="menu"><input type="submit" name="valider" value="Valider"/></p>
				</form>
			</div>
	<!-- Fin Menu fixe gauche -->

	<!-- Page_Principale -->
			<div id="page_principale">
				<br />
				<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableCA';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<form method="post">';
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					$i=1; //on initialise l'index 
					while ($data = mysql_fetch_array($req)) 
					{ 
						echo '<tr><td align=center>'.$data['id_CA'].'</td>';
						//On nomme chaque ligne avec l'id correspondant
						echo '<td align=right><input type="text" name="'.$i.'" value="'.$data['CA'].'"/></td></tr>'; 
						$i++; //On incrémente l'index
					}
					echo '</table>';
					//A la validation
					if(isset($_POST['valider']))
					{
						$i=1; //On réinitialise l'index
						while ($data = mysql_fetch_array($req))
						{
							//On cherche le CA pour chaque ID
							$req = "SELECT CA WHERE id_CA='$i'";
							mysql_query($req) or die ('Erreur sur : '.$requete.'<br/>'.mysql_error());
							//On converti le post en valeur numérique
							$CA=floatval($_POST['$i']);
							if ($data['CA'] != $CA) // On compare la valeur du tableau avec celle de la base
							{								
								//On sélectionne le CA correspondant à l'ID entrée et on l'update avec la valeur entrée
								$req = "UPDATE tableca SET CA='$CA' WHERE id_CA='$i'";
								mysql_query($req) or die ('Erreur sur : '.$requete.'<br/>'.mysql_error());
							}
							$i++; //On incrémente l'index
						}
					}
					//On libère la mémoire mobilisée
					mysql_free_result ($req);											
					//On ferme sql
					mysql_close ();
				?>
			</div>
	<!-- Fin Page_Principale -->
		</div>
	</body>
</html>
Sauf que là je bloque. Les changements ne sont pas pris en compte, la base SQL ne s'update pas.
Je ne suis pas encore dans le sujet (il faudrait qu'une seule case soit modifiable et non pas toute) mais je n'y suis pas arrivé non plus.

Comme mentionné plus haut, je débute complètement. Du coup j'imagine que mon code est rempli d'erreurs. J'essaye de commenter au maximum pour m'aider à comprendre et à savoir ce que je veux mais n'hésitez pas à me corriger.

Merci de votre aide,

--Simon
Modifié en dernier par diday le 18 janv. 2011, 17:37, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 janv. 2011, 15:00

salut,

je vois une erreur de syntaxe dans le dernier code : $_POST['$i'] n'existe pas, a la rigueur $_POST[$i]. Attention les variables ne sont pas interprétées quand elles sont dans une chaine de caractère entourée par des ' (tu aurais mis $_POST["$i"] cela aurais pu fonctionner).

ensuite la méthode utilisée n'est pas bonne car elle fait appelle au fait que le formulaire ne sera pas valider et ce n'est pas le cas (on ne peut pas être certain de ce qui est soumit).

Je pense que le plus simple est de mettre en nom du "input" l'id_ca de valider "en aveugle" le formulaire.

autre autre solution serait d'utiliser un champ caché contenant l'id et utiliser la notation tableau pour nommer les input (par exemple input type="text" name="ca[]" /><input type="hidden" name="id_ca[]" value="$id_ca" />) cela permet de récupérer deux tableaux (dans l'exemple $_POST['ca'] et $_POST['id_ca']) qui vont contenir les données modifées (quelques que soit le nombre modifiée).

si l'on souhaite que les modifications ne soient pas faite en masse il est possible de simplement mettre un lien vers une autre page en passant en paramètre l'id_ca dans le lien (autrepage.php?id_ca=428) ce qui permet de récupérer $_GET['id_ca'] (dans mon exemple) et de proposer une page de modification à partir de cela.


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 49 Messages

18 janv. 2011, 15:21

Merci pour la réponse rapide.

Je ne suis pas familier avec les input aveugles, du coup je suis un peu perdu.

Je tente ton "autre solution", obtenir deux tableaux. Je pense que la mise en place est correcte (je supprime la partie avec l'index et j'ajoute un input hidden contenant id_CA). Par contre je ne comprends pas comment mettre en place le code qui vérifiera ID par ID si les CA de la base sont différents avec les $_POST['CA']. Avec l'index je pouvais faire une incrémentation du $i, mais maintenant?
				<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableCA';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<form method="post">';
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					while ($data = mysql_fetch_array($req)) 
					{ 
						echo '<tr><td align=center>'.$data['id_CA'].'</td>';
						echo '<td align=right><input type="text" name="'.$data['CA'].'" value="'.$data['CA'].'"/>'; 
						echo '<input type="hidden" name="'.$data['id_CA'].'" value="'.$data['id_CA'].'"/></td></tr>'; 
					}
					echo '</table>';
					//A la validation
					if(isset($_POST['valider']))
					{
						//??
					}
					//On libère la mémoire mobilisée
					mysql_free_result ($req);											
					//On ferme sql
					mysql_close ();
				?>
Peut-être que je rate quelque chose de trivial mais je n'ai pas trouvé beaucoup de tuto (aucun, à vrai dire) sur la requête UPDATE avec des formulaires.

--edit: pour l'instant on va en rester à l'édition en masse. Même si elle ne respecte pas le cahier des charges je préfère comprendre chacun de mes problèmes plutôt que me contenter d'abandonner pour en trouver d'autres. :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 janv. 2011, 15:38

le traitement ce fait avec un foreach

par exemple
<?php
foreach($_POST['id_ca'] as $clef => $id_ca) {
$requete = 'update table set ca="'.mysql_real_escape_string($_POST['ca'][ $clef ]).'" where id_ca='.mysql_real_escape_string($id_ca);
mysql_query($requete);
}
?>
ceci est un exemple, il faut tester si le formulaire à été soumis et si les deux tableaux existe.


voila j’espère être clair mais je suis pas certain :/


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 49 Messages

18 janv. 2011, 15:52

Je commence à voir le truc. :)

La validation du formulaire fonctionne (j'ai tenté avec un simple "hello" si le formulaire est validé, ça marche) mais j'ai une erreur au niveau du foreach.

Code : Tout sélectionner

( ! ) Notice: Undefined index: id_CA in C:\wampServer2\www\Entrainement\form.php on line 55 Call Stack # Time Memory Function Location 1 0.0005 99192 {main}( ) ..\form.php:0 ( ! ) Warning: Invalid argument supplied for foreach() in C:\wampServer2\www\Entrainement\form.php on line 55 Call Stack # Time Memory Function Location 1 0.0005 99192 {main}( ) ..\form.php:0
Je reposte mon code au cas où.
<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableca';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<form method="post">';
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					while ($data = mysql_fetch_array($req)) 
					{ 
						echo '<tr><td align=center>'.$data['id_CA'].'</td>';
						echo '<td align=right><input type="text" name="'.$data['CA'].'" value="'.$data['CA'].'"/>'; 
						echo '<input type="hidden" name="'.$data['id_CA'].'" value="'.$data['id_CA'].'"/></td></tr>'; 
					}
					echo '</table>';
					//A la validation
					if(isset($_POST['valider']))
					{
						foreach($_POST['id_CA'] as $clef => $id_CA) 
						{
							$requete = 'update tableca set CA="'.mysql_real_escape_string($_POST['CA'][ $clef ]).'" where id_CA='.mysql_real_escape_string($id_CA);
							mysql_query($requete);							
						}
					}
					//On libère la mémoire mobilisée
					mysql_free_result ($req);											
					//On ferme sql
					mysql_close ();
				?>

J'ai essayé de renommer toutes les variables comme il fallait (table en tableca) et tenté avec la casse (quelques majuscules), en vain. Je me demande si l'erreur ne vient pas des noms des inputs.
						echo '<td align=right><input type="text" name="'.$data['CA'].'" value="'.$data['CA'].'"/>'; 
						echo '<input type="hidden" name="'.$data['id_CA'].'" value="'.$data['id_CA'].'"/></td></tr>'; 
--edit:
Dans ma recherche de la Compréhension, je suis revenu à un truc que je comprends: l'index (je ne suis vraiment pas à l'aise avec les $data[machin] en tant que nom d'input.
while ($data = mysql_fetch_array($req)) 
					{ 
						$i=$data['id_CA'];
						echo '<tr><td align=center>'.$data['id_CA'].'</td>';
						echo '<td align=right><input type="text" name="'.$data['CA'].'" value="'.$data['CA'].'"/>'; 
						echo '<input type="hidden" name="'.$i.'" value="'.$data['id_CA'].'"/></td></tr>'; 
					}
					echo '</table>';
					echo '</form>';
					//A la validation
					if(isset($_POST['valider']))
					{
						foreach($_POST[$i] as $clef => $id_CA) 
						{
							$requete = 'update tableca set CA="'.mysql_real_escape_string($_POST['CA'][ $clef ]).'" where id_CA='.mysql_real_escape_string($id_CA);
							mysql_query($requete);							
						}
					}
Je pose donc $i=$data['id_CA'] et je nomme l'input $i. Ensuite j'appelle $_POST[$i] et j'ai une avancée dans le bug.

Code : Tout sélectionner

( ! ) Notice: Undefined index: 15 in C:\wampServer2\www\Entrainement\form.php on line 57 Call Stack # Time Memory Function Location 1 0.0003 99592 {main}( ) ..\form.php:0 ( ! ) Warning: Invalid argument supplied for foreach() in C:\wampServer2\www\Entrainement\form.php on line 57 Call Stack # Time Memory Function Location 1 0.0003 99592 {main}( ) ..\form.php:0
15, c'est le nombre d'entrées dans la base (j'ai essayé avec 16 entrées ça marque 16 dans l'erreur). C'est donc que quelque chose fonctionne dans ce code et que l'erreur est dans le foreach j'imagine. :)

ViPHP
ViPHP | 2577 Messages

18 janv. 2011, 16:22

Bonjour,

Une solution est de mettre pour chaque ligne le CA d'origine, l'id et le CA saisie. tu pourras alors faire une boucle pour détecter les MAJ sans faire d'accès à la base. Pour la maj dans la base, tu peux ajouter dans la condition l'égalité du CA d'origine pour vérifier qu'il n'a pas été changé entre temps en vérifiant le nombre de lignes affectées par ta requête.

Faire modifier, voir afficher un millier de ligne ne me semble pas raisonnable. Il te faudra prévoir une pagination (assez simple avec la clause "limit" de MySQL)

Je préfère une page permettant d'afficher des listes ou un écran de saisie pour une ligne ou une fiche. La modification globale comme tu l'envisages dois être murement réfléchi.

En général, je décompose mon traitement en :
- contrôle des paramètres principaux (action, id)
- aiguillage en fonction des actions demandé (première page, page suivante, creation...) avec appelle à une fonction qui traite l'action
- affichage de l'écran suivant (déterminé par la fonction qui a fait le traitement, affichage d'une liste, d'une fiche ou d'un écran de saisie).

ViPHP
ViPHP | 2577 Messages

18 janv. 2011, 16:34

Si tu ne souhaite pas utiliser de tableau, tu peux utiliser une suite comme ID_0 à ID_16 et CA_0 à CA_16 comme nom de tes zones. Ensuite les valeur sont recupérer avec une boucle for ($i=0;$i<=$nb_ligne;$i++) et prenant $_POST['ID_'.$i) et $_POST['CA_'.$i).

Au passage tu constateras que tu dois ajouter une zone "hidden" avec le nombre de lignes affichées dans le html pour déterminer $nb-ligne

Eléphanteau du PHP | 49 Messages

18 janv. 2011, 16:39

Une solution est de mettre pour chaque ligne le CA d'origine, l'id et le CA saisie. tu pourras alors faire une boucle pour détecter les MAJ sans faire d'accès à la base.
Je ne comprends pas, n'est-ce pas l'utilité même du foreach qu'on m'a proposé deux posts plus hauts ?
Là du coup je suis perdu. Est-ce que quelqu'un peut parcourir mon code et corriger ce qu'il faut corriger pour que le foreach fonctionne s'il vous plait ?

Je verrais pour la pagination et autres "cosmétiques" plus tard. Là j'essaye de voir à faire fonctionner mon code. :)

Je pense que mon problème vient du fait que j'ai un tableau qui s'affiche correctement, je peux le modifier mais je ne sais pas comment faire appel aux modifications effectuées (comment les comparer ligne par ligne ou simplement comment afficher "vous avez changé la ligne 4, 5 et 9"). Foreach sembe tout indiqué mais je ne comprends pas l'erreur qu'il me sort (undefined index et invalid argument, cf l'édit de mon précédent post).

--edit:
Par exemple avec ce code là:
<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableca';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<form method="post">';
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					while ($data = mysql_fetch_array($req)) 
					{ 
						$oldCA=$data['CA'];
						$newCA=$data['CA'];
						$i=$data['id_CA'];
						echo '<tr><td align=center>'.$data['id_CA'].'</td>';
						echo '<td align=right><input type="text" name="'.$newCA.'" value="'.$data['CA'].'"/>'; 
						echo '<input type="hidden" name="'.$oldCA.'" value="'.$data['CA'].'"/>'; 
						echo '<input type="hidden" name="'.$i.'" value="'.$data['id_CA'].'"/></td></tr>';
					}
					echo '</table>';
					echo '</form>';
					//A la validation
					if(isset($_POST['valider']))
					{
						echo $_POST[$newCA];
						echo $_POST[$oldCA];
						echo $_POST[$i];
					}
					//On libère la mémoire mobilisée
					mysql_free_result ($req);											
					//On ferme sql
					mysql_close ();
				?>
Les 3 echo $_POST[$newCA]; echo $_POST[$oldCA]; echo $_POST[$i]; ne retournent rien, j'ai trois erreurs:

Code : Tout sélectionner

( ! ) Notice: Undefined index: 0 in C:\wampServer2\www\Entrainement\form.php on line 60 Call Stack # Time Memory Function Location 1 0.0006 98840 {main}( ) ..\form.php:0 ( ! ) Notice: Undefined index: 0 in C:\wampServer2\www\Entrainement\form.php on line 61 Call Stack # Time Memory Function Location 1 0.0006 98840 {main}( ) ..\form.php:0 ( ! ) Notice: Undefined index: 15 in C:\wampServer2\www\Entrainement\form.php on line 62 Call Stack # Time Memory Function Location 1 0.0006 98840 {main}( ) ..\form.php:0
Alors que si j'ai bien compris -ce dont je doute- ils devraient afficher la dernière entrée (vu que je ne précise pas quel $_POST je veux).

--edit2: Désolé j'édite souvent.
J'ai résolu le problème ci-dessus. J'avais placé deux formulaires (l'un contenant le bouton de validation et l'autre contenant le tableau) alors qu'il semble n'en falloir qu'un.
Je reste bloqué au niveau du foreach cependant.
Modifié en dernier par diday le 18 janv. 2011, 16:55, modifié 1 fois.

ViPHP
ViPHP | 2577 Messages

18 janv. 2011, 16:54

...
...
                                        echo '<td width=300><center><strong>CA</strong></center></td>';
                                        $i = 0; // ajout 
                                        while ($data = mysql_fetch_array($req))
                                        {
                                                $oldCA=$data['CA'];
                                                $newCA=$data['CA'];
                                                //$i=$data['id_CA']; <- modif
                                                echo '<tr><td align=center>'.$data['id_CA'].'</td>';
                                                echo '<td align=right><input type="text" name="N_CA_'.$i.'" value="'.$data['CA'].'"/>';
                                                echo '<input type="hidden" name="O_CA_.$i'.'" value="'.$data['CA'].'"/>';
                                                echo '<input type="hidden" name="ID_'.$i.'" value="'.$data['id_CA'].'"/></td></tr>';
                                                £i++; // ajout
                                        }
                                        echo '</table>';
                                        echo '</form>';
                                        //A la validation
                                        if(isset($_POST['valider']))
                                        {
                                               for (£i=0;$i<16;$i++)       // (remplacer 16 plus tard)
                                               {
                                                echo $_POST['N_CA_'.$i];
                                                echo $_POST['O_CA_'.$i];
                                                echo $_POST['ID_'.$i];
                                               }
                                        }
                                        //On libère la mémoire mobilisée
                                        mysql_free_result ($req);                                                                                      
                                        //On ferme sql
                                        mysql_close ();
                                ?>
Ca doit te permettre de comprendre.

Eléphanteau du PHP | 49 Messages

18 janv. 2011, 17:15

Super merci beaucoup!

Ton code comporte quelques petites coquilles (bon je préviens juste pour la forme, hein, no offense) mais il m'a permis de saisir le truc et surtout de faire fonctionner le changement de champ (yipee!).
Voilà le code actuel:
				<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableca';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					$i=1; // ajout
					while ($data = mysql_fetch_array($req))
					{
							$oldCA=$data['CA'];
							$newCA=$data['CA'];
							echo '<tr><td align=center>'.$data['id_CA'].'</td>';
							echo '<td align=right><input type="text" name="N_CA_'.$i.'" value="'.$data['CA'].'"/>';
							echo '<input type="hidden" name="O_CA_'.$i.'" value="'.$data['CA'].'"/>';
							echo '<input type="hidden" name="ID_'.$i.'" value="'.$data['id_CA'].'"/></td></tr>';
							$i++; // ajout
					}
					echo '</table>';
					echo '</form>';
					//A la validation
					if(isset($_POST['valider']))
					{
					   for ($i=1;$i<16;$i++)       // (remplacer 16 plus tard)
					   {
							if ($_POST['N_CA_'.$i]!=$_POST['O_CA_'.$i])
							{
								$CA=$_POST['N_CA_'.$i];
								$req = "UPDATE tableca SET CA='$CA' WHERE id_CA='$i'";
								mysql_query($req) or die ('Erreur sur : '.$req.'<br/>'.mysql_error());
							}
						}
					}
				?>
Il me reste quelques petits problèmes que je vais tenter de régler par moi-même:
- mysql_free_result ($req); renvoie une erreur
- le tableau n'est pas mis à jour automatiquement après validation (il garde l'ancienne valeur)

ViPHP
ViPHP | 2577 Messages

18 janv. 2011, 17:31

Tu affiches le tableau avant de faire les mises à jour dans la table :p
Je ne suis pas vexé, je fait toujours des erreurs ; d'ailleurs je pense que tu as les qualité pour arriver à quelque chose en PHP.

Eléphanteau du PHP | 49 Messages

18 janv. 2011, 17:37

Et bien j'ai réussi aujourd'hui grâce à vous en tout cas. :)

Pour ceux que ça intéresse, voici le code final:
index2.php
<html>
	<head>
		<title>Test mod tableau clic</title>
	</head>
	<body>	
		<link rel="STYLESHEET" type="text/css" media="all" href="style.css"/>
	
		<div id="global">
		
			<div id="header"> 		
			<?php
				//On créé une fonction de connection à la base
				function connecttest_CA(){
					$base = mysql_connect ('localhost', 'root', '');  
					mysql_select_db ('test_ca', $base) ;
				}		
			?>
			</div>
	
	<!-- Menu fixe gauche (édition des règles de gestion) ##WIP## -->
			<div id="gauche">
				<h1>Edition</h1> 
				<p class="menu">Règles gestion</p>
				<form name="update" method="post" action="form.php">
					<p class="menu"><input type="submit" name="modifier" value="Modifier"/></p>
				</form>
				<!-- On créé un formulaire permettant d'éditer la table-->
			</div>
	<!-- Fin Menu fixe gauche -->

	<!-- Page_Principale -->
			<div id="page_principale">
				<br />
				<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableCA';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					$i=0; //on initialise l'index 
					while ($data = mysql_fetch_array($req)) { 
						echo '<tr><td align=center>'.$data['id_CA'].'</td>'; 
						echo '<td align=right>'.$data['CA'].'</td>';  
						$i++;// on incrémente l'index
					}
					echo '</table>';
					//On libère la mémoire mobilisée pour cette requête dans sql
					//$data de PHP lui est toujours accessible !
					mysql_free_result ($req);											
					//On ferme sql
					mysql_close ();
				?>
			</div>
	<!-- Fin Page_Principale -->
		</div>
	</body>
</html>
form.php
<html>
	<head>
		<title>Test mod tableau clic</title>
	</head>
	<body>	
		<link rel="STYLESHEET" type="text/css" media="all" href="style.css"/>
	
		<div id="global">
		
			<div id="header"> 		
			<?php
				//On créé une fonction de connection à la base
				function connecttest_CA(){
					$base = mysql_connect ('localhost', 'root', '');  
					mysql_select_db ('test_ca', $base) ;
				}		
			?>
			</div>
	
	<!-- Menu fixe gauche (édition des règles de gestion) ##WIP## -->
			<div id="gauche">
				<h1>Edition</h1> 
				<p class="menu">Règles gestion</p>
				<!-- On créé un formulaire permettant d'éditer la table-->
				<form name="update" method="post" action="form.php?form">
					<p class="menu"><input type="submit" name="valider" value="Valider" /></p>
			</div>
	<!-- Fin Menu fixe gauche -->

	<!-- Page_Principale -->
			<div id="page_principale">
				<br />
				<?php
					//On se connecte
					connecttest_CA();
					//On selectionne la table
					$sql = 'SELECT * FROM tableca';
					$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
					//On affiche les champs et paramètres de la table sous forme de tableau
					echo '<table border=1 cellpadding=5><tr bgcolor=#DDDDDD>';
					echo '<td width=15><center><strong>id</strong></center></td>';
					echo '<td width=300><center><strong>CA</strong></center></td>';
					$i=1; // ajout
					while ($data = mysql_fetch_array($req))
					{
							$oldCA=$data['CA'];
							$newCA=$data['CA'];
							echo '<tr><td align=center>'.$data['id_CA'].'</td>';
							echo '<td align=right><input type="text" name="N_CA_'.$i.'" value="'.$data['CA'].'"/>';
							echo '<input type="hidden" name="O_CA_'.$i.'" value="'.$data['CA'].'"/>';
							echo '<input type="hidden" name="ID_'.$i.'" value="'.$data['id_CA'].'"/></td></tr>';
							$i++; // ajout
					}
					echo '</table>';
					echo '</form>';
					$max_ID=$i-1;
					//A la validation
					if(isset($_POST['valider']))
					{
					   for ($i=1;$i<$max_ID;$i++)
					   {
							if ($_POST['N_CA_'.$i]!=$_POST['O_CA_'.$i])
							{
								$CA=$_POST['N_CA_'.$i];
								$req = "UPDATE tableca SET CA='$CA' WHERE id_CA='$i'";
								mysql_query($req) or die ('Erreur sur : '.$req.'<br/>'.mysql_error());
							}
						}
						header('Refresh: 0; url=index2.php');
					}                        
					//On ferme sql
					mysql_close ();
				?>
			</div>
	<!-- Fin Page_Principale -->
		</div>
	</body>
</html>
Ce code affiche en tableau les valeurs de tableca, proposer de les modifier par un bouton à gauche, permet de modifier n'importe quel CA du tableau et ensuite actualise après validation pour revenir sur la première page (sans les formulaires sur chaque CA).
Je les mets en ligne parce que je suis trop souvent tombé sur des mecs qui posent la même question que moi sur le net et qui terminent deux mois après "ah oui non j'ai trouvé" sans expliquer ce qu'ils ont fait. ^^

Je dois mettre en place un site d'upload de CA pour commissionner les commerciaux d'une grande banque. J'ai pas fini de venir poster ici je sens.

Merci beaucoup pour le service rapide et efficace.
Vous me faites terminer à 30 minutes de la fin de journée, c'est magique.

Bonne soirée à tous.

geniprogramme
Invité n'ayant pas de compte PHPfrance

03 mai 2011, 12:15

Merci de m'aider a ce propos j'arrive pas a realiser ce meme probléme de modification d'une cellele de la table pour plusieurs lignes est ce possible de reposter le dernier code qui marche avec le commentaires sur les varriables Merci d'avance