Récupérer les valeurs d'input type text aléatoires

Eléphanteau du PHP | 21 Messages

17 mai 2012, 11:25

Bonjour,
J'ai un formulaire qui génère autant d'input type text que de lignes existantes dans une table de ma base de données.
Dans ces inputs type text sont affichés les numéros respectifs de la colonne "numéro" de la BDD.
Le but est de pouvoir actualiser les numéros, et accessoirement changer l'ordre d'affichage des projets de la base de données, en renvoyant le formulaire.

Le problème est que je n'arrive pas à récupérer les valeurs des inputs type text, et actualiser la BDD quand ces valeurs sont aléatoires.
<?php
		
$sql = 'SELECT * FROM projets ORDER BY numero ASC';
$req = mysql_query($sql) or die(mysql_error());

echo '<form method="post" action="page.php?action=changer-ordre">';
		
while($data = mysql_fetch_assoc($req)) { 
echo '<input type="text" name="'.$data['nom'].'" value="'.$data['numero'].'" size="1"/> '.$data['nom'].' ' ;
} 

echo '<input type="submit" value="changer-ordre"/></form>';

?>
Les noms des input type text changent en fonction des noms de la table de la BDD.
J'ai besoin de récupérer les valeurs des inputs pour qu'ils remplacent la valeur existante de la colonne numéro de la BDD.
Auriez vous une piste pour m'aider à automatiser tout ça ?


D'habitude pour récupérer les données j'utilise extract($_POST); et je fais passer un $id dans l'url :
<?php
if(isset($_GET['id']))
{
$id = intval(htmlentities($_GET['id']));

if(isset($_POST['nom']) AND isset($_POST['numero'])){
				
extract($_POST);
$nom = addslashes(htmlentities($nom));
$numero = addslashes(htmlentities($numero));
				
$sql = 'UPDATE projetype SET nom="'.$nom.'", numero="'.$numero.'" WHERE id='.$id.'';
$req = mysql_query($sql) or die(mysql_error());
 }
 }
?>
Merci.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

19 mai 2012, 13:42

C'est simple, il faut inclure dans le formulaire des champs cachés portant chacun le nom du projet à modifier. Le problème dans ton code est que tu nommes la zone de texte du numéro avec le nom du projet, se qui rend problématique la récupération du nom du projet après le postage. Voici don comment procéder avec simplicité:
1. Le formulaire doit proposer à chaque ligne projet une zone de texte (<input type="text") où modifier le n°du projet pour un projet donné. De ce fait, le n°du projet sera représenté par une zone input ayant comme nom "numProjet" et une zone cachée (<input type="hidden") portant l'id unique du projet ayant comme nom "idProjet". Cette dernière zone sert à repérer le projet par id (clé primaire) lors des mises à jour des numéros modifiés.

2. Puisqu'il y aura plusieurs lignes affichées où chaque ligne concerne un projet et que chaque ligne sera configurée comme l'indique l'étape 1, alors il faut absolument transformer les noms des zones input et des zones cachées sous un format de tableau en y ajoutant la terminaison [] (double-crochés) qui permet à PHP de lire les variables $numProjet et $idProjet comme des tableaux.

Voici donc la correction de ton code dans ce sens:
<?php
               
$sql = 'SELECT * FROM projets ORDER BY numero ASC';
$req = mysql_query($sql) or die(mysql_error());

echo '<form method="post" action="page.php">';

//afficher toutes les lignes projets (l'id est une donnée cachée pour servir de clé d'accès pour les requêtes SQL)
while($data = mysql_fetch_assoc($req)) {
  echo '<input type="text"     name="numProjet[]"  value="'.$data['numero'].'" size="1"/> '.$data['nom'].' ' ;
  echo '<input type="hidden"        name="idProjet[]"  value="'.$data['id'].'"/>';
}

echo '<input type="submit" name="action" value="changer-ordre"/></form>';

?>
Programme de mise à jour: page.php
<?php
if( isset($_POST['action']) && $_POST['action']=='changer-ordre'  && isset($_POST['idProjet']) && isset($_POST['numProjet']) ){
                               
// extract($_POST); // éviter cette commande pour des raisons de sécurité (injection externe)
// déclarer les variables du programme (bonne habitude)
$idProjet =$_POST['idProjet']; //tableau des id des projets
$numProjet = $_POST['numProjet']; //tableau des numéros de projets

//lancer la mise à jour  des projets 
if (is_array($idProjet)) foreach($idProjet as $index=>$id) //parcourir les id par index de tableau
{
   if (isset($numProjet[$index])) //si l'index de l'id projet lui correspond le même index dans le tableau des numéros
   {
        $numero = $numProjet[$index];
        $sql = "UPDATE projetype SET numero='".$numero."' WHERE id='".$id."'"; //modifier le numéro pour l'id projet : $id
        $req = mysql_query($sql) or die(mysql_error());
   }
 }
 }
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène